hbase批量加载用法

u4dcyp6a  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(321)

我正在尝试将一些hdfs数据导入到已经存在的hbase表中。我创建的表有两个列族,并且具有hbase在创建新表时附带的所有默认设置。这个表已经充满了大量的数据,有98个在线区域。它拥有的行键类型的形式为(简化版本):2个字符\u id+6位数字+3 x 32个字符-md5-hash。
密钥示例:ip281113ec46d86301568200d510f47095d6c99db18630b0a23ea873988b0fb12597e05cc6b30c479dfb9e9d627ccfc4c5dd5fef。
我要导入的数据在hdfs上,我正在使用map reduce进程来读取它。我从Map器发出put对象,它对应于从hdfs文件读取的每一行。现有数据的密钥都以“xx181113”开头。作业配置为:

HFileOutputFormat.configureIncrementalLoad(job, hTable)

一旦启动这个过程,我看到它配置了98个reducer(相当于表中的在线区域),但问题是4个reducer得到了其中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.

更让我困惑的是,我为什么会有这种行为。
谢谢!

pobjuy32

pobjuy321#

得到的Map数并不取决于表中的区域数,而是取决于数据如何分割成区域(每个区域包含一系列键)。既然您提到所有新数据都以相同的前缀开头,那么它很可能只适合少数几个区域。您可以预先拆分表,以便在更多区域之间拆分新数据

相关问题