大家好,如果您还对深入解析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的Caching、setMaxResultSize与setBatch参数】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于有人把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位网友表示赞同!