Hbase ResultScanner.next() 第一次响应需要很长时间
Posted
技术标签:
【中文标题】Hbase ResultScanner.next() 第一次响应需要很长时间【英文标题】:Hbase ResultScanner.next() take to long to respond at first time 【发布时间】:2015-09-15 05:31:40 【问题描述】:我是 Hbase 的新手,我的以下问题可能看起来很愚蠢!我提前道歉:)
我们有一个用例,我们需要在 Hbase 中存储一些大数据,每行几乎 30MB,我们将其存储在 6 列中,每列 5MB 和 2 列用于一些元数据,都在一个列族中。我们有两种类型的数据,我们使用 Hbase 作为一些大队列!
我们在 Hbase 中创建了两个表,分别命名为 TableA 和 TableB。我们必须插入数据(来自 A 或 B 类型),并且我们有一个 pull 函数,该函数应该获取一行(A 或 B 类型),将其返回并从表中删除。
我们有 3 个具有 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()
的第一次调用打击了 regionServers(即使存储的数据几乎很小(8k 行))并且通过增加 hbase.rpc.timeout
我阻止了 SocketTimeoutException
,但 regionServers 有时仍然会在第一次 next()
中下降。
首先,scanner.next()
需要 60 秒,但接下来 scanner.next()
s 会快速回答(比如 1 秒)。
正如我之前提到的,我不关心返回哪一行,我只想获取一行并返回它。
您对如何提高scanner.next()
的速度并防止它杀死regionServers 有任何想法吗?
【问题讨论】:
【参考方案1】:首先,您所说的 3 个集群是什么意思?我想你的意思是3节点集群。
现在至于解决方案 4Gb(它是 Node 的总内存吗?) ram 对于 Hbase 来说根本不够用,除非它是本地 VM。
为 HBase 分配的理想堆不应小于 8Gb。 现在我建议对代码进行一些修改
向扫描仪添加扫描缓存,理想情况下它应该在 200 到 750 左右,但在您的情况下,从较低的值开始 在 HBase 表上启用压缩 如果将来您有足够的处理能力和内存,请尝试端点协处理器 检查表上是否没有发生重大压缩。让它完成,然后尝试启动扫描 在 HBase 表上启用布隆过滤器 最后但并非最不重要的一点是不要忘记关闭结果扫描器【讨论】:
以上是关于Hbase ResultScanner.next() 第一次响应需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章
HBase学习01(HBase入门及HBase Shell简单操作)