深入解析HBase Scan的Caching、setMaxResultSize与setBatch参数

更新:11-15 名人轶事 我要投稿 纠错 投诉

大家好,如果您还对深入解析HBase Scan的Caching、setMaxResultSize与setBatch参数不太了解,没有关系,今天就由本站为大家分享深入解析HBase Scan的Caching、setMaxResultSize与setBatch参数的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

.setCache(缓存大小?字节数?行数?).setMaxResultSize(最大结果数?).setBatch(批处理?) 造成这种麻烦的很大原因是命名问题。

我先下个结论吧。如果把名字改成下面这样,语义就会清晰很多。 [1]

.setCaching=.setNumberOfRowsFetchSize(客户端每次取的行数).setMaxResultSize=.setMaxResultByteSize(客户端缓存的最大字节数).setBatch=.setColumnsChunkSize(客户端每次取的列数) :010 -1010 每次HBase扫描的数据量可能比较大,客户端不会一次性从服务器拉回所有数据。相反,它通过多个rpc 批量拉取。类似于TCP协议中的分段传输,可以实现细粒度的流量控制。至于如何调优和控制每个rpc拉取的数据量,可以通过上面三个蛋疼的参数来控制。

我们可以先看一下HBase扫描中核心类ClientScanner中的读取逻辑来了解整个流程。

@覆盖

公共结果next() 抛出IOException {

//如果扫描仪关闭并且缓存中没有任何内容,则接下来是无操作。

if (cache.size()==0 this.close) {

返回空值;

}

//缓存中没有数据可供RPC 调用读取。

if (cache.size()==0) {

加载缓存();

}

//如果缓冲区中有东西,则直接从缓存中取出。

if (cache.size() 0) {

返回缓存.poll();

}

//如果我们在调用close 之前耗尽此扫描仪,请写出扫描指标

writeScanMetrics();

返回空值;

}每次从cache缓存中读取数据时,如果缓存为空,则使用loadCache。其实缓存是通过链表实现的,定义如下:

受保护的最终LinkedListcache=new LinkedList();

继续看loadCache()。为了弄清楚主要流程,我删除了部分代码。

