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

How to prevent memoryOutOfBound exception while performing HBase Scan?

我对 Caching 、 BlockSize 和 MaxResultSIze 太困惑了。我已经完成了几乎所有的 Whosebug 问题。

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

Caching、Blocksize 和 MaxResultSize 的最佳值应该是多少。

如果有人能举例说明,将会有所帮助。

对于您来说,客户端角度缓存和块大小并不重要,最大结果大小是相关的。

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

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

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

所以这取决于你想用 ScanResults 做什么,如果你想将它们存储在内存中以进行某种内存计算,你应该有足够的内存或更改你的处理逻辑。

希望我能帮上忙。