Hbase ResultScanner.next() 第一次响应需要很长时间
Hbase ResultScanner.next() take to long to respond at first time
我是 Hbase 的新手,我的以下问题可能看起来很愚蠢!我提前道歉:)
我们有一个用例,我们需要在 Hbase 中存储一些大数据,每行将近 30MB,我们将其存储在 6 列中,每列 5MB,一些元数据的 2 列都在一个列族中。我们有两种类型的数据,我们将 Hbase 用作 一些大队列 !
我们在Hbase中创建了两个table,分别命名为TableA和TableB。我们必须插入数据(来自类型 A 或 B)并且我们有一个拉取函数,它应该获取一行(类型 A 或 B),return 它并从 table 中删除它。
我们有三个具有 4GB RAM 和足够存储空间的集群节点。
对于那个工作,在 Java 中,我做了一个 ResultScanner
,获取第一行的键,然后用 Get
检索整行,如下所示 [=21] =]
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()
的回答很快(比如 1 秒)。
正如我之前提到的,我不关心哪一行 return,我只想得到一行 return 它。
你知道如何提高 scanner.next()
的速度并防止它杀死 regionServers 吗?
首先,你所说的3簇是什么意思?我想你的意思是3节点集群。
现在解决方案4Gb(是Node的总内存吗?)ram根本不够用Hbase,除非是本地VM。
为HBase分配的理想堆不应小于8Gb。
现在我建议对代码进行一些修改
- 向扫描器添加扫描缓存,理想情况下它应该在 200 到 750 左右,但在您的情况下,从较低的值开始
- 在 HBase 上启用压缩 table
- 如果将来您有足够的处理能力和内存,请尝试端点协处理器
- 检查 table 上是否没有发生重大压缩。让它完成然后尝试启动扫描
- 在 HBase 上启用布隆过滤器 tables
- 最后但同样重要的是不要忘记关闭结果扫描器
我是 Hbase 的新手,我的以下问题可能看起来很愚蠢!我提前道歉:)
我们有一个用例,我们需要在 Hbase 中存储一些大数据,每行将近 30MB,我们将其存储在 6 列中,每列 5MB,一些元数据的 2 列都在一个列族中。我们有两种类型的数据,我们将 Hbase 用作 一些大队列 !
我们在Hbase中创建了两个table,分别命名为TableA和TableB。我们必须插入数据(来自类型 A 或 B)并且我们有一个拉取函数,它应该获取一行(类型 A 或 B),return 它并从 table 中删除它。
我们有三个具有 4GB RAM 和足够存储空间的集群节点。
对于那个工作,在 Java 中,我做了一个 ResultScanner
,获取第一行的键,然后用 Get
检索整行,如下所示 [=21] =]
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()
的回答很快(比如 1 秒)。
正如我之前提到的,我不关心哪一行 return,我只想得到一行 return 它。
你知道如何提高 scanner.next()
的速度并防止它杀死 regionServers 吗?
首先,你所说的3簇是什么意思?我想你的意思是3节点集群。
现在解决方案4Gb(是Node的总内存吗?)ram根本不够用Hbase,除非是本地VM。
为HBase分配的理想堆不应小于8Gb。 现在我建议对代码进行一些修改
- 向扫描器添加扫描缓存,理想情况下它应该在 200 到 750 左右,但在您的情况下,从较低的值开始
- 在 HBase 上启用压缩 table
- 如果将来您有足够的处理能力和内存,请尝试端点协处理器
- 检查 table 上是否没有发生重大压缩。让它完成然后尝试启动扫描
- 在 HBase 上启用布隆过滤器 tables
- 最后但同样重要的是不要忘记关闭结果扫描器