<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_逖靖寒的世界</title><subtitle type="text">每天进步一点点</subtitle><id>http://feed.cnblogs.com/blog/u/24052/rss</id><updated>2011-08-16T11:18:52Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/24052/rss"/><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/07/05/2097996.html</id><title type="text">关于HFile的思考</title><summary type="text">0.90.x版本的HBase中的文件是存储在HFile中的。关于HFile文件的详细介绍，可以查看这篇文章：http://www.data-works.org/download/hfile.pdf这篇文章中介绍了以下五点内容：HFile的作用。HFile的格式。HFile的性能。HFile的使用注意事项。HFile的编程接口。HFile中有一个很重要的参数，那就是block size。如果我们写入hfile中的某一个value的值大于block size会怎么样？于是有如下的测试代码： 1: // create local file system 2: FileSystem fs = new </summary><published>2011-07-05T02:01:00Z</published><updated>2011-07-05T02:01:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/07/05/2097996.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/07/05/2097996.html"/><content type="html">&lt;div class="entry"&gt;&lt;p&gt;0.90.x版本的HBase中的文件是存储在HFile中的。&lt;/p&gt;&lt;p&gt;关于HFile文件的详细介绍，可以查看这篇文章：&lt;a title="http://www.data-works.org/download/hfile.pdf" href="http://www.data-works.org/download/hfile.pdf"&gt;http://www.data-works.org/download/hfile.pdf&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这篇文章中介绍了以下五点内容：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;HFile的作用。&lt;/li&gt;&lt;li&gt;HFile的格式。&lt;/li&gt;&lt;li&gt;HFile的性能。&lt;/li&gt;&lt;li&gt;HFile的使用注意事项。&lt;/li&gt;&lt;li&gt;HFile的编程接口。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span id="more-399"&gt;&lt;/span&gt;HFile中有一个很重要的参数，那就是block size。如果我们写入hfile中的某一个value的值大于block size会怎么样？&lt;/p&gt;&lt;p&gt;于是有如下的测试代码：&lt;/p&gt;&lt;div class="csharpcode"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// create local file system&lt;/span&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;FileSystem fs = &lt;span class="kwrd"&gt;new&lt;/span&gt; RawLocalFileSystem();&lt;span class="lnum"&gt;   3:  &lt;/span&gt;fs.setConf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Configuration());&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="rem"&gt;// block size = 1kb&lt;/span&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;HFile.Writer hwriter = &lt;span class="kwrd"&gt;new&lt;/span&gt; HFile.Writer(fs,&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Path(&lt;span class="str"&gt;"hfile"&lt;/span&gt;), 1, (Compression.Algorithm) &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="rem"&gt;// create key &amp;amp; value, the value is 8kb, larger than 1kb&lt;/span&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] key = &lt;span class="str"&gt;"www.data-works.org"&lt;/span&gt;.getBytes();&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[8 * 1024];&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 8 * 1024; i++) {&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;value&lt;/span&gt;[i] = &lt;span class="str"&gt;'0'&lt;/span&gt;;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;}&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&lt;span class="rem"&gt;// add values to hfile&lt;/span&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10; i++) {&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    hwriter.append(key, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;&lt;span class="rem"&gt;// close hfile&lt;/span&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;hwriter.close();&lt;/div&gt;&lt;p&gt;上面的代码可以看出来，每一个value的值都是8kb，已经超过了hfile预设的1kb的block size。&lt;/p&gt;&lt;p&gt;实际的写入情况是如果value大于block size，那么就按照实际的情况来写。&lt;/p&gt;&lt;p&gt;上面的测试用例执行完毕以后，整个hile文件只有1个data block。&lt;/p&gt;&lt;p&gt;这个hfile的读取代码如下：&lt;/p&gt;&lt;div class="csharpcode"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// create local file system&lt;/span&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;FileSystem fs = &lt;span class="kwrd"&gt;new&lt;/span&gt; RawLocalFileSystem();&lt;span class="lnum"&gt;   3:  &lt;/span&gt;fs.initialize(URI.create(&lt;span class="str"&gt;"file:///"&lt;/span&gt;), &lt;span class="kwrd"&gt;new&lt;/span&gt; Configuration());&lt;span class="lnum"&gt;   4:  &lt;/span&gt;fs.setConf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Configuration());&lt;span class="lnum"&gt;   5:  &lt;/span&gt;HFile.Reader hreader = &lt;span class="kwrd"&gt;new&lt;/span&gt; HFile.Reader(fs,&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Path(&lt;span class="str"&gt;"hfile"&lt;/span&gt;), &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="rem"&gt;// loadFileInfo&lt;/span&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;hreader.loadFileInfo();&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;HFileScanner hscanner = hreader.getScanner(&lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&lt;span class="rem"&gt;// seek to the start position of the hfile.&lt;/span&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;hscanner.seekTo();&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&lt;span class="rem"&gt;// print values.&lt;/span&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; index = 1;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; (hscanner.next()) {&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    System.&lt;span class="kwrd"&gt;out&lt;/span&gt;.println(&lt;span class="str"&gt;"index: "&lt;/span&gt; + index++);&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    System.&lt;span class="kwrd"&gt;out&lt;/span&gt;.println(&lt;span class="str"&gt;"key: "&lt;/span&gt; + hscanner.getKeyString());&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    System.&lt;span class="kwrd"&gt;out&lt;/span&gt;.println(&lt;span class="str"&gt;"value: "&lt;/span&gt; + hscanner.getValueString());&lt;span class="lnum"&gt;  22:  &lt;/span&gt;}&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&lt;span class="rem"&gt;// close hfile.&lt;/span&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;hreader.close();&lt;/div&gt;&lt;p&gt;上面的代码将读取hfile，并将这个文件中的所有kv打印出来。&lt;/p&gt;&lt;p&gt;通过上面的测试可以看出：如果某一个key有非常非常多的value，那么查找这些value就无法通过索引去快速查找，而是需要通过遍历进行。&lt;/p&gt;&lt;p&gt;另外，JIRA上面的&lt;a id="key-val" rel="12506311" href="https://issues.apache.org/jira/browse/HBASE-3857"&gt;HBASE-3857&lt;/a&gt;也提出了一种新的HFile格式，HFile v2&lt;/p&gt;&lt;p&gt;他主要是针对现有HFile的两个主要缺陷提出来的：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;暂用过多内存&lt;/li&gt;&lt;li&gt;启动加载时间缓慢&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;有兴趣的朋友可以详细了解一下。&lt;/p&gt;&lt;p&gt;更多关于HBase方面的文章，请参考：&lt;a href="http://blog.data-works.org/"&gt;http://blog.data-works.org&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/2097996.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/07/05/2097996.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/06/18/2084154.html</id><title type="text">《Cassandra实战》CassSeller程序源代码下载</title><summary type="text">下载地址：Windows版本http://www.data-works.org/download/casssellersrc-windows.zipmac版本http://www.data-works.org/download/casssellersrc.zip本目录中CassSeller对应的是Cassandra-0.6.x版本的代码CassSeller-0.7对应的是Cassandra-0.7.x版本的代码对于Cassandra-0.6.x版本，打开conf/storage-conf.xml文件，在Keyspace配置项中，新添加一个Keyspace的配置信息，内容如下：&lt;Keysp</summary><published>2011-06-18T03:34:00Z</published><updated>2011-06-18T03:34:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/06/18/2084154.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/06/18/2084154.html"/><content type="html">&lt;div class="entry"&gt;&lt;p&gt;下载地址：&lt;/p&gt;&lt;p&gt;Windows版本&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.data-works.org/download/casssellersrc-windows.zip"&gt;http://www.data-works.org/download/casssellersrc-windows.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;mac版本&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.data-works.org/download/casssellersrc.zip"&gt;http://www.data-works.org/download/casssellersrc.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;本目录中&lt;br /&gt;CassSeller对应的是Cassandra-0.6.x版本的代码&lt;br /&gt;CassSeller-0.7对应的是Cassandra-0.7.x版本的代码&lt;span id="more-389"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;对于Cassandra-0.6.x版本，打开conf/storage-conf.xml文件，在Keyspace配置项中，新添加一个Keyspace的配置信息，内容如下：&lt;br /&gt;&amp;lt;Keyspace Name=&amp;rdquo;CassSeller&amp;rdquo;&amp;gt;&lt;br /&gt;&amp;lt;ColumnFamily Name=&amp;rdquo;Seller&amp;rdquo;&lt;br /&gt;CompareWith=&amp;rdquo;UTF8Type&amp;rdquo; /&amp;gt;&lt;br /&gt;&amp;lt;ColumnFamily Name=&amp;rdquo;Buyer&amp;rdquo;&lt;br /&gt;CompareWith=&amp;rdquo;UTF8Type&amp;rdquo; /&amp;gt;&lt;br /&gt;&amp;lt;ColumnFamily Name=&amp;rdquo;ProductCategory&amp;rdquo;&lt;br /&gt;CompareWith=&amp;rdquo;TimeUUIDType&amp;rdquo; /&amp;gt;&lt;br /&gt;&amp;lt;ColumnFamily Name=&amp;rdquo;Product&amp;rdquo;&lt;br /&gt;CompareWith=&amp;rdquo;UTF8Type&amp;rdquo; /&amp;gt;&lt;br /&gt;&amp;lt;ColumnFamily Name=&amp;rdquo;Comment&amp;rdquo;&lt;br /&gt;ColumnType=&amp;rdquo;Super&amp;rdquo;&lt;br /&gt;CompareWith=&amp;rdquo;TimeUUIDType&amp;rdquo;&lt;br /&gt;CompareSubcolumnsWith=&amp;rdquo;UTF8Type&amp;rdquo;/&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;ReplicaPlacementStrategy&amp;gt;org.apache.cassandra.locator.RackUnawareStrategy&amp;lt;/ReplicaPlacementStrategy&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;ReplicationFactor&amp;gt;1&amp;lt;/ReplicationFactor&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;EndPointSnitch&amp;gt;org.apache.cassandra.locator.EndPointSnitch&amp;lt;/EndPointSnitch&amp;gt;&lt;br /&gt;&amp;lt;/Keyspace&amp;gt;&lt;br /&gt;编辑完成后，保存并重新启动Cassandra。&lt;/p&gt;&lt;p&gt;对于Cassandra-0.7.x版本，CassSeller-0.7代码中已经包含了修改Cassandra Schema的逻辑，所以无需做任何修改即可执行。&lt;/p&gt;&lt;p&gt;更多关于《Cassandra实战》的信息请关注：&lt;br /&gt;&lt;a href="http://blog.data-works.org/"&gt;http://blog.data-works.org&lt;/a&gt;&lt;br /&gt;如果希望交流Cassandra方面问题，可以关注：&lt;br /&gt;&lt;a href="http://bbs.data-works.org/"&gt;http://bbs.data-works.org&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/2084154.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/06/18/2084154.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/04/24/2026255.html</id><title type="text">注意你的hosts文件--记一次HBase问题定位</title><summary type="text">最近在测试HBase时遇到一个非常奇怪的问题：集群有7台机器，其中1台Master，6台RegionServer。但是Master只能控制其中1台RegionServer，而无法控制其他5台RegionServer。打开master的日志文件，发现以下错误信息：2011-04-22 16:37:21,242 WARN org.apache.hadoop.hbase.master.AssignmentManager: Failed assignment of -ROOT-,,0.70236052 to serverName=hp2,60020,1303461559353, load=(reque</summary><published>2011-04-24T07:34:00Z</published><updated>2011-04-24T07:34:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/04/24/2026255.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/04/24/2026255.html"/><content type="html">&lt;p&gt;最近在测试HBase时遇到一个非常奇怪的问题：集群有7台机器，其中1台Master，6台RegionServer。但是Master只能控制其中1台RegionServer，而无法控制其他5台RegionServer。&lt;/p&gt;&lt;p&gt;打开master的日志文件，发现以下错误信息：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;2011-04-22 16:37:21,242 WARN org.apache.hadoop.hbase.master.AssignmentManager: Failed assignment of -ROOT-,,0.70236052 to serverName=hp2,60020,1303461559353, load=(requests=0, regions=0, usedHeap=28, maxHeap=3979), trying to assign elsewhere instead; retry=0     &lt;br /&gt;org.apache.hadoop.hbase.client.RetriesExhaustedException: &lt;span style="color: #ff0000;" color="#ff0000"&gt;Failed setting up proxy interface org.apache.hadoop.hbase.ipc.HRegionInterface to /10.131.18.3:60020&lt;/span&gt; after attempts=1      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseRPC.waitForProxy(HBaseRPC.java:355)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getHRegionConnection(HConnectionManager.java:965)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.ServerManager.getServerConnection(ServerManager.java:606)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.ServerManager.sendRegionOpen(ServerManager.java:541)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.AssignmentManager.assign(AssignmentManager.java:920)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.AssignmentManager.assign(AssignmentManager.java:730)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.AssignmentManager.assign(AssignmentManager.java:710)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.AssignmentManager.assignRoot(AssignmentManager.java:1189)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.HMaster.assignRootAndMeta(HMaster.java:432)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.java:389)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:283)      &lt;br /&gt;Caused by: java.net.ConnectException: Connection refused      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:574)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:408)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.setupIOstreams(HBaseClient.java:328)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:883)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:750)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseRPC$Invoker.invoke(HBaseRPC.java:257)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at $Proxy7.getProtocolVersion(Unknown Source)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:419)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:393)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:444)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseRPC.waitForProxy(HBaseRPC.java:349)      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... 10 more&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;在这个日志中，master机器无法与IP地址为10.131.18.3的regionserver进行通信。&lt;/p&gt;&lt;p&gt;然后找到10.131.18.3机器，查看这台机器的regionserver日志，查看regionserver的启动信息：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 10 on 60020: starting     &lt;br /&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 11 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 12 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 13 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 14 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 15 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 16 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,122 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 17 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 18 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 19 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 0 on 60020: starting2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 1 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 2 on 60020: starting2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 3 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 4 on 60020: starting2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 5 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,123 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 6 on 60020: starting2011-04-14 18:32:05,124 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 7 on 60020: starting      &lt;br /&gt;2011-04-14 18:32:05,124 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 8 on 60020: starting2011-04-14 18:32:05,124 INFO org.apache.hadoop.ipc.HBaseServer: PRI IPC Server handler 9 on 60020: starting2011-04-14 18:32:05,124 INFO org.apache.hadoop.hbase.regionserver.HRegionServer: Serving as dell4,60020,1302777124101, &lt;span style="color: #ff0000;" color="#ff0000"&gt;RPC listening on /127.0.0.1:60020&lt;/span&gt;, sessionid=0x12f535856620004&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;可以看出，这台regionserver机器启动成功了，但是RPC的监听ip地址却是本机的地址（127.0.0.1）。这样的话，master机器就无法与这台regionserver正常通信了，正确的监听地址应该是10.131.18.3才对。&lt;/p&gt;&lt;p&gt;查看代码，RPC监听地址的代码如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;/** @return Bind address */     &lt;br /&gt;&amp;nbsp; public String getBindAddress() {      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; final InetAddress addr = address.getAddress();      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (addr != null) {      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return addr.getHostAddress();      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LogFactory. getLog(HServerAddress.class).error( "Could not resolve the"      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + " DNS name of " + stringValue );      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br /&gt;&amp;nbsp; }&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;代码没有错，看来是机器的某些配置导致java读取本机的ip地址出现了错误。最后查看这台机器的hosts文件：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;[hadoop@hp2 logs]$ vi /etc/hosts     &lt;br /&gt;# Do not remove the following line, or various programs      &lt;br /&gt;# that require network functionality will fail.      &lt;br /&gt;127.0.0.1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff0000;" color="#ff0000"&gt;hp2&lt;/span&gt; localhost.localdomain localhost      &lt;br /&gt;::1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localhost6.localdomain6 localhost6      &lt;br /&gt;10.131.18.8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell1      &lt;br /&gt;10.131.18.5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell2      &lt;br /&gt;10.131.18.6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell3      &lt;br /&gt;10.131.18.7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell4      &lt;br /&gt;10.131.18.2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hp1      &lt;br /&gt;10.131.18.3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hp2      &lt;br /&gt;10.131.18.4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hp3&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;问题找到了，其实是hosts文件的配置原因，接下来修改hosts文件为如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;# Do not remove the following line, or various programs     &lt;br /&gt;# that require network functionality will fail.      &lt;br /&gt;127.0.0.1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localhost.localdomain localhost      &lt;br /&gt;::1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localhost6.localdomain6 localhost6      &lt;br /&gt;10.131.18.8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell1      &lt;br /&gt;10.131.18.5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell2      &lt;br /&gt;10.131.18.6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell3      &lt;br /&gt;10.131.18.7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dell4      &lt;br /&gt;10.131.18.2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hp1      &lt;br /&gt;10.131.18.3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hp2      &lt;br /&gt;10.131.18.4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hp3&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;再次启动整个集群，问题解决。&lt;/p&gt;&lt;p&gt;更多关于HBase的文章，可以参考：&lt;a title="http://www.cnblogs.com/gpcuster/tag/HBase/" href="http://www.cnblogs.com/gpcuster/tag/HBase/"&gt;http://www.cnblogs.com/gpcuster/tag/HBase/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/2026255.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/04/24/2026255.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/04/12/2013411.html</id><title type="text">HADOOP实践101：在Hadoop集群中添加机器和删除机器</title><summary type="text">无论是在Hadoop集群中添加机器和删除机器，都无需停机，整个服务不中断。本次操作之前，Hadoop的集群情况如下：HDFS的机器情况如下：MR的机器情况如下：添加机器在集群的Master机器中，修改$HADOOP_HOME/conf/slaves文件，在其中添加需要加入集群的新机器（hp3）的主机名：hp3hp2dell1dell2dell3dell4然后在Master机器中执行如下命令： $HADOOP_HOME/bin/start-all.sh这样操作完成之后，新的机器就添加到集群中来了。 HDFS集群增加了一台新的机器： MR集群中也新增了一台机器： 删除机器不安全的方式由于Hadoo</summary><published>2011-04-12T03:02:00Z</published><updated>2011-04-12T03:02:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/04/12/2013411.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/04/12/2013411.html"/><content type="html">&lt;p&gt;无论是在Hadoop集群中添加机器和删除机器，都无需停机，整个服务不中断。&lt;/p&gt;&lt;p&gt;本次操作之前，Hadoop的集群情况如下：&lt;/p&gt;&lt;p&gt;HDFS的机器情况如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102132134.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="[$%7O6{)LM1M[~W15O4JOVC" alt="[$%7O6{)LM1M[~W15O4JOVC" src="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102135199.jpg" border="0" width="244" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;MR的机器情况如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121103544577.jpg"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="K0%4$0K9YISIGZ$W]0V(_G8" alt="K0%4$0K9YISIGZ$W]0V(_G8" src="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121103541230.jpg" border="0" width="316" height="150" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;添加机器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在集群的Master机器中，修改$HADOOP_HOME/conf/slaves文件，在其中添加需要加入集群的新机器（hp3）的主机名：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;span style="color: #800000;" color="#800000"&gt;hp3&lt;br /&gt;&lt;/span&gt;hp2&lt;br /&gt;dell1&lt;br /&gt;dell2&lt;br /&gt;dell3&lt;br /&gt;dell4&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;然后在Master机器中执行如下命令： &lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;$HADOOP_HOME/bin/start-all.sh&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这样操作完成之后，新的机器就添加到集群中来了。 &lt;/p&gt;&lt;p&gt;HDFS集群增加了一台新的机器： &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102142757.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="819BH7[D$EREKMB8D_WJBSU" alt="819BH7[D$EREKMB8D_WJBSU" src="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102147773.jpg" border="0" width="220" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;MR集群中也新增了一台机器： &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102145614.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="Q5CV$04(6({R8ZTJJ$FW_T7" alt="Q5CV$04(6({R8ZTJJ$FW_T7" src="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102144218.jpg" border="0" width="244" height="118" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;删除机器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;不安全的方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于Hadoop集群自身具备良好的容错性，可以直接关闭相应的机器，从而达到将该机器撤除的目的。但是如果一次性操作3台以上的机器，就有可能造成部分数据丢失，所以不推荐使用这种方式进行操作。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;安全的方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在集群的Master机器中，新建一个文件：$HADOOP_HOME/conf/nn-excluded-list，在这个文件中指定需要删除的机器主机名（hp3）： &lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;hp3&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;然后，修改Master机器的配置文件：$HADOOP_HOME/conf/hdfs-site.xml，添加如下内容： &lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;lt;property&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;name&amp;gt;dfs.hosts.exclude&amp;lt;/name&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;value&amp;gt;conf/nn-excluded-list&amp;lt;/value&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/property&amp;gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;最后，在Master机器中执行如下命令： &lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;$HADOOP_HOME/bin/hadoop dfsadmin -refreshNodes&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这样操作完成之后，可以在HDFS集群中看到，hp3机器已经处于Decommission In Progress状态：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102149791.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="C1X8DJ7(]I48C}{@(JOIPTD" alt="C1X8DJ7(]I48C}{@(JOIPTD" src="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102154808.jpg" border="0" width="244" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;但是MR机器中hp3机器依旧在运行中：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102145614.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="Q5CV$04(6({R8ZTJJ$FW_T7" alt="Q5CV$04(6({R8ZTJJ$FW_T7" src="http://images.cnblogs.com/cnblogs_com/gpcuster/201104/201104121102144218.jpg" border="0" width="244" height="118" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们需要等待一定的时间，等待hp3中datanode的Decommission操作完成以后，再到hp3机器中关闭所有的Hadoop进程即可。&lt;/p&gt;&lt;p&gt;这样就完成了整个从集群中删除机器的操作。&lt;/p&gt;&lt;p&gt;更多关于Hadoop的文章，可以参考：http://www.cnblogs.com/gpcuster/tag/Hadoop/&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/2013411.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/04/12/2013411.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/03/01/1968027.html</id><title type="text">利用Sqoop将数据从数据库导入到HDFS</title><summary type="text">基本使用如下面这个shell脚本：#Oracle的连接字符串，其中包含了Oracle的地址，SID，和端口号CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2#使用的用户名ORACLENAME=kkaa#使用的密码ORACLEPASSWORD=kkaa123#需要从Oracle中导入的表名oralceTableName=tt#需要从Oracle中导入的表中的字段名columns=AREA_ID,TEAM_NAME#将Oracle中的数据导入到HDFS后的存放路径hdfsPath=apps/as/hive/$oralceTableName#</summary><published>2011-03-01T07:03:00Z</published><updated>2011-03-01T07:03:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/03/01/1968027.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/03/01/1968027.html"/><content type="html">&lt;p&gt;&lt;strong&gt;基本使用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如下面这个shell脚本：&lt;/p&gt;&lt;p&gt;#Oracle的连接字符串，其中包含了Oracle的地址，SID，和端口号&lt;br /&gt;CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2&lt;br /&gt;#使用的用户名&lt;br /&gt;ORACLENAME=kkaa&lt;br /&gt;#使用的密码&lt;br /&gt;ORACLEPASSWORD=kkaa123&lt;br /&gt;#需要从Oracle中导入的表名&lt;br /&gt;oralceTableName=tt&lt;br /&gt;#需要从Oracle中导入的表中的字段名&lt;br /&gt;columns=AREA_ID,TEAM_NAME&lt;br /&gt;#将Oracle中的数据导入到HDFS后的存放路径&lt;br /&gt;hdfsPath=apps/as/hive/$oralceTableName&lt;br /&gt;&lt;br /&gt;#执行导入逻辑。将Oracle中的数据导入到HDFS中&lt;br /&gt;sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath&amp;nbsp; --num-mappers 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'&lt;/p&gt;&lt;p&gt;执行这个脚本之后，导入程序就完成了。 &lt;/p&gt;&lt;p&gt;接下来，用户可以自己创建外部表，将外部表的路径和HDFS中存放Oracle数据的路径对应上即可。 &lt;/p&gt;&lt;p&gt;注意：这个程序导入到HDFS中的数据是文本格式，所以在创建Hive外部表的时候，不需要指定文件的格式为RCFile，而使用默认的TextFile即可。数据间的分隔符为'\001'。如果多次导入同一个表中的数据，数据以append的形式插入到HDFS目录中。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;并行导入&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假设有这样这个sqoop命令，需要将Oracle中的数据导入到HDFS中： &lt;/p&gt;&lt;p&gt;sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath&amp;nbsp; --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'&amp;nbsp; --where "data_desc='2011-02-26'" &lt;/p&gt;&lt;p&gt;请注意，在这个命令中，有一个参数&amp;ldquo;-m&amp;rdquo;，代表的含义是使用多少个并行，这个参数的值是1，说明没有开启并行功能。 &lt;/p&gt;&lt;p&gt;现在，我们可以将&amp;ldquo;-m&amp;rdquo;参数的值调大，使用并行导入的功能，如下面这个命令： &lt;/p&gt;&lt;p&gt;sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath&amp;nbsp; --m 4 --table $oralceTableName --columns $columns --fields-terminated-by '\001'&amp;nbsp; --where "data_desc='2011-02-26'" &lt;/p&gt;&lt;p&gt;一般来说，Sqoop就会开启4个进程，同时进行数据的导入操作。 &lt;/p&gt;&lt;p&gt;但是，如果从Oracle中导入的表没有主键，那么会出现如下的错误提示： &lt;/p&gt;&lt;p&gt;ERROR tool.ImportTool: Error during import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with --split-by or perform a sequential import with '-m 1'. &lt;/p&gt;&lt;p&gt;在这种情况下，为了更好的使用Sqoop的并行导入功能，我们就需要从原理上理解Sqoop并行导入的实现机制。 &lt;/p&gt;&lt;p&gt;如果需要并行导入的Oracle表的主键是id，并行的数量是4，那么Sqoop首先会执行如下一个查询： &lt;/p&gt;&lt;p&gt;select max(id) as max, select min(id) as min from table [where 如果指定了where子句]; &lt;/p&gt;&lt;p&gt;通过这个查询，获取到需要拆分字段（id）的最大值和最小值，假设分别是1和1000。 &lt;/p&gt;&lt;p&gt;然后，Sqoop会根据需要并行导入的数量，进行拆分查询，比如上面的这个例子，并行导入将拆分为如下4条SQL同时执行： &lt;/p&gt;&lt;p&gt;select * from table where 0 &amp;lt;= id &amp;lt; 250; &lt;/p&gt;&lt;p&gt;select * from table where 250 &amp;lt;= id &amp;lt; 500; &lt;/p&gt;&lt;p&gt;select * from table where 500 &amp;lt;= id &amp;lt; 750; &lt;/p&gt;&lt;p&gt;select * from table where 750 &amp;lt;= id &amp;lt; 1000; &lt;/p&gt;&lt;p&gt;注意，这个拆分的字段需要是整数。 &lt;/p&gt;&lt;p&gt;从上面的例子可以看出，如果需要导入的表没有主键，我们应该如何手动选取一个合适的拆分字段，以及选择合适的并行数。 &lt;/p&gt;&lt;p&gt;再举一个实际的例子来说明： &lt;/p&gt;&lt;p&gt;我们要从Oracle中导入creater_user.popt_cas_redirect_his。 &lt;/p&gt;&lt;p&gt;这个表没有主键，所以我们需要手动选取一个合适的拆分字段。 &lt;/p&gt;&lt;p&gt;首先看看这个表都有哪些字段： &lt;/p&gt;&lt;p&gt;然后，我假设ds_name字段是一个可以选取的拆分字段，然后执行下面的sql去验证我的想法： &lt;/p&gt;&lt;p&gt;select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26' &lt;/p&gt;&lt;p&gt;发现结果不理想，min和max的值都是相等的。所以这个字段不合适作为拆分字段。 &lt;/p&gt;&lt;p&gt;再测试一下另一个字段：CLIENTIP&lt;br /&gt;select min(CLIENTIP), max(CLIENTIP) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26' &lt;/p&gt;&lt;p&gt;这个结果还是不错的。所以我们使用CLIENTIP字段作为拆分字段。 &lt;/p&gt;&lt;p&gt;所以，我们使用如下命令并行导入： &lt;/p&gt;&lt;p&gt;sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath&amp;nbsp; --m 12 --split-by CLIENTIP --table $oralceTableName --columns $columns --fields-terminated-by '\001'&amp;nbsp; --where "data_desc='2011-02-26'" &lt;/p&gt;&lt;p&gt;这次执行这个命令，可以看到，消耗的时间为：20mins, 35sec，导入了33,222,896条数据。 &lt;/p&gt;&lt;p&gt;另外，如果觉得这种拆分不能很好满足我们的需求，可以同时执行多个Sqoop命令，然后在where的参数后面指定拆分的规则。如： &lt;/p&gt;&lt;p&gt;sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath&amp;nbsp; --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'&amp;nbsp; --where "data_desc='2011-02-26' logtime&amp;lt;10:00:00" &lt;/p&gt;&lt;p&gt;sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath&amp;nbsp; --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'&amp;nbsp; --where "data_desc='2011-02-26' logtime&amp;gt;=10:00:00" &lt;/p&gt;&lt;p&gt;从而达到并行导入的目的。 &lt;/p&gt;&lt;p&gt;更多关于Hadoop的文章，可以参考：http://www.cnblogs.com/gpcuster/tag/Hadoop/&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/1968027.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/03/01/1968027.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/02/17/1957042.html</id><title type="text">Hadoop的本地库（Native Libraries）介绍</title><summary type="text">Hadoop是使用Java语言开发的，但是有一些需求和操作并不适合使用java，所以就引入了本地库（Native Libraries）的概念，通过本地库，Hadoop可以更加高效地执行某一些操作。目前在Hadoop中，本地库应用在文件的压缩上面：zlibgzip在使用这两种压缩方式的时候，Hadoop默认会从$HADOOP_HOME/lib/native/Linux-*目录中加载本地库。如果加载成功，输出为：DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library... INFO ut</summary><published>2011-02-17T07:41:00Z</published><updated>2011-02-17T07:41:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/02/17/1957042.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/02/17/1957042.html"/><content type="html">&lt;p&gt;Hadoop是使用Java语言开发的，但是有一些需求和操作并不适合使用java，所以就引入了本地库（Native Libraries）的概念，通过本地库，Hadoop可以更加高效地执行某一些操作。&lt;/p&gt;&lt;p&gt;目前在Hadoop中，本地库应用在文件的压缩上面：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.zlib.net/"&gt;zlib&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gzip.org/"&gt;gzip&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在使用这两种压缩方式的时候，Hadoop默认会从$HADOOP_HOME/lib/native/Linux-*目录中加载本地库。&lt;/p&gt;&lt;p&gt;如果加载成功，输出为：&lt;/p&gt;&lt;p&gt;DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library... &lt;br /&gt;INFO util.NativeCodeLoader - Loaded the native-hadoop library  &lt;/p&gt;&lt;p&gt;如果加载失败，输出为： &lt;/p&gt;&lt;p&gt;INFO util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable &lt;/p&gt;&lt;p&gt;在Hadoop的配置文件core-site.xml中可以设置是否使用本地库： &lt;/p&gt;&lt;p&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;hadoop.native.lib&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;description&amp;gt;Should native hadoop libraries, if present, be used.&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt; &lt;/p&gt;&lt;p&gt;Hadoop默认的配置为启用本地库。 &lt;/p&gt;&lt;p&gt;另外，可以在环境变量中设置使用本地库的位置：&lt;/p&gt;&lt;p&gt;&lt;code&gt;export JAVA_LIBRARY_PATH=/path/to/hadoop-native-libs&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;有的时候也会发现Hadoop自带的本地库无法使用，这种情况下就需要自己去编译本地库了。在&lt;/code&gt;&lt;code&gt;$HADOOP_HOME目录下，&lt;/code&gt;&lt;code&gt;使用如下命令即可：&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;ant compile-native&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;编译完成后，可以在$HADOOP_HOME/build/native目录下找到相应的文件，然后指定文件的路径或者移动编译好的文件到默认目录下即可。&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;更多关于Hadoop的文章，可以参考：http://www.cnblogs.com/gpcuster/tag/Hadoop/&lt;code&gt;&lt;/code&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/1957042.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/02/17/1957042.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/02/16/1956555.html</id><title type="text">漫谈Hadoop HDFS Balancer</title><summary type="text">Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况，比如集群中添加新的数据节点。当HDFS出现不平衡状况的时候，将引发很多问题，比如MR程序无法很好地利用本地计算的优势，机器之间无法达到更好的网络带宽使用率，机器磁盘无法利用等等。可见，保证HDFS中的数据平衡是非常重要的。在Hadoop中，包含一个Balancer程序，通过运行这个程序，可以使得HDFS集群达到一个平衡的状态，使用这个程序的命令如下：sh $HADOOP_HOME/bin/start-balancer.sh –t 10%这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果</summary><published>2011-02-16T15:50:00Z</published><updated>2011-02-16T15:50:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/02/16/1956555.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/02/16/1956555.html"/><content type="html">&lt;p&gt;Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况，比如集群中添加新的数据节点。当HDFS出现不平衡状况的时候，将引发很多问题，比如MR程序无法很好地利用本地计算的优势，机器之间无法达到更好的网络带宽使用率，机器磁盘无法利用等等。可见，保证HDFS中的数据平衡是非常重要的。&lt;/p&gt;&lt;p&gt;在Hadoop中，包含一个Balancer程序，通过运行这个程序，可以使得HDFS集群达到一个平衡的状态，使用这个程序的命令如下：&lt;/p&gt;&lt;p&gt;sh $HADOOP_HOME/bin/start-balancer.sh &amp;ndash;t 10%&lt;/p&gt;&lt;p&gt;这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果机器与机器之间磁盘使用率偏差小于10%，那么我们就认为HDFS集群已经达到了平衡的状态。&lt;/p&gt;&lt;p&gt;Hadoop的开发人员在开发Balancer程序的时候，遵循了以下几点原则：&lt;/p&gt;&lt;p&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp; 在执行数据重分布的过程中，必须保证数据不能出现丢失，不能改变数据的备份数，不能改变每一个rack中所具备的block数量。&lt;/p&gt;&lt;p&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp; 系统管理员可以通过一条命令启动数据重分布程序或者停止数据重分布程序。&lt;/p&gt;&lt;p&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp; Block在移动的过程中，不能暂用过多的资源，如网络带宽。 &lt;/p&gt;&lt;p&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp; 数据重分布程序在执行的过程中，不能影响name node的正常工作。&lt;/p&gt;&lt;p&gt;基于这些基本点，目前Hadoop数据重分布程序实现的逻辑流程如下图所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gpcuster/201102/201102162350069487.png"&gt;&lt;img title="image" style="display: inline; border: 0px;" alt="image" src="http://images.cnblogs.com/cnblogs_com/gpcuster/201102/201102162350084687.png" border="0" height="183" width="644" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Rebalance程序作为一个独立的进程与name node进行分开执行。&lt;/p&gt;&lt;p&gt;1 Rebalance Server从Name Node中获取所有的Data Node情况：每一个Data Node磁盘使用情况。&lt;/p&gt;&lt;p&gt;2 Rebalance Server计算哪些机器需要将数据移动，哪些机器可以接受移动的数据。并且从Name Node中获取需要移动的数据分布情况。&lt;/p&gt;&lt;p&gt;3 Rebalance Server计算出来可以将哪一台机器的block移动到另一台机器中去。&lt;/p&gt;&lt;p&gt;4,5,6 需要移动block的机器将数据移动的目的机器上去，同时删除自己机器上的block数据。&lt;/p&gt;&lt;p&gt;7&amp;nbsp; Rebalance Server获取到本次数据移动的执行结果，并继续执行这个过程，一直没有数据可以移动或者HDFS集群以及达到了平衡的标准为止。&lt;/p&gt;&lt;p&gt;Hadoop现有的这种Balancer程序工作的方式在绝大多数情况中都是非常适合的。&lt;/p&gt;&lt;p&gt;现在我们设想这样一种情况：&lt;/p&gt;&lt;p&gt;1 数据是3份备份。&lt;/p&gt;&lt;p&gt;2 HDFS由2个rack组成。&lt;/p&gt;&lt;p&gt;3 2个rack中的机器磁盘配置不同，第一个rack中每一台机器的磁盘空间为1TB，第二个rack中每一台机器的磁盘空间为10TB。&lt;/p&gt;&lt;p&gt;4 现在大多数数据的2份备份都存储在第一个rack中。&lt;/p&gt;&lt;p&gt;在这样的一种情况下，HDFS级群中的数据肯定是不平衡的。现在我们运行Balancer程序，但是会发现运行结束以后，整个HDFS集群中的数据依旧不平衡：rack1中的磁盘剩余空间远远小于rack2。&lt;/p&gt;&lt;p&gt;这是因为Balance程序的开发原则1导致的。&lt;/p&gt;&lt;p&gt;简单的说，就是在执行Balancer程序的时候，不会将数据中一个rack移动到另一个rack中，所以就导致了Balancer程序永远无法平衡HDFS集群的情况。&lt;/p&gt;&lt;p&gt;针对于这种情况，可以采取2中方案：&lt;/p&gt;&lt;p&gt;1 继续使用现有的Balancer程序，但是修改rack中的机器分布。将磁盘空间小的机器分叉到不同的rack中去。&lt;/p&gt;&lt;p&gt;2 修改Balancer程序，允许改变每一个rack中所具备的block数量，将磁盘空间告急的rack中存放的block数量减少，或者将其移动到其他磁盘空间富余的rack中去。&lt;/p&gt;&lt;p&gt;更多关于Hadoop的文章，可以参考：http://www.cnblogs.com/gpcuster/tag/Hadoop/&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/1956555.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/02/16/1956555.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/02/06/1949466.html</id><title type="text">分布式实时统计系统--Rainbird</title><summary type="text">最近Twitter开发了一款分布式实时统计系统Rainbird。用处Rainbird可以用于实时数据的统计：1 统计网站中每一个页面，域名的点击次数2 内部系统的运行监控（统计被监控服务器的运行状态）3 记录最大值和最小值性能要求作为大型网站的分布式应用，需要具备以下性能：1 极高的写入性能，可以达到100,000的WPS2 非常高的读取性能，可以达到10,000s的RPS3 高度的可扩展性，包括读取和存储等等，能够扩展到100+ TB的量级4 读取速度响应间隔短，绝大多数的读取速度应该不超过100ms系统组件Rainbird一款基于Zookeeper, Cassandra,Scribe, T</summary><published>2011-02-06T06:26:00Z</published><updated>2011-02-06T06:26:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/02/06/1949466.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/02/06/1949466.html"/><content type="html">&lt;p&gt;最近Twitter开发了一款分布式实时统计系统Rainbird。&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;用处&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Rainbird可以用于实时数据的统计：&lt;/p&gt;&lt;p&gt;1 统计网站中每一个页面，域名的点击次数&lt;/p&gt;&lt;p&gt;2 内部系统的运行监控（统计被监控服务器的运行状态）&lt;/p&gt;&lt;p&gt;3 记录最大值和最小值&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;性能要求&lt;/b&gt;&lt;/p&gt;&lt;p&gt;作为大型网站的分布式应用，需要具备以下性能：&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;1 极高的写入性能，可以达到100,000的WPS&lt;/p&gt;&lt;p&gt;2 非常高的读取性能，可以达到10,000s的RPS&lt;/p&gt;&lt;p&gt;3 高度的可扩展性，包括读取和存储等等，能够扩展到100+ TB的量级&lt;/p&gt;&lt;p&gt;4 读取速度响应间隔短，绝大多数的读取速度应该不超过100ms&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;系统组件&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Rainbird一款基于Zookeeper, Cassandra,Scribe, Thrift的分布式实时统计系统，这些基础组件的基本功能如下：&lt;/p&gt;&lt;p&gt;1 Zookeeper，Hadoop子项目中的一款分布式协调系统，用于控制分布式系统中各个组件中的一致性。&lt;/p&gt;&lt;p&gt;2 Cassandra，NoSQL中一款非常出色的产品，集合了Dynamo和Bigtable特性的分布式存储系统，用于存储需要进行统计的数据，统计数据，并且提供客户端进行统计数据的查询。（需要使用分布式Counter补丁CASSANDRA-1072）&lt;/p&gt;&lt;p&gt;3 Scribe，Facebook开源的一款分布式日志收集系统，用于在系统中将各个需要统计的数据源收集到Cassandra中。&lt;/p&gt;&lt;p&gt;4 Thrift，Facebook开源的一款跨语言C/S网络通信框架，开发人员基于这个框架可以轻易地开发C/S应用。&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;整体设计&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Rainbird的设计架构图如下：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2011/20493/2011020611473856.jpg" /&gt;&lt;/p&gt;&lt;p&gt;整个Rainbird系统中各个组件之间的协调和容灾处理由ZooKeeper负责，Cassandra负责整个数据的存储和统计。&lt;/p&gt;&lt;p&gt;Front End中部署了Scribe，收集需要统计的数据，然后将收集到数据实时地发生到Rainbird Aggregator中。&lt;/p&gt;&lt;p&gt;Rainbird Aggregator将缓存收集的数据（1M），并将缓存的数据进行一次预处理，然后再将数据一次性批量写入到Cassandra中。这里预处理的作用类似于MapReduce框架中的combiner的作用，在Maper端做Reduce。&lt;/p&gt;&lt;p&gt;Rainbird Query接受用户的查询请求，直接到Cassandra中查询已经统计好的数据返回给客户端。&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;页面URL统计示例&lt;/b&gt;&lt;/p&gt;&lt;p&gt;将设我们需要统计网站的页面点击的情况，那么如何使用Rainbird来进行统计呢？&lt;/p&gt;&lt;p&gt;在统计的过程中，本博客中一篇文章的URL为：&lt;a href="http://www.cnblogs.com/gpcuster/tag/Cassandra/"&gt;http://www.cnblogs.com/gpcuster/tag/Cassandra/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们可以将这个URL分拆为以下四个部分&lt;/p&gt;&lt;p&gt;com&lt;/p&gt;&lt;p&gt;cnblogs&lt;/p&gt;&lt;p&gt;www&lt;/p&gt;&lt;p&gt;http://www.cnblogs.com/gpcuster/tag/Cassandra/&lt;/p&gt;&lt;p&gt;然后以分拆后的这四个部分组合为以下Key：&lt;/p&gt;&lt;p&gt;com,cnblogs,www,http://www.cnblogs.com/gpcuster/tag/Cassandra/&lt;/p&gt;&lt;p&gt;com,cnblogs,www&lt;/p&gt;&lt;p&gt;com,cnblogs&lt;/p&gt;&lt;p&gt;com&lt;/p&gt;&lt;p&gt;最后将这些Key的数据写入Cassandra中。这样就完成了整个统计的过程。&lt;/p&gt;&lt;p&gt;如果需要查询页面http://www.cnblogs.com/gpcuster/tag/Cassandra/被访问了多少次，只要在Cassandra中查询Key为com,cnblogs,www,http://www.cnblogs.com/gpcuster/tag/Cassandra/的值即可。&lt;/p&gt;&lt;p&gt;如果需要查询页面http://www.cnblogs.com被访问了多少次，只要在Cassandra中查询Key为com,cnblogs,www的值即可。&lt;/p&gt;&lt;p&gt;如果要查询页面http://*cnblogs.com被访问了多少次，也可以进行类似的查询即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更多参考&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果希望了解更详细的信息，可以参考：http://www.slideshare.net/kevinweil/rainbird-realtime-analytics-at-twitter-strata-2011&lt;/p&gt;&lt;p&gt;另外，想了解更多关于Cassandra的信息，可以参考：http://www.cnblogs.com/gpcuster/tag/Cassandra/&lt;/p&gt;&lt;p&gt;想了解更多关于ZooKeeper的信息，可以参考：http://www.cnblogs.com/gpcuster/tag/ZooKeeper/&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/1949466.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/02/06/1949466.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/01/26/1945363.html</id><title type="text">Hadoop中的CRC数据校验文件</title><summary type="text">Hadoop系统为了保证数据的一致性，会对文件生成相应的校验文件，并在读写的时候进行校验，确保数据的准确性。比如我们遇到的这个Case：执行的命令：hadoop jar dw-hadoop-2010_7_23.jar jobDriver -files tb_steps_url_path_dim.txt multisteps_output 2011-01-25出错日志的提示：org.apache.hadoop.fs.ChecksumException: Checksum error: file:tb_steps_url_path_dim.txt at 0at org.apache.hadoop.</summary><published>2011-01-26T05:11:00Z</published><updated>2011-01-26T05:11:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/01/26/1945363.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/01/26/1945363.html"/><content type="html">&lt;p&gt;Hadoop系统为了保证数据的一致性，会对文件生成相应的校验文件，并在读写的时候进行校验，确保数据的准确性。&lt;/p&gt;&lt;p&gt;比如我们遇到的这个Case：&lt;/p&gt;&lt;p&gt;&lt;b&gt;执行的命令：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;hadoop jar dw-hadoop-2010_7_23.jar jobDriver -files tb_steps_url_path_dim.txt&amp;nbsp; multisteps_output 2011-01-25&lt;br class="atl-forced-newline" /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;出错日志的提示：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;org.apache.hadoop.fs.ChecksumException: Checksum error: &lt;a class="external-link" rel="nofollow"&gt;file:tb_steps_url_path_dim.txt&lt;/a&gt; at 0&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.fs.FSInputChecker.verifySum(FSInputChecker.java:277)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.fs.FSInputChecker.readChecksumChunk(FSInputChecker.java:241)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.fs.FSInputChecker.read1(FSInputChecker.java:189)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.fs.FSInputChecker.read(FSInputChecker.java:158)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at java.io.DataInputStream.read(DataInputStream.java:83)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:49)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:87)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:209)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:142)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.mapred.JobClient.copyRemoteFiles(JobClient.java:565)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.mapred.JobClient.configureCommandLineOptions(JobClient.java:627)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:802)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:771)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1290)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at jobDriver.run(jobDriver.java:85)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at jobDriver.main(jobDriver.java:124)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at java.lang.reflect.Method.invoke(Method.java:597)&lt;br class="atl-forced-newline" /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;错误原因：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;启动任务的命令中包含一个参数&amp;ldquo;-files tb_steps_url_path_dim.txt&amp;rdquo;&lt;/p&gt;&lt;p&gt;Hadoop客户端需要将机器本地磁盘中的tb_steps_url_path_dim.txt文件上传到DFS中。&lt;/p&gt;&lt;p&gt;在上传的过程中，Hadoop将通过FSInputChecker判断需要上传的文件是否存在进行校验的crc文件，即.tb_steps_url_path_dim.txt.crc，如果存在crc文件，将会对其内容一致性进行校验，如果校验失败，则停止上传该文件。最终导致整个MR任务无法执行。&lt;br class="atl-forced-newline" /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;crc&lt;/b&gt;&lt;b&gt;文件来源&lt;/b&gt;&lt;/p&gt;&lt;p&gt;DFS命令：hadoop fs -getmerge srcDir destFile&lt;/p&gt;&lt;p&gt;这类命令在执行的时候，会将srcDir目录下的所有文件合并成一个文件，保存在destFile中，同时会在本地磁盘生成一个. destFile.crc的校验文件。&lt;/p&gt;&lt;p&gt;DFS命令：hadoop fs -get -crc src dest&lt;/p&gt;&lt;p&gt;这类命令在执行的时候，会将src文件，保存在dest中，同时会在本地磁盘生成一个. dest.crc的校验文件。&lt;/p&gt;&lt;p&gt;&lt;b&gt;如何避免&lt;/b&gt;&lt;/p&gt;&lt;p&gt;在使用hadoop fs -getmerge srcDir destFile命令时，本地磁盘一定会（没有参数可以关闭）生成相应的.crc文件。&lt;/p&gt;&lt;p&gt;所以如果需要修改getmerge获取的文件的内容，再次上传到DFS时，可以采取以下2种策略进行规避：&lt;/p&gt;&lt;p&gt;1. 删除.crc文件&lt;/p&gt;&lt;p&gt;2. 将getmerge获取的文件修改后重新命名，如使用mv操作，再次上传到DFS中。&lt;/p&gt;&lt;p&gt;更多关于Hadoop的文章，可以参考：http://www.cnblogs.com/gpcuster/tag/Hadoop/&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/1945363.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/01/26/1945363.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gpcuster/archive/2011/01/13/1934272.html</id><title type="text">Cassandra就要迎来1.0版本啦</title><summary type="text">前一段时间，Cassandra0.7已经正式发布啦。接下来，Cassandra1.0即将发布。邮件列表的内容如下：Way back in Nov 09, we did a users survey and asked what featurespeople wanted to see. Here was my summary of the responses:http://www.mail-archive.com/cassandra-user@incubator.apache.org/msg01446.htmlLooking at that, we've done essentially al</summary><published>2011-01-13T02:05:00Z</published><updated>2011-01-13T02:05:00Z</updated><author><name>逖靖寒</name><uri>http://www.cnblogs.com/gpcuster/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gpcuster/archive/2011/01/13/1934272.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gpcuster/archive/2011/01/13/1934272.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 15px;"&gt;前一段时间，Cassandra0.7已经正式发布啦。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;接下来，Cassandra1.0即将发布。邮件列表的内容如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;Way back in Nov 09, we did a users survey and asked what features&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;people wanted to see. &amp;nbsp;Here was my summary of the responses:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;&lt;a href="http://www.mail-archive.com/cassandra-user@incubator.apache.org/msg01446.html" target="_blank"&gt;http://www.mail-archive.com/&lt;wbr&gt;&lt;/wbr&gt;cassandra-user@incubator.&lt;wbr&gt;&lt;/wbr&gt;apache.org/msg01446.html&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Looking at that, we've done essentially all of them. &amp;nbsp;I think we can&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;make a strong case that our next release should be 1.0; it's&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;production ready, it's reasonably feature-complete, it's documented,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;and we know what our upgrade path story is.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;The list--&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Load balancing: basics done;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;&lt;a href="https://issues.apache.org/jira/browse/CASSANDRA-1427" target="_blank"&gt;https://issues.apache.org/&lt;wbr&gt;&lt;/wbr&gt;jira/browse/CASSANDRA-1427&lt;/a&gt; is open to&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;improve it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Decommission: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Map/reduce support: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;ColumnFamily / Keyspace definitions w/o restart: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Design documentation: started at&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;&lt;a href="http://wiki.apache.org/cassandra/ArchitectureInternals" target="_blank"&gt;http://wiki.apache.org/&lt;wbr&gt;&lt;/wbr&gt;cassandra/&lt;wbr&gt;&lt;/wbr&gt;ArchitectureInternals&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Insert multiple rows at once: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Remove_slice_range / remove_key_range: turned out to be a *lot* harder&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;than it looks at first. &amp;nbsp;Postponed indefinitely.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Secondary indexing: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Caching: done (with some enhancements possible such as&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;&lt;a href="https://issues.apache.org/jira/browse/CASSANDRA-1969" target="_blank"&gt;https://issues.apache.org/&lt;wbr&gt;&lt;/wbr&gt;jira/browse/CASSANDRA-1969&lt;/a&gt; and&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;&lt;a href="https://issues.apache.org/jira/browse/CASSANDRA-1956" target="_blank"&gt;https://issues.apache.org/&lt;wbr&gt;&lt;/wbr&gt;jira/browse/CASSANDRA-1956&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Bulk delete (truncate): done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;I would add,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;User documentation: done (&lt;a href="http://www.riptano.com/docs" target="_blank"&gt;http://www.riptano.com/docs&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Large row support: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Improved replication strategies and more sophisticated ConsistencyLevels: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Efficient bootstrap/streaming: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Flow control: done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;Network-level compatibility between releases: scheduled&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 15px;"&gt;(&lt;a href="https://issues.apache.org/jira/browse/CASSANDRA-1015" target="_blank"&gt;https://issues.apache.org/&lt;wbr&gt;&lt;/wbr&gt;jira/browse/CASSANDRA-1015&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;更多关于Cassandra的文章：http://www.cnblogs.com/gpcuster/tag/Cassandra/ &lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gpcuster/aggbug/1934272.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gpcuster/archive/2011/01/13/1934272.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
