【HBase异常】“java.lang.OutOfMemoryError: Requested array size exceeds VM limit”

使用版本CDH5.4.5,HBase1.0.0

刚来新公司不久就出现RegionServer宕机事件,报的异常如下:


2017-05-12 21:15:26,396 FATAL [B.defaultRpcServer.handler=123,queue=6,port=60020] regionserver.RSRpcServices: Run out of memory; RSRpcServices 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.checkSizeAndGrow(ByteBufferOutputStream.java:77)

at org.apache.hadoop.hbase.io.ByteBufferOutputStream.write(ByteBufferOutputStream.java:116)

at org.apache.hadoop.hbase.KeyValue.oswrite(KeyValue.java:2532)

at org.apache.hadoop.hbase.KeyValueUtil.oswrite(KeyValueUtil.java:548)

at org.apache.hadoop.hbase.codec.KeyValueCodec$KeyValueEncoder.write(KeyValueCodec.java:58)

at org.apache.hadoop.hbase.ipc.IPCUtil.buildCellBlock(IPCUtil.java:122)

at org.apache.hadoop.hbase.ipc.RpcServer$Call.setResponse(RpcServer.java:376)

at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)

at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)

at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)

at java.lang.Thread.run(Thread.java:745)

重点关注:“ Requested array size exceeds VM limit”

在 openjdk里面有限制数组的大小为2的31次方-2 ,如果超过这个大小,jvm就会报错。

《【HBase异常】“java.lang.OutOfMemoryError: Requested array size exceeds VM limit”》 屏幕快照 2017-06-21 下午9.36.08.png

这里其实可以肯定是HBase的ipc里面的一个bug,在某些情况下,创建的数组长度超过jvm的限制,通过搜索,找到了一个patch,修复就是这个问题。HBASE-14598 ,主要修改数组的长度,如果超过这个就会直接发送异常给客户端。直接原因就是,但是对于一个运维来说,其实更想知道到底是那张表的请求导致这个问题?

我们有打了一个patch,HBASE-16033 ,提供更多的log,最后找到了类型下面的日志:


[B.defaultRpcServer.handler=90,queue=12,port=60020] ipc.RpcServer: (responseTooLarge): {"processingtimems":2822,"call":"Multi(org.apache.hadoop.hbase.protobuf.generated.ClientProtos$MultiRequest)","client":"10.120.69.147:43481","param":"region= ., for 1 actions and 1st row key=A","starttimems":1494609020832,"queuetimems":0,"class":"HRegionServer","responsesize":31697082,"method":"Multi"}

这里主要是responsesize,就是一次返回的数据量太大了导致了这个问题。

另外,在搜索过程中,也找到有人出现了类似问题,[类似](<a>http://www.cnblogs.com/lhfcws/p/6346834.html),基本跟我们的类型。值得注意的是两个patch是:” target=”_blank”>HBASE-14946 和 [HBASE-14978](<a>https://issues.apache.org/jira/browse/HBASE-14978),解决批量读写超过限制的问题。上面的pathc</a>是解决不要报错问题,下面的才是根据。

看来需要找时间赶快升级。希望对你有帮助。

    原文作者:曾小展
    原文地址: https://www.jianshu.com/p/11e5da659b90
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