ScannerTimeoutException 問題分析與解決方法

 遇到一些hadoop,hbase相關的異常,有時會有不知怎麼解決的感覺,首先要確定問題,然後找出引起此問題的原因,再然後制定解決方案,最後選擇一種實行。

hbase源碼如巨人般站在我們的心中,讓心強大起來,巨人就變小了

言歸正傳:

1.首先尋根朔源
scannerTimeout:Thrown when a scanner has timed out.當一個scanner超時時拋出此異常,是HTable的一個屬性。
它是從哪設置的呢,請看下面:
package org.apache.hadoop.hbase.client;
public class HTable implements HTableInterface {
 protected final int scannerTimeout;
 public HTable(Configuration conf, final byte [] tableName) {
  this.scannerTimeout =
        (int) conf.getLong(HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY, HConstants.DEFAULT_HBASE_REGIONSERVER_LEASE_PERIOD); 
 }
}
然後看看HConstants裏那兩個值的設定,conf.getLong(v1,v2);此方法是指,從配置文件裏讀第一個“hbase.regionserver.lease.period”,
如果配置文件中沒有此項,則將其設置爲v2,即DEFAULT_HBASE_REGIONSERVER_LEASE_PERIOD = 60000(ms),就是60s。
package org.apache.hadoop.hbase;
public final class HConstants {
  public static String HBASE_REGIONSERVER_LEASE_PERIOD_KEY =
    "hbase.regionserver.lease.period";


  /**
   * Default value of {@link #HBASE_REGIONSERVER_LEASE_PERIOD_KEY}.
   */
  public static long DEFAULT_HBASE_REGIONSERVER_LEASE_PERIOD = 60000;
 
  /**
   * timeout for each RPC
   */
  public static String HBASE_RPC_TIMEOUT_KEY = "hbase.rpc.timeout";
  /**
   * Default value of {@link #HBASE_RPC_TIMEOUT_KEY}
   */
  public static int DEFAULT_HBASE_RPC_TIMEOUT = 60000;
}


拋出此異常一般都是說,你用了多少秒了(>60),超過了限制啦。於是:
2.兩種解決方案:
一是修改此值,將其設置大一些,這裏設置成180秒,太大了連接會一直維持,有缺點
修改配置文件:$HBASE_HOME/conf/hbase-site.xml,修改或添加此屬性
<property>
<name>hbase.regionserver.lease.period</name>
<value>180000</value>
</property>

二是修改程序,換一種思路,最好一次scan在60秒內總能返回至少一條結果。

看 HBase權威指南,發現還有中簡單的方法:

Configuration conf = HBaseConfiguration.create()
conf.setLong(HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY, 120000)

 
這樣便改了,而且只是改了當前這次的client請求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章