我是hbase的新手,下面的问题可能看起来很愚蠢!我提前道歉:)
我们有一个用例,我们需要在hbase中存储一些大数据,每行几乎是30mb,我们将它存储在6列中,每列5mb,对于一些元数据存储在2列中,所有这些都在一个列族中。我们有两种类型的数据,我们使用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()
通过增加 hbase.rpc.timeout
我阻止 SocketTimeoutException
,但区域服务器仍在下降 next()
有时候。
第一, scanner.next()
例如,需要60秒,但接下来 scanner.next()
快速回答(比如1秒)。
正如我之前提到的,我不关心返回哪一行,我只想得到一行并返回它。
你知道怎样提高汽车的速度吗 scanner.next()
阻止它杀死区域服务器?
1条答案
按热度按时间7bsow1i61#
首先,你说的3簇是什么意思?我想你想说的是3节点集群。
现在,对于解决方案4gb(是节点的总内存吗?)ram对于hbase来说根本不够,除非它是一个本地vm。
为hbase分配的理想堆不应小于8gb。现在我建议对代码进行一些修改
将扫描缓存添加到扫描仪理想情况下应该是200到750左右,但在您的情况下,从较低的值开始
在hbase表上启用压缩
如果将来您有足够的处理能力和内存,请尝试端点协处理器
检查工作台上是否未发生严重压实。让它完成,然后尝试启动扫描
在hbase表上启用bloom筛选器
最后但并非最不重要的不要忘记关闭结果扫描仪