protected void loadCache() 抛出IOException {

结果[]值=null;

//最大剩余容量

长剩余结果大小=maxScannerResultSize;

//行数就是setCaching的值

int 倒计时=this.caching;

//配置rpc请求数

callable.setCaching(this.caching);

布尔服务器HasMoreResults=false;

//做while循环,循环次数就是rpc的次数

做{

尝试{

//rpc从服务器拉取数据。请求的项目数是this.caching。默认值为Integer.Max_VALUE。

值=调用(可调用,调用者,scannerTimeout);

} catch (DoNotRetryIOException | NeedUnmanagedConnectionException e) {

//这里跳过异常处理

}

//在添加之前整理我们从服务器返回的结果数组

//将结果存入扫描仪的缓存

//在将数据放入缓存之前,对数据进行一些处理,主要处理一些调用不可见的数据。

列出要添加到缓存的结果=

getResultsToAddToCache(values, callable.isHeartbeatMessage());

if (!resultsToAddToCache.isEmpty()) {

//遍历结果并写入缓存

for (结果rs : resultsToAddToCache) {

缓存.add(rs);

//我们这里不做迭代器

对于(单元格: rs.rawCells()){

//估计每个单元的大小并计算剩余字节大小

剩余结果大小-=CellUtil.estimatedHeapSizeOf(cell);

}

//剩余行数--

倒计时——;

this.lastResult=rs;

}

}

//我们期望当我们耗尽时服务器不会为我们提供更多结果

//返回结果的大小(字节或计数)。如果服务器*确实*通知我们

//还有更多结果,我们希望避免可能的NextScanner(.)。只有当我们真正

//获取结果是moreResults 上下文有效。

if (null !=值values.length 0 callable.hasMoreResultsContext()) {

serverHasMoreResults=callable.getServerHasMoreResults()partialResults.isEmpty();

}

//Values==null 表示服务器端过滤器已确定我们必须停止

while (doneWithRegion(remainingResultSize, 倒计时, serverHasMoreResults)

(!partialResults.isEmpty() ||可能NextScanner(倒计时,值==null)));

//循环条件

}这里重点关注do while循环的条件doneWithRegion()

/**

* @参数剩余结果大小

* @参数剩余行

* @param 区域HasMoreResults

*/

私人布尔doneWithRegion(长剩余结果大小,int剩余行,

布尔区域HasMoreResults) {

//只有同时满足这些才可以在这里完成

//剩余ResultSize的初始值为配置的setMaxResultSize

//remainingRows的初始值为配置的setCaching(实际上是:行数)

返回剩余结果大小0 剩余行0 !regionHasMoreResults;

}因为每个while循环都会进行一次rpc调用,不同的参数配置组合会导致rpc调用的次数不同。必须同时满足行数和字节数的限制。

1. Client Scan 原理及相关源码解读

这些参数对应的配置如下

hbase.client.scanner.caching - (setCaching):HBase-0.98的默认值为100,HBase-1.2的默认值为2147483647,即Integer.MAX_VALUE。 Scan.next() 的RPC 请求获取的记录数。配置建议:这个参数与 下面的hbase.client.scanner.max.result.size - (setMaxResultSize)配置使用,在网络状况良好的情况下,自定义设置不宜太小, 可以直接采用默认值,不配置。hbase.client.scanner.max.result.size - (setMaxResultSize):HBase-0.98没有此配置,HBase-1.2默认值为210241024,即2M。 Scan.next() 的RPC 请求获取的数据量。目前,HBase-1.2实际上在Caching为默认值(Integer Max)时使用此参数来控制RPC的数量和流量。配置建议:如果网络状况较好(万兆网卡),scan 的数据量非常大,可以将这个值配置高一点。如果配置过高:则可能 loadCache 速度比较慢,导致 scan timeout 异常hbase.server.scanner.max.result.size:服务器配置。 HBase-0.98没有这个配置。它是HBase-1.2中新添加的。默认值为10010241024,即100M。该参数表示Scan.next()发起RPC后服务器返回给客户端的最大字节数,以防止Server OOM。 [2]

用户评论

日久见人心

终于有人把Hbase scan这些参数解释清楚了!

    有17位网友表示赞同!

把孤独喂饱

一直对效率有困惑,感谢分享这篇文章,让我更了解这些设置的影响。

    有19位网友表示赞同!

迷路的男人

看了之后才知道缓存和最大结果大小怎么用啊,之前都一知半解。

    有11位网友表示赞同!

栀蓝

感觉文章讲解的很详细,终于明白setBatch的参数的作用了!

    有6位网友表示赞同!

怅惘

以前一直不知道HBase Scan的使用方法,这篇文章帮助我入门了。

    有18位网友表示赞同!

惦着脚尖摘太阳

原来 Hbase scan 的运用这么丰富,还有这么多细节需要注意呀!

    有13位网友表示赞同!

疲倦了

这下不用再在搜索引擎上找资料了,这篇文章解决了我所有疑问!

    有20位网友表示赞同!

命硬

分享的文章太棒了,简单易懂又全面解决了我的困扰。

    有6位网友表示赞同!

微信名字

之前觉得HBase scan太复杂了,现在看了文章感觉好懂多了。

    有19位网友表示赞同!

搞搞嗎妹妹

这篇文章是我学习HBase的好资料,感谢作者的辛苦付出!

    有19位网友表示赞同!

情字何解ヘ

终于不再迷茫了,有了这个指南,我就能更好地使用 HBase Scan 了。

    有6位网友表示赞同!

遗憾最汹涌

以前觉得设置参数很困难,现在看到这篇文章后感觉很简单了。

    有16位网友表示赞同!

无关风月

文章讲解深入浅出,让Hbase scan变得容易理解!

    有18位网友表示赞同!

敬情

可以用来参考教程,学习如何操作和配置 HBase Scan。

    有19位网友表示赞同!

她的风骚姿势我学不来

很有用!希望作者能继续分享更多关于 HBase 的优质内容。

    有16位网友表示赞同!

不浪漫罪名

非常感谢分享这篇文章,为我的HBase学习贡献了力量!

    有15位网友表示赞同!

残留の笑颜

以后学习相关技术就可以参考这个指南了!

    有20位网友表示赞同!

盲从于你

真不错!这篇文章让我对Hbase更感兴趣了!

    有17位网友表示赞同!

【深入解析HBase Scan的Caching、setMaxResultSize与setBatch参数】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:四川凉山西昌建昌古城大通门城墙:历史见证下的生命顽强奇迹 下一篇:新手必看!UC网盘、百度网盘、迅雷网盘拉新攻略:靠谱平台对接及推广不扣数据量揭秘