我是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?
答案 0 :(得分:1)
首先,你的意思是3群集?我想你的意思是3节点集群。
现在至于解决方案4Gb(它是Node的总内存吗?)ram对Hbase来说根本不够,除非它是本地虚拟机。
为HBase分配的理想堆不应小于8Gb。 现在我建议对代码进行一些修改