FusionInsight HD HBase热点Region无法自动分裂,一直在进行compact导致入库效率很低

发布时间:  2016-09-10 浏览次数:  672 下载次数:  0
问题描述
FusionInsight版本:FusionInsight V100R002C02
HBase集群的Bukload任务出现加载延时,加载延时的现象有如下特点。
加载任务本身是按周期提交(5分钟提交一次),现在每次累积多批次的加载任务总是在同一时间点结束,例如2016-04-13 12-00-00提交的任务会一直卡住,并且最终和2016-04-13 12-00-052016-04-13 12-00-102016-04-13 12-00-152016-04-13 12-00-20这些批次的任务一同结束,所以对于大部分任务都存在很大的加载延时





处理过程
通过分析加载任务客户端日志,发现加载任务总是在往一个Region加载文件时卡住一段时间,具体信息如下:
2016-04-12 11:01:43,867 DEBUG [LoadIncrementalHFiles-0] Going to connect to server region=BAMC_TRANSMON_MFINFO,15#201604051633#F-SSTS0506203BHR3,1459878896188.4d3c12eac9bd683a32e5f832ca4b9336., hostname=pdccsitdwsvr005, port=26003 for row 15#201604051633#F-SSTS0506203BHR3 org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$3.call(LoadIncrementalHFiles.java:554)

2016-04-12 11:06:17,616 DEBUG [LRU Statistics #0] LRU Stats: total=3.59 MB, free=434.16 MB, max=437.75 MB, blocks=0, accesses=30164, hits=0, hitRatio=0cachingAccesses=0, cachingHits=0, cachingHitsRatio=0evictions=0, evicted=0, evictedPerRun=NaN org.apache.hadoop.hbase.io.hfile.LruBlockCache.logStats(LruBlockCache.java:681)

然后分析该region所在RegionServer的日志,发现该region一直在出发compaction操作(HBase会通过compaction来合并hfile,确保hfile个数不会过多导致访问性能下降),并且每次compaction都要耗时30分钟左右,具体信息如下:

2016-04-12 08:39:54,250 INFO  [regionserver26003-largeCompactions-1459938254944] NO General Bloom and NO DeleteFamily was added to HFile (hdfs://hacluster/hbase/BAMC_TRANSMON_MFINFO/4d3c12eac9bd683a32e5f832ca4b9336/.tmp/964e126df68f40e393e68ceda15c20fc)  org.apache.hadoop.hbase.regionserver.StoreFile$Writer.close(StoreFile.java:1274)

2016-04-12 08:39:54,311 INFO  [regionserver26003-largeCompactions-1459938254944] Renaming compacted file at hdfs://hacluster/hbase/BAMC_TRANSMON_MFINFO/4d3c12eac9bd683a32e5f832ca4b9336/.tmp/964e126df68f40e393e68ceda15c20fc to hdfs://hacluster/hbase/BAMC_TRANSMON_MFINFO/4d3c12eac9bd683a32e5f832ca4b9336/C/964e126df68f40e393e68ceda15c20fc org.apache.hadoop.hbase.regionserver.Store.completeCompaction(Store.java:1905)

2016-04-12 08:39:54,493 INFO  [regionserver26003-largeCompactions-1459938254944] Completed compaction of 10 file(s) in C of BAMC_TRANSMON_MFINFO,15#201604051633#F-SSTS0506203BHR3,1459878896188.4d3c12eac9bd683a32e5f832ca4b9336. into 964e126df68f40e393e68ceda15c20fc, size=84.7g; total size for store is 144.5g org.apache.hadoop.hbase.regionserver.Store.compact(Store.java:1105)

2016-04-12 08:39:54,493 INFO  [regionserver26003-largeCompactions-1459938254944] completed compaction: regionName=BAMC_TRANSMON_MFINFO,15#201604051633#F-SSTS0506203BHR3,1459878896188.4d3c12eac9bd683a32e5f832ca4b9336., storeName=C, fileCount=10, fileSize=84.7g, priority=-4997, time=17392197514250797; duration=25mins, 33sec org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest.run(CompactionRequest.java:252)

2016-04-12 08:39:56,739 INFO  [regionserver26003-largeCompactions-1459938254944] Starting compaction on C in region BAMC_TRANSMON_MFINFO,15#201604051633#F-SSTS0506203BHR3,1459878896188.4d3c12eac9bd683a32e5f832ca4b9336. org.apache.hadoop.hbase.regionserver.HRegion.compact(HRegion.java:1232)

2016-04-12 08:39:56,739 INFO  [regionserver26003-largeCompactions-1459938254944] Starting compaction of 10 file(s) in C of BAMC_TRANSMON_MFINFO,15#201604051633#F-SSTS0506203BHR3,1459878896188.4d3c12eac9bd683a32e5f832ca4b9336. into tmpdir=hdfs://hacluster/hbase/BAMC_TRANSMON_MFINFO/4d3c12eac9bd683a32e5f832ca4b9336/.tmp, seqid=243, totalSize=84.9g org.apache.hadoop.hbase.regionserver.Store.compact(Store.java:1084)

2016-04-12 08:39:57,009 INFO  [regionserver26003-largeCompactions-1459938254944] Delete Family Bloom filter type for hdfs://hacluster/hbase/BAMC_TRANSMON_MFINFO/4d3c12eac9bd683a32e5f832ca4b9336/.tmp/8987698ec7724e5297177b0bafa5ea21: CompoundBloomFilterWriter org.apache.hadoop.hbase.regionserver.StoreFile$Writer.<init>(StoreFile.java:1054)

2016-04-12 09:06:46,032 INFO  [regionserver26003-largeCompactions-1459938254944] NO General Bloom and NO DeleteFamily was added to HFile (hdfs://hacluster/hbase/BAMC_TRANSMON_MFINFO/4d3c12eac9bd683a32e5f832ca4b9336/.tmp/8987698ec7724e5297177b0bafa5ea21)  org.apache.hadoop.hbase.regionserver.StoreFile$Writer.close(StoreFile.java:1274)

从上述日志可以看到,每次都是合并了10hfile并且数据量达到80+GB,所以耗时会很长,并且compaction过程当中bulkload是服务导入数据的,导致需要等待compaction结束后瞬间导入完成。最终现象就是加载任务卡住了很久。

查看该region数据目录下的hfile文件,我们发现有9000+hfile,并且hfile数据量都很小KBMB不等,这些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只适合导入大量数据并且导入周期不能太频繁,适用于离线大数据量导入业务。


解决方案
    通过移出该热点region的数据文件,进行人工split分裂后将数据在移入该region,同时预先split多个以天划分的region,确保业务调整前不再有问题。 后期业务现采用put方式

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#20160424startkeyendkey的两个新region已经出来了

此处需要注意以15#20160424endkeyregion为我们后续移入数据的目标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到数据

以上STARTROWENDROW为业务之前实际导入过的数据为准

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#2016042815#20160530日期的key

split 'BAMC_TRANSMON_MFINFO', '15#20160531'


END