HBase的bulkLoad

Posted 下士闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase的bulkLoad相关的知识,希望对你有一定的参考价值。

HBase的BulkLoad有两种方式一种是Basic的方式,调用bulkLoad函数,这种方式适合于列数大于10万,另外提供的一种函数是hbaseBulkLoadThinRows,适合于小于10万行情况;
Basic和ThinRows的机制其实类似,但是接收的数据格式不一样,前者接受的是一个二元组List
Seq((keyFamilyQualifier, value))
其中KeyFamilyQualifier(包括rowKey, family, qualifier)以及value,后者是一个二元组List
(new ByteArrayWrapper(Bytes.toBytes(rowKey)), familyQualifiersValues)
familyQualifiersValues中包含family, qualifier, value
Basic是一个平行结构,ThinRow其实是一个层级结构;
Basic和thin之间的差别在于Basic需要首先flatMap一下这个二元组List,拉平后在逐条处理,每个记录都是一行的一个列;
而作为thinrow而言直接map,然后进行层级遍历,首先是遍历family级别,而后是二级遍历,遍历quality级别,此时获得粒度是一行一列的数据;然后进行writer的append。
注意这里有一个Roll的动作,就是bulk/thinrow入口参数有一个max_size,代表多大小对HFile文件进行拆分,Basic默认是HConstants.DEFAULT_MAX_FILE_SIZE,ThinRow其实也是一样的,但是官网坑爹的写了个20,所以导致的每个记录都会单独成为一个HFile,结果爆了一个异常:HFileLoad的大小超过了32。
这个异常本质还是因为Roll Size设置的太小了,采用默认值即可。
   BulkLoad插入数据的速度将会比采用put方式要快很多:这是因为PUT方式需要些metadata,采用bulkload方式避免了写入metadata,直接通过HFile的添加来实现。但是bulkLoad需要对数据进行组合,这里又要耗费一些时间,所以优势更多的体现在大量数据,分布比较多的设备的场景下。
shuffle指的是各个节点在为reduce准备数据,比如检索,排序同时对数据进行打包;repartion这是对数据进行分区,正常情况下每个分区将会对应一个CPU核,repartition这是通过指定分区规则(指定分区数量或者指定按照某种规则分区)来对数据进行重新分区,重新分区应该只是针对可重用数据才有价值,否则数据重新分区本身就是一件比较耗费性能的事情。

以上是关于HBase的bulkLoad的主要内容,如果未能解决你的问题,请参考以下文章

HBase学习01(HBase入门及HBase Shell简单操作)

HBase学习01(HBase入门及HBase Shell简单操作)

Hbase记录-Hbase配置项

来自 HBase 查询的 Hbase 表

HBase实战 | Hive数据导入云HBase

hbase系列之初识hbase