Bulkload用例前半部分鲲鹏计算平台48核CPU占用90%+,x86计算平台CPU占用100%。分析Bulkload用例具体流程如下:
Bulkload的ImportTsv默认是以Hdfs的blocksize(默认128MB)来切分数据文件,如200G的数据文件大概有1600多个map任务,但是并没有相应的参数设定来修改map数,故通过更改ImportTsv源码,ImportTsv该类具体位于HBase源码的hbase-mapreduce-2.0.2.3.1.0.0-78.jar中,具体的路径如下所示。
在ImportTsv.java增加一个配置参数,即增加一个成员变量:
在createSubmittableJob方法中增加如下代码:
将该JAR包重新编译后,通过find查找到JAR包所在位置,替换到对应的HBase源码中。
替换之后就可以在ImportTsv上配置一个mapreduce.split.minsize参数,参照如下。
1
|
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,f1:H_NAME,f1:ADDRESS -Dimporttsv.separator="," -Dimporttsv.skip.bad.lines=true -Dmapreduce.split.minsize=5368709120 -Dimporttsv.bulk.output=/tmp/hbase/hfile ImportTable /tmp/hbase/datadirImport |
-Dmapreduce.split.minsize=5368709120:该值就是设定了数据文件的分割数值,进而可以修改map数值,设置map数时可以将map数与CPU核数设置差不多。
查看任务运行的时间,发现reduce运行时间很不均衡,有的3分钟,有的40秒,相差很大,故尝试增加reduce数,使每个reduce处理数据更均衡。
通过修改预分区数(region),可以修改reduce数量。(本次测试设定的是800region)
修改对应文件run_create.txt中的split_num即可修改region数量。
本次bulkload测试的数据为每条1K,单条格式如下:
HBase的Rowkey是按照ASCII字典排序设计的,排序时会先比对两个Rowkey的第一个字节,如果相同,然后会比对第二个字节,依次类推,直到比较到最后一位。为了保证数据能够均衡写入到每个region,利用位补齐的方法将Rowkey的位数长度设置成一样。