发布时间: 2016-09-10 | 浏览次数: 5595 | 下载次数: 3 | 作者: tianyuyan | 文档编号: EKB1000250579
从上述日志可以看到,每次都是合并了10个hfile并且数据量达到80+GB,所以耗时会很长,并且compaction过程当中bulkload是服务导入数据的,导致需要等待compaction结束后瞬间导入完成。最终现象就是加载任务卡住了很久。
查看该region数据目录下的hfile文件,我们发现有9000+个hfile,并且hfile数据量都很小KB到MB不等,这些hfile全是加载任务导入的小文件。
HBase服务会检查region下的hfile个数,当文件个数超过3个(参数可配)时触发compaction进行文件合并,一次合并最多10个(参数可配)文件。在合并完后会检查region总数据量是否超过10GB(参数可配)并且当前hfile个数少于7个(参数可配)来触发split进行region分裂。
在上述过程当中,我们目前遇到的问题就是,业务持续导入很多小hfile文件,触发了服务端的compaction,随着数据量越来越大,compaction的耗时也越来越多,当compaction的处理过程时间范围内业务导入的hfile数量大于了compation能处理的能力默认10个时,hfile文件个数就会越来越多,最终导致compaction越来越慢,并且无法分裂。
该问题的根本原因是业务不应该频繁导入大量小hfile文件,如果导入数据量小,应该采用put方式,bulkload只适合导入大量数据并且导入周期不能太频繁,适用于离线大数据量导入业务。
1. 停止对BAMC_TRANSMON_MFINFO表的业务
停止业务操作由工行同事确定。
停止业务后可以通过HBase页面来检查,是否还有新增请求来判断业务是否全部停止。
即上图Table Regions表里最右边的Requests个数不再增加。
2. 确定splitkey是否存在
计划周六晚上操作那么splitkey定位15#20160424,表中应该没有15#20160424及以后的数据。
kinit hbase
hbase shell
scan 'BAMC_TRANSMON_MFINFO', {STARTROW => '15#20160424', ENDROW => '2#2016'}
下图为期望结果,查不到任何数据
3. 停止HBase服务
OM界面上停止HBase服务
4. 从热点Region移出数据
kinit hbase
hadoop fs -mkdir /tmp/bak
hadoop fs -mv /hbase/BAMC_TRANSMON_MFINFO/4d3c12eac9bd683a32e5f832ca4b9336/C /tmp/bak
这里我们是移动一个目录,所以数据量和目录里的文件个数都没影响,耗时大概是几秒钟。
5. 启动HBase服务
OM界面上启动HBase服务
6. split问题Region
kinit hbase
hbase shell
split 'BAMC_TRANSMON_MFINFO', '15#20160424'
下图为期望结果
可以到HBase页面观察分裂效果
可以看到以15#20160424为startkey和endkey的两个新region已经出来了
此处需要注意以15#20160424为endkey的region为我们后续移入数据的目标region,需要记录其id,即Name中最后一部分十六进制数,上图为7f3441d265e2bcd33e7d6cf7053bde7b
7. 停止HBase服务
OM界面上停止HBase服务
8. 移入数据到分裂后的Region
kinit hbase
hadoop fs -ls /hbase/BAMC_TRANSMON_MFINFO/7f3441d265e2bcd33e7d6cf7053bde7b/C
下图为期望结果,没有任何数据文件
hadoop fs -rmdir /hbase/BAMC_TRANSMON_MFINFO/7f3441d265e2bcd33e7d6cf7053bde7b/C
下图为期望结果,删除目录成功
hadoop fs -mv /tmp/bak/C /hbase/BAMC_TRANSMON_MFINFO/7f3441d265e2bcd33e7d6cf7053bde7b
下图为期望结果,移动文件成功
9. 启动HBase服务
OM界面上启动HBase服务
10. 检查数据
kinit hbase
hbase shell
scan 'BAMC_TRANSMON_MFINFO', {STARTROW => '15#20160406', ENDROW => '15#20160407'}
下图为期望结果,能够scan到数据
以上STARTROW和ENDROW为业务之前实际导入过的数据为准
11. 分裂后续空Region
kinit hbase
hbase shell
split 'BAMC_TRANSMON_MFINFO', '15#20160425'
split 'BAMC_TRANSMON_MFINFO', '15#20160426'
split 'BAMC_TRANSMON_MFINFO', '15#20160427'
......此处省略15#20160428到15#20160530日期的key
split 'BAMC_TRANSMON_MFINFO', '15#20160531'