Spark RDD生成HFile快速导入数据到HBase
主要思路
通过观察hbase regionserver对put操作的处理,可以发现,数据首先写入到
memstore,在达到指定大小后会调用StoreFile的Writer类将数据flush到存储设
备中,如果开启过压缩算法则会先执行相应的压缩,得到压缩后的数据和数据结
构再进行写入。
通过观察HBase的StoreFileWriter,和HBase的bulkLoad方法,不难发现,在此处,
我们可以手动实例化一个Writer,append需要导入的数据到writer中,即可
得到对应的HFile文件,只要该文件符合bulkLoad方法的要求,便可调用
bulkLoad方法将HFile文件移动到对应的region目录下,即可实现HBase数据的
快速入库操作。
该方法避免了数据put到memstore这一过程,又能借助spark的RDD实现分布式
操作,理论上能提高HBase大量数据入库的效率。
主要代码实现
直接上代码
此处示例仅针对单个columnFamily情况,多个cf只需要调用多次getHFileWriter即可
class HBaseBulkLoader(conf: Configuration) {
val fs = HFileSystem.get(conf)
val tempConf = new Configuration()(conf)
tempConf.setFloat(HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, 0.0f)
val familyOptions = FamilyOptions(Algorithm.NONE, DataBlockEncoding.PREFIX_TREE, 65536)
val contextBuilder = new HFileContextBuilder()
.withCompression(familyOptions.compression)
.withChecksumType(HStore.getChecksumType(conf))
.withBytesPerCheckSum(HStore.getBytes