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简单操作)

HBase学习01(HBase入门及HBase Shell简单操作)

hbase实战 hbase权威指南哪本好书

Hbase记录-Hbase配置项

hbase系列之初识hbase

HBase实战 | Hive数据导入云HBase