HBase scan 時 異常 ScannerTimeoutException 解決


  1. org.apache.Hadoop.hbase.client.ScannerTimeoutException: 60622ms passed since the last invocation, timeout is currently set to 60000  
  2.     at org.apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1196)   
  3.     at org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.nextKeyValue(TableRecordReaderImpl.java:133)   
  4.     at org.apache.hadoop.hbase.mapreduce.TableRecordReader.nextKeyValue(TableRecordReader.java:142)   
  5.     at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:532)   
  6.     at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67)   
  7.     at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143)   
  8.     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)   
  9.     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)   
  10.     at org.apache.hadoop.mapred.Child$4.run(Child.java:255)   
  11.     at java.security.AccessController.doPrivileged(Native Method)   
  12.     at javax.security.auth.Subject.doAs(Subject.java:396)   
  13.     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)   
  14.     at org.apache.hadoop.mapred.Child.main(Child.java:249)  

如在scan hbase的時候見到如上報錯,核心是,你某兩次scan的觸發的間隔時間過長。因此就得從兩個部分尋找原因:

1. 是否你自己每次的scan處理較耗時? ->  優化處理程序,scan一些設置調優(比如setBlockCache(false) )

2. 是否每次scan的caching設置過大?  ->  減少caching (一般默認先設100)

3. 是否是網絡或機器負載問題?    ->  聯系運維跟進查看集群原因

4. 是否HBase本身負載問題?     ->   查看RegionServer日志

 

一般以上四個問題都解決了(或確定目前暫不能解決),才考慮調整hbase的一些配置問題,比如網上提到的 config.setLong(HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY, 120000) , default 60000 。這個值就是異常中的那個currently set的值。

在HBase1.1.2中的源碼是:

  this.scannerTimeout = HBaseConfiguration.getInt(conf,
        HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD,
        HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY,
        HConstants.DEFAULT_HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD);
HBASE_REGIONSERVER_LEASE_PERIOD_KEY="hbase.regionserver.lease.period" 這個被deprecated掉了,新的用 HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD = "hbase.client.scanner.timeout.period"。
也就是說在這個版本之后應該設置 config.setLong(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 120000)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM