2013-11-28 71 views
0

我想将一些HDFS数据导入到已经存在的HBase表中。 我创建的表格是使用2列系列创建的,并且在创建新表格时使用了HBase附带的所有默认设置。 表格已经填满了大量的数据,并且有98个在线区域。 它具有的行键类型是(简化版): 2-CHARS_ID + 6-DIGIT-NUMBER + 3 X 32-CHAR-MD5-HASH。HBase批量加载使用

键示例:IP281113ec46d86301568200d510f47095d6c99db18630b0a23ea873988b0fb12597e05cc6b30c479dfb9e9d627ccfc4c5dd5fef。

我想要导入的数据在HDFS上,我正在使用Map-Reduce进程来读取它。我从映射器发出Put对象,它们对应于从HDFS文件中读取的每一行。 现有数据的密钥全部以“XX181113”开头。 作业被配置为:

HFileOutputFormat.configureIncrementalLoad(job, hTable) 

一旦我开始这个过程中,我看到它与98个减速器(相当于网上的区域表中有)配置的,但问题是,4级减速器获得的100%数据分散在其中,其余则什么也没做。 因此,我只能看到4个文件夹输出,它们的尺寸非常大。 这些文件是否对应于4个新的regions,然后我可以将它们导入表中?如果是这样,为什么只有4个,而98个减速器被创建? 阅读HBase的文档

In order to function efficiently, HFileOutputFormat must be configured such that each output HFile fits within a single region. In order to do this, jobs whose output will be bulk loaded into HBase use Hadoop's TotalOrderPartitioner class to partition the map output into disjoint ranges of the key space, corresponding to the key ranges of the regions in the table. 

弄得我更加,为什么我得到这个行为。

谢谢!

回答

0

你会得到的地图数量不取决于你在表格中的区域数量,而是数据如何被分割成区域(每个区域包含一系列键)。因为您提到所有新数据都以相同的前缀开头,所以它可能只适用于几个区域。 您可以预先分割您的表格,以便将新数据分割为更多的区域

+0

谢谢,事实上,预分割确实有效。 –

相关问题