使用spark bulkload加载海量数据到hbase

最近在项目中碰到需要使用spark加载海量数据到hbase的需求,一开始我们使用批量put的方式,这种方式简单,但是带来了一系列的性能问题,一方面速度比较慢,另一方面,由于我们的hbase用来提供oltp服务,导致在加载数据的时候,hbase的region sever频繁GC,严重影响线上交易的响应时间。因此,我们决定使用bulkload的方式来解决这个问题,一路踩坑,终于解决了所有问题,现将遇到的问题总结如下,以备查询。
1、生成hfile文件
生成hfile文件的方法,在网上很多帖子都有讲,这里就不再赘述了,只说说碰到的问题
问题一:
java.io.IOException: Non-increasing Bloom keys: 201301025200000000000003520000000000000500 after 201311195100000000000000010000000000001600
    at org.apache.hadoop.hbase.regionserver.StoreFile$Writer.appendGeneralBloomfilter(StoreFile.java:869)
    at org.apache.hadoop.hbase.regionserver.StoreFile$Writer.append(StoreFile.java:905)
    at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat$1.write(HFileOutputFormat.java:180)
    at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat$1.write(HFileOutputFormat.java:136)
    at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.write(ReduceTask.java:586)
    at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
    at org.apache.hadoop.hbase.mapreduce.KeyValueSortReducer.reduce(KeyValueSortReducer.java:53)
    at org.apache.hadoop.hbase.mapreduce.KeyValueSortReducer.reduce(KeyValueSortReducer.java:36)
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:177)

原因是生成hfile时报key未排序,需要特别注意的是用于排序的可以必须为 rowKey+列族+列名

2、导入hfile到hbase中
问题一:
ERROR mapreduce.LoadIncrementalHFiles: Trying to load more than 32 hfiles to family d of region with start key
Exception in thread "main" java.io.IOException: Trying to load more than 32 hfiles to one family of one region
at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.doBulkLoad(LoadIncrementalHFiles.java:288)
at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.run(LoadIncrementalHFiles.java:842)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)

at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.main(LoadIncrementalHFiles.java:847)
原因是一次性导入的hfile文件超过了限制,默认一次只能导入32个hfile文件
可以在代码或者hbase-site.xml中维护hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily来修改这个限制,我们线上的hbase表约3000个region,我设置成4096,导入是未见报错

问题二:
Bulk load aborted with some files not yet loaded:
.......
原因是原子批加载尝试的迭代最大次数默认是10次,如果表的region数比较多,迭代10次可能不能处理完所有的hfile文件,可以通过在代码或者hbase-site.xml中设置hbase.bulkload.retries.number参数来解决这个问题,笔者将这个参数设置成0,0表示不断重试直到成功.

猜你喜欢

转载自blog.csdn.net/chenjian_grt/article/details/80190504
今日推荐