我正在尝试将一些HDFS数据导入到现有的HBase表中。 我创建的表是使用2个列族,以及创建新表时HBase附带的所有默认设置。 该表已经填满了大量数据,它有98个在线区域。 它具有的行键类型,采用(简化版)的形式: 2-CHARS_ID + 6-DIGIT-NUMBER + 3 X 32-CHAR-MD5-HASH。
密钥示例:IP281113ec46d86301568200d510f47095d6c99db18630b0a23ea873988b0fb12597e05cc6b30c479dfb9e9d627ccfc4c5dd5fef。
我要导入的数据是在HDFS上,我正在使用Map-Reduce进程来读取它。我从我的mapper中发出Put对象,它们对应于从HDFS文件读取的每一行。 现有数据的密钥都以“XX181113”开头。 作业配置为:
HFileOutputFormat.configureIncrementalLoad(job, hTable)
一旦我开始这个过程,我看到它配置了98个reducers(等于表中的在线区域),但问题是4个reducers在其中分配了100%的数据,而其余的没有做任何事情。
结果,我只看到4个文件夹输出,它们的大小非常大。
这些文件是否对应于4个新的regions
,然后我可以将其导入到表中?如果是这样,为什么只有4,而98减速器被创建?
阅读HBase docs
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)
您获得的地图数量不取决于您在表格中拥有的区域数量,而是取决于数据如何分割成区域(每个区域包含一系列键)。既然你提到你的所有新数据都以相同的前缀开头,那么它很可能只适合几个地区。 您可以预分割表格,以便在更多区域之间划分新数据