如何在执行HBase Scan时防止memoryOutOfBound异常?

时间:2016-02-03 12:51:11

标签: hbase

我在Caching,BlockSize和MaxResultSIze之间太混淆了。我已经完成了几乎所有的StackOverFlow问题。

我正在使用Java编写HBase客户端,我想阻止我的客户端出现内存不足问题。

Caching,Blocksize&的最佳值应该是多少? MaxResultSize。

如果有人可以用例子解释,将会有所帮助。

1 个答案:

答案 0 :(得分:1)

对于您的客户端透视缓存和块大小无关紧要,最大结果大小是相关的。

缓存意味着如果hbase应该缓存返回给客户端的扫描值,那么如果再次扫描相同的值,数据将从内存缓存而不是磁盘返回。如果对大量查询使用相同的数据,则可以在Scan对象中启用缓存。例如,当使用100s作业处理最后一小时数据时,如果有足够的内存,则应将最后一小时数据缓存在内存中。基本上缓存与性能有关,不会导致内存不足,而hbase会在服务器端管理缓存内存。

块大小也是hbase服务器端性能相关参数,不会影响客户端内存消耗。

最大结果大小是您应该注意的。如果将每个扫描Result对象或此对象的某些部分存储在客户端应用程序内存中,则应根据可用内存考虑合理的结果计数。但是如果你想要,你可以将完整扫描传递给10s的gb表,并使用扫描结果迭代器处理每个Result in循环,以计算只有512mb或更少内存的表中的行或列键。这不需要您在客户端中存储数据,而在for循环中,Result是临时变量,很快就会被垃圾收集。

所以这取决于你想要对Results的{​​{1}}做什么,如果你想将它们存储在内存中以进行某种内存计算,你应该有足够的内存或改变你的处理逻辑。

我希望,我可以帮忙。