HBase多线程扫描非常慢

时间:2012-01-19 20:34:53

标签: java multithreading hbase

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

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

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

特别是当我点击我的代码部分时,我注意到显着的减速:

for(Result res : rowScanner){
//add Result To HashMap

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

我认为资源锁定存在某种问题,但我无法看到它。

2 个答案:

答案 0 :(得分:4)

确保在扫描对象(用于创建扫描仪的对象)上设置BatchSizeCaching。它们控制一次通过网络传输的行数,以及在内存中保留多少行以便在RegionServer本身上快速检索。默认情况下,它们都太低而无法提高效率。特别是BatchSize将大大提高您的性能。

编辑:根据评论,听起来您可能在服务器或客户端上交换,或者RegionServer可能没有足够的空间来阻止BlockCache满足您的扫描程序。你给RegionServer多少堆?你检查过它是否在交换?见How to find out which processes are swapping in linux?

此外,您可能希望减少并行扫描的数量,并使每个扫描程序读取更多行。我发现在我的集群上,并行扫描几乎没有比串行扫描更好的改进,因为我是网络绑定的。 如果您的网络最大化,并行扫描实际上会让事情变得更糟。

答案 1 :(得分:1)

您是否考虑过使用MapReduce,可能只是一个映射器可以轻松地将扫描分割到区域服务器上?它比担心HBase客户端库中的线程和同步更容易。 Result类不是线程安全的。 TableMapReduceUtil可以轻松设置工作。