HBase多线程扫描真的很慢

sha*_*nar 2 java multithreading hbase

我正在使用 HBase 来存储一些时间序列数据。根据 O'Reilly HBase 书中的建议,我使用的行键是带有加盐前缀的数据的时间戳。为了查询这些数据,我生成了多个线程,这些线程在一系列时间戳上实现扫描,每个线程处理特定的前缀。然后将结果放入并发哈希图中。

当线程尝试执行扫描时会出现问题。串行完成时通常需要大约 5600 毫秒的查询在生成 6 个线程(对应于 6 个盐/区域服务器)时需要 40000 到 80000 毫秒。

我尝试使用 HTablePools 来解决我认为 HTable 不是线程安全的问题,但这并没有带来任何更好的性能。

特别是,当我执行这部分代码时,我注意到速度显着减慢:

for(Result res : rowScanner){
//add Result To HashMap
Run Code Online (Sandbox Code Playgroud)

通过记录,我注意到每次通过循环的条件时,我都会经历很多秒的延迟。如果我强制线程串行执行,这些延迟就不会发生。

我认为资源锁定存在某种问题,但我只是看不到它。

Chr*_*ain 5

确保您在扫描对象(用于创建扫描程序的对象)上设置BatchSize缓存。这些控制一次通过网络传输多少行,以及将多少行保留在内存中以便在 RegionServer 本身上快速检索。默认情况下,它们都太低而效率低下。BatchSize 尤其会显着提高您的性能。

编辑:根据评论,听起来您可能在服务器或客户端上进行交换,或者 RegionServer 的 BlockCache 中可能没有足够的空间来满足您的扫描仪的要求。您给 RegionServer 分配了多少堆?你检查过是否正在交换吗?请参阅如何找出 Linux 中哪些进程正在交换?

此外,您可能希望减少并行扫描的数量,并使每个扫描仪读取更多行。我发现在我的集群上,并行扫描相对于串行扫描几乎没有任何改进,因为我受网络限制。 如果您的网络已达到极限,并行扫描实际上会使情况变得更糟。