背景:我司作为某运营商公司的技术咨询公司,发现有第三方开发公司在使用HBase 1.1.2 (HDP 2.4.2.258版本)一段时间使用正常后,从某一天开始报OOM,从而导致RegionServer宕机。
BucketCache: Failed allocation for ${block_id}
,org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException: Allocation too big size=21342038
。这虽然不是错误,但其实是个很有用的提示信息,说明可能存在着有许多大的block,无法写入bucketcache读缓存中。java.lang.OutOfMemoryError: Requested array size exceeds VM limit
。至此,故障已被成功排查。对于咨询团队来说,主要的任务已经完成了。
FATAL [IndexRpcServer.handler=5,queue=0,port=60020J regionserver.HRegionServer: Run out of memory; HRegionServer will abort itself immediately
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)
at java.nio.ByteBuffer.allocate(ByteBuffer.java:331)
at org.apache.hadoop.hbase.io.ByteBufferOutputStream.checkSizeAnd6row(ByteBufferOutputStream.java:74)
at org.apache.hadoop.hbase.io.ByteBufferOutputStream.write(ByteBufferOutputStream.java:112) at org.apache.hadoop.hbase.KeyValue.oswrite{KeyVdlue.java:2881)
at org.apache.hadoop.hbase.codec.KeyValueCodec^KeyVdlueEncoder.writetKeyVdlueCodec.java:60)
at org.apache.hadoop.hbase.ipc.IPCUtil.buildCeilBlock(IPCUti1.java:120) at org.apache.hadoop.hbase.ipc.RpcServer$Call.setResponse(RpcServer.java:384)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:128)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:112)
at org.apache.hadoop.hbase.ipc.RpcExecutor$l.run(RpcExecutor.java:92)
at java.lang.Th read.run(Th read.java:745)
参考:HBase BlockCache系列 – 走进BlockCache HBase BlockCache系列 - 探求BlockCache实现机制
BlockCache是Region Server级别的,一个Region Server只有一个Block Cache,在Region Server启动的时候完成Block Cache的初始化工作。读数据时,会先访问blockcache,blockcache没数据则从hdfs读取数据尝试写入读缓存,写失败则会抛warning直接返回数据,否则从读缓存中返回数据。bucketcache是hbase读缓存blockcache的一种实现,听说是由阿里贡献的,其他的还有LRUBlockCache,SlabCache等。大致的发展可以梳理为 LRUBlockCache -> DoubleBlockCache(LRU + Slab) -> CombinedBlockCache(LRU+Bucket)。
bucketcache 可以配置四种模式:none禁用,heap堆内,off-heap堆外,file文件。一般推荐开启,file主要是针对ssd场景,off-heap配置不好会出现另外的direct memory OOM问题,具体计算较复杂,参见Configuring Off-heap Memory (BucketCache) - HortonWorks 。
bucketcache实际上和本次故障的直接关系不大,因为通过源码可以发现IPCUtil获取的outputstream只有堆上的ByteBufferOutputStream,只是其warning信息可以帮我们进一步佐证有异常过大数据的猜想。BucketCache的相关调用和实现逻辑可参见HFileReaderV2
和BucketCache
两个类。
避免此类问题,须注意如下HBase使用技巧:
HBase 查询导致RegionServer OOM故障复盘
原文:http://www.cnblogs.com/lhfcws/p/6346834.html