最近在进行新老测试环境集群的迁移,flume、HDFS、HBase、Hive都要迁,当更改了环境变量,启动语句,keytab等等配置后,笔者开始跑MR作业,但随即发现不同报了各种各样的错,总结如下:
1、java.lang.NoSuchMethodError
这个错误定位在scan.setCaching方法。原因是由于引用的pom文件里使用的是老版本的hbase-client库,因此将pom中的引用改为新集群对应client最新版本后重新编译,即可解决该问题。
2、OutOfOrderScannerNextException
问题复现代码位于:初始化hbase scan实例后,代码设置了scanCaching值为20000,而该值如果设置的偏大,可能导致了此时测试环境客户端获取数据超时。
client抛出的异常为:org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl: recovered from org.apache.hadoop.hbase.DoNotRetryIOException: Failed after retry of OutOfOrderScannerNextException: was there a rpc timeout?
at org.apache.hadoop.hbase.client.ClientScanner.next(ClientScanner.java:423)
RegionServer抛出的异常为:Caused by: org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException: org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException: Expected nextCallSeq: 1 But the nextCallSeq got from client: 0; request=scanner_id: 1558 number_of_rows: 100 close_scanner: false next_call_seq: 0
at org.apache.hadoop.hbase.regionserver.HRegionServer.scan(HRegionServer.java:3241)
原因是client的scan会多次向RS获取数据,为了保证数据没有漏掉与维持scan的顺序,client与RS都会做以下工作:
scan每次默认在client记录一个nextCallSeq,在接收到一批数据+1后供给scanRequest使用。
而RS端也会记录一个nextCallSeq,每当接收到scanRequest后将其加一。
但如果客户端获取数据超时,client的nextCallSeq没有+1。导致RegionServer与Client二者的nextCallSeq不匹配,则会复现该错误。
但考虑到