我正在尝试将一些 HDFS 数据导入到已经存在的 HBase 表中。我创建的表是使用 2 个列族创建的,并且具有 HBase 在创建新表时附带的所有默认设置。这张表已经被大量数据填满了,它有98个在线区域。它所具有的行键类型为(简化版):2-CHARS_ID + 6-DIGIT-NUMBER + 3 X 32-CHAR-MD5-HASH。
密钥示例:IP281113ec46d86301568200d510f47095d6c99db18630b0a23ea873988b0fb12597e05cc6b30c479dfb9e9d627ccfc4c5dd5fef。
我要导入的数据在 HDFS 上,我正在使用 Map-Reduce 进程来读取它。我从我的映射器发出 Put 对象,这些对象对应于从 HDFS 文件中读取的每一行。现有数据的键都以“XX181113”开头。该作业配置为:
HFileOutputFormat.configureIncrementalLoad(job, hTable)
一旦我开始这个过程,我看到它配置了 98 个 reducer(等于表的在线区域),但问题是 4 个 reducer 得到了 100% 的数据拆分,而其余的什么也没做。结果,我只看到 4 个文件夹输出,它们的大小非常大。这些文件是否对应于regions
我可以导入到表中的 4 个新文件?如果是这样,为什么只创建了 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.
我更加困惑为什么我会得到这种行为。
谢谢!