HBase Scan Timeout-OutOfOrderScannerNextException
最近迁移数据时需要执行大Scan,HBase集群经常碰到以下日志:
Exception in thread "main" org.apache.hadoop.hbase.DoNotRetryIOException: Failed after retry of OutOfOrderScannerNextException: was there a rpc timeout?
出现上述日志后这次Scan就挂了,HBase Client不能自动恢复了。下面分析一下相关代码。
客户端Scan示例如下:
Scan scan = new Scan();
scan.setStartRow(...);
scan.setStopRow(...);
scan.setCaching(20);
Result result;
try (ResultScanner rs = table.getScanner(scan)) {
while ((result = rs.next()) != null) {
// deal with result
}
}
table.getScanner(scan)做了什么:
初始化一个ScannerCallable对象,调用call(),这个call()会发送一个特殊的ScanRequest rpc请求给
数据所在的RS(定位RS的过程不在本文讨论范围),RS收到请求后发现request中没有scanner id,认为这是一个全新的Scan请求,RS会分配一个该RS全局唯一的scanner id,这个id会返回给客户端供这个Scan后续的ScanRequest使用。同时会为这个scan分配一个数据迭代器RegionScannerImpl(具体取数据逻辑看HBase Scan流程分析),将RegionScannerImpl和对应的元数据HRegion包装到RegionScannerHolder中,放入以下map,如下所示:
protected long addScanner(RegionScanner s, HRegion r) throws LeaseStillHeldException {
long scannerId = this.scannerIdGen.incrementAndGet();
String scannerName = String.valueOf(scannerId);
RegionScannerHolder existing =
scanners.putIfAbsent(scannerName, new RegionScannerHolder(s, r));
assert existing == null : "scannerId must be unique within regionserver's whole lifecycle!";
this.leases.createLease(scannerName, this.scannerLeaseTimeoutPeriod,
new ScannerListener(scannerName));
return scannerId;
}
最后,RS会为这个Scanner创建一个Lease,有效期60s,这个以后再说,用于控制大Scan无限的占用RS资源。可以看出,这里第一次调ScannerCallable的call(),实际上没有从RS获取到实际数据,而是做了一些初始化工作,例如获取到scanner id.
2. next()做了什么
第一次next()从RegionServer取回20条记录缓存在client本地,后续19次next直接从本地取,不需要访问RS,第21次继续向RS取20条,如果向RS取数据时,客户端超时了,那么client不会自动从scan成功的最后一个rowkey的下一个rowkey开始取数据。而是抛给上层应用解决。
每次向RS获取数据都调用ScannerCallable的call(),由于上面已经获取到了scanner id,这里构造ScanRequest都会带着这个scanner id,并且每次都会返回实际的数据。由于client的一个Scan可能需要多次向RS取数据,为了保证客户端顺序的得到所有数据不漏,Client和RS都维护一个nextCallSeq字段,客户端每次得到RS的一批数据后,将nextCallSeq加1供后续ScanRequest使用。RS端同样,每次接受到ScanRequest都将对应的nextCallSeq加1,如果客户端在每次获取数据超时了,那么client的nextCallSeq没有加1,后续RS收到ScanRequest发现nextCallSeq匹配不上,RS会抛出OutOfOrderScannerNextException,客户端看到这种异常不进行retry,直接抛出next().
碰到这种异常,一个规避的方法就是scan.setCaching()设置小点。另外,一个就是在应用中重试,每次将最后一次Scan得到的最后一个rowkey记下来,一旦出现这种问题,就重新起一个Scan,设置startkey,但是这样的问题是重试后得到的数据是不是一致的:RS端为了维护一次Scan的数据是一致的,在getScanner()里初始化迭代器RegionScannerImpl时将当前的mvcc read point保存了下来,所以如果重启一个新的Scan,read point很可能不一样。
####参考文献
[HBase-0.98.9](https://github.com/apache/hbase/tree/0.98)
HBase Scan Timeout-OutOfOrderScannerNextException的更多相关文章
- <HBase><Scan>
Overview The Scan operation for HBase. Scan API All operations are identical to Get with the excepti ...
- HBase Scan流程分析
HBase Scan流程分析 HBase的读流程目前看来比较复杂,主要由于: HBase的表数据分为多个层次,HRegion->HStore->[HFile,HFile,...,MemSt ...
- HBase Scan,Get用法
Scan,get用法 1. get help帮助信息 从下列get用法信息可以看出 get 后面可以跟table表名,rowkey,以及column,value.但是如果想通过get直接获取一个表中的 ...
- HBase scan 时 异常 ScannerTimeoutException 解决
org.apache.Hadoop.hbase.client.ScannerTimeoutException: 60622ms passed since the last invocation, ti ...
- hbase scan 的例子
/** * Created by han on 2016/1/28. */ import org.apache.hadoop.conf.Configuration; import org.apache ...
- HBase scan setBatch和setCaching的区别
HBase的查询实现只提供两种方式: 1.按指定RowKey获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get) 2.按指定的条件获取一批记录,scan ...
- HBase scan setBatch和setCaching的区别【转】
转自:http://blog.csdn.net/caoli98033/article/details/44650497 HBase的查询实现只提供两种方式: 1.按指定RowKey获取唯一一条记录,g ...
- HBase scan shell操作详解
创建表 create 'test1', 'lf', 'sf' lf: column family of LONG values (binary value) -- sf: column family ...
- Hbase Scan的重要参数
Scan是操作Hbase中非常常用的一个操作,虽然前面的Hbase API操作简单的介绍了Scan的操作,但不够详细,由于Scan非常常用,关于其详细的整理也是很有必要的. Scan HBase中的数 ...
随机推荐
- Ubuntu server 搭建Git server
Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客户端用户的本地都是一个版本管理控制器. Ubuntu server 版本为12.04 搭建步骤如下: ...
- Xshell中文乱码问题
1. 先查看当前使用的语言: echo $LANG 2. 查看系统的语言安装包: locale 3. 如果没有中文安装包(包含zh_CN字样),需要网络或者自己上传安装包,安装 4. 有了中文 ...
- 用户管理 之 在Linux系统中,批量添加用户的操作流程
一.阅读此文件您需要掌握的基础知识: <Linux 用户(user)和用户组(group)管理概述><用户(user)和用户组(group)配置文件详解><Linux 用 ...
- .NET 程序在 Windows XP 下调用 SHA512CryptoServiceProvider 方法报 PlatformNotSupportedException 异常
转自:http://stackoverflow.com/questions/1293905/sha256cryptoserviceprovider-and-related-possible-to-us ...
- 彻底解决Android SDK Manager更新慢的问题
Android SDK 下载速度慢,解决方法大概有两种.第一,FQ.这种方法比较彻底,但是要想有稳定的效果还的要花大价钱.第二,有些高人直接给了SDK中各软件的下载地址,直接下载速度非常快,下载后将包 ...
- distri.lua的web运维工具
我的新手游项目很快就要进入到寻找发行商的环节,最近几天相对较空闲,逐将工作重心转移到服务器组运维工具的制作上. 回想一年之前经历的那个不算成功的端游项目,因为运维工具设计得不合理,使用十分不方便,游戏 ...
- Winform 数据库连接app.config文件配置 数据库连接字符串
1.添加配置文件 新建一个winform应用程序,类似webfrom下有个web.config,winform下也有个App.config;不过 App.config不是自动生成的需要手动添加,鼠标右 ...
- 即将放出ITSEC第一期所有培训视频
课程大概被分为三个章节 客户端安全培训 安全工具培训 服务端安全培训 部分PPT 详细课程表 FireBug代码调试工具使用:工具介绍 FireBu ...
- 解决tomcat启动Socket监听端口死循环被hold问题
原文链接:http://blog.csdn.net/dead_cicle/article/details/7073433 1.SOCKET监听置于servlet的init方法中,在web.xml里加入 ...
- 初探Stage3D(二) 了解AGAL
关于本文 本文并无打算事无巨细的介绍一遍AGAL,仅仅是对现有文档的一些理解及汇总,所以请先阅读相参考文档 AGAL概念 参考资料 http://www.adobe.com/devnet/flashp ...