最近迁移数据时需要执行大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
}
}
  1. 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的更多相关文章

  1. <HBase><Scan>

    Overview The Scan operation for HBase. Scan API All operations are identical to Get with the excepti ...

  2. HBase Scan流程分析

    HBase Scan流程分析 HBase的读流程目前看来比较复杂,主要由于: HBase的表数据分为多个层次,HRegion->HStore->[HFile,HFile,...,MemSt ...

  3. HBase Scan,Get用法

    Scan,get用法 1. get help帮助信息 从下列get用法信息可以看出 get 后面可以跟table表名,rowkey,以及column,value.但是如果想通过get直接获取一个表中的 ...

  4. HBase scan 时 异常 ScannerTimeoutException 解决

    org.apache.Hadoop.hbase.client.ScannerTimeoutException: 60622ms passed since the last invocation, ti ...

  5. hbase scan 的例子

    /** * Created by han on 2016/1/28. */ import org.apache.hadoop.conf.Configuration; import org.apache ...

  6. HBase scan setBatch和setCaching的区别

    HBase的查询实现只提供两种方式: 1.按指定RowKey获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get) 2.按指定的条件获取一批记录,scan ...

  7. HBase scan setBatch和setCaching的区别【转】

    转自:http://blog.csdn.net/caoli98033/article/details/44650497 HBase的查询实现只提供两种方式: 1.按指定RowKey获取唯一一条记录,g ...

  8. HBase scan shell操作详解

    创建表 create 'test1', 'lf', 'sf' lf: column family of LONG values (binary value) -- sf: column family ...

  9. Hbase Scan的重要参数

    Scan是操作Hbase中非常常用的一个操作,虽然前面的Hbase API操作简单的介绍了Scan的操作,但不够详细,由于Scan非常常用,关于其详细的整理也是很有必要的. Scan HBase中的数 ...

随机推荐

  1. Ubuntu server 搭建Git server

    Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客户端用户的本地都是一个版本管理控制器. Ubuntu server 版本为12.04 搭建步骤如下: ...

  2. Xshell中文乱码问题

    1.  先查看当前使用的语言: echo $LANG 2.  查看系统的语言安装包: locale 3.  如果没有中文安装包(包含zh_CN字样),需要网络或者自己上传安装包,安装 4.  有了中文 ...

  3. 用户管理 之 在Linux系统中,批量添加用户的操作流程

    一.阅读此文件您需要掌握的基础知识: <Linux 用户(user)和用户组(group)管理概述><用户(user)和用户组(group)配置文件详解><Linux 用 ...

  4. .NET 程序在 Windows XP 下调用 SHA512CryptoServiceProvider 方法报 PlatformNotSupportedException 异常

    转自:http://stackoverflow.com/questions/1293905/sha256cryptoserviceprovider-and-related-possible-to-us ...

  5. 彻底解决Android SDK Manager更新慢的问题

    Android SDK 下载速度慢,解决方法大概有两种.第一,FQ.这种方法比较彻底,但是要想有稳定的效果还的要花大价钱.第二,有些高人直接给了SDK中各软件的下载地址,直接下载速度非常快,下载后将包 ...

  6. distri.lua的web运维工具

    我的新手游项目很快就要进入到寻找发行商的环节,最近几天相对较空闲,逐将工作重心转移到服务器组运维工具的制作上. 回想一年之前经历的那个不算成功的端游项目,因为运维工具设计得不合理,使用十分不方便,游戏 ...

  7. Winform 数据库连接app.config文件配置 数据库连接字符串

    1.添加配置文件 新建一个winform应用程序,类似webfrom下有个web.config,winform下也有个App.config;不过 App.config不是自动生成的需要手动添加,鼠标右 ...

  8. 即将放出ITSEC第一期所有培训视频

    课程大概被分为三个章节 客户端安全培训 安全工具培训 服务端安全培训   部分PPT                         详细课程表 FireBug代码调试工具使用:工具介绍 FireBu ...

  9. 解决tomcat启动Socket监听端口死循环被hold问题

    原文链接:http://blog.csdn.net/dead_cicle/article/details/7073433 1.SOCKET监听置于servlet的init方法中,在web.xml里加入 ...

  10. 初探Stage3D(二) 了解AGAL

    关于本文 本文并无打算事无巨细的介绍一遍AGAL,仅仅是对现有文档的一些理解及汇总,所以请先阅读相参考文档 AGAL概念 参考资料 http://www.adobe.com/devnet/flashp ...