异常HBase篇【CallQueueTooBigException】"/>
Spark1.x升级Spark2.x常见异常HBase篇【CallQueueTooBigException】
一.HBase之CallQueueTooBigException
查看RpcServer.java【路径:hbase-2.1.0-src\hbase-2.1.0\hbase-server\src\main\java\org\apache\hadoop\hbase\ipc】源代码可知,报CallQueueTooBigException异常的原因是,RPC队列过大!具体到此处的原因是:Spark升级到2.x版本后,性能大幅提升,同时因HBase升级大2.1导致使用Spark往HBase同步数据的效率大幅增加,进而增加了对HBase RPC的负担。Spark同步HBase是使用RPC【远程过程调用】,因此RPC的queue大小对大数据环境这种高并发的情况来说就是息息相关了!源代码注释信息如下:
* Maximum size in bytes of the currently queued and running Calls. If a new Call puts us over* this size, then we will reject the call (after parsing it though). It will go back to the* client and client will retry. Set this size with "hbase.ipc.server.max.callqueue.size". The* call queue size gets incremented after we parse a call and before we add it to the queue of* calls for the scheduler to use. It get decremented after we have 'run' the Call. The current* size is kept in {@link #callQueueSizeInBytes}.* @see #callQueueSizeInBytes* @see #DEFAULT_MAX_CALLQUEUE_SIZE
当前排队和正在运行的呼叫的最大大小(以字节为单位)。 如果一个新的呼叫使我们超出此大小,则我们将拒绝该呼叫(尽管在解析之后)。 它将返回到客户端,客户端将重试。 使用“ hbase.ipc.server.max.callqueue.size”设置此大小。 在解析呼叫之后,然后将其添加到呼叫队列以供调度程序使用之前,呼叫队列大小会增加。 在我们“运行”呼叫后,它会减少。 当前大小保留在callQueueSizeInBytes中。
源码如下:
protected static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;
二.解决方案
根据情况可知,增加queue是解决问题的最直接办法。其中又包括两种方式:
1.修改hbase-site.xml
<property><name>hbase.ipc.server.max.callqueue.size</name><value>2140000000</value>
</property>
优缺点:
- 优点:无需各种应用都添加相关配置,维护简单!
- 缺点:需要修改环境配置,需要重启HBase!
2.在程序中动态指定【以Spark程序为例】
在HBase入口添加一下配置:
config.set("hbase.ipc.server.max.callqueue.size", "2140000000") // 设置最大queue大小
注意:添加该配置值不能超过2G,否则会报错,HBASE启动不了,因为JAVA integer 最大值限制!
更多推荐
Spark1.x升级Spark2.x常见异常HBase篇【CallQueueTooBigException】
发布评论