Hbase ResultScanner.next()需要很长时间才能响应

时间:2015-09-15 05:31:41

标签: java hadoop hbase bigdata

我是Hbase的新手,我的以下问题可能看起来很傻!我提前道歉:)

我们有一个用例,我们需要在Hbase中存储一些大数据,每行大约30MB,我们将它存储在6列,每列5MB,一列元数据中的一些元数据。我们有两种类型的数据,我们使用Hbase作为一些大队列

我们在Hbase中创建了两个表,名为TableA和TableB。我们必须插入数据(来自类型A或B),我们有一个pull函数,它应该得到一行(类型A或B),返回它并从表中删除它。

我们有三个集群节点,4GB RAM和足够的存储空间。

对于那份工作,在Java中,我创建一个ResultScanner,获取第一行的密钥,并使用Get检索整行,如下所示

Scan scanA = new Scan();
scanA.addColumn(familyByteArray, oneSmallColumnByteArray);
ResultScanner scanner = tblA.getScanner(scanA);

// The big problem is here, this blows region servers and takes too long 
// to respond
Result r = scanner.next();

// no problem here
Get get = new Get(r.getRowKey());
r = tblA.get(get);

第一次scanner.next()调用打击区域服务器(甚至存储的数据几乎都很小(8k行))并且通过增加hbase.rpc.timeout我阻止SocketTimeoutException,但是regionServers仍然在有时候会先next()

首先,scanner.next()需要60秒,但下一个scanner.next()的答案会很快(例如1秒)。

正如我之前提到的,我不关心哪一行返回,我只想获得一行并将其返回。

您是否知道如何提高scanner.next()的速度并防止它杀死regionServers?

1 个答案:

答案 0 :(得分:1)

首先,你的意思是3群集?我想你的意思是3节点集群。

现在至于解决方案4Gb(它是Node的总内存吗?)ram对Hbase来说根本不够,除非它是本地虚拟机。

为HBase分配的理想堆不应小于8Gb。 现在我建议对代码进行一些修改

  • 理想情况下,扫描缓存会添加到扫描程序中,大约应该在200到750之间,但在您的情况下,请使用较低的值
  • 在HBase表上启用压缩
  • 如果您将来有足够的处理能力和内存,请尝试使用Endpoint Coprocessor
  • 检查表格上是否没有发生重大压缩。让它完成,然后尝试触发扫描
  • 在HBase表上启用bloom过滤器
  • 最后但并非最不要忘记关闭结果扫描程序