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请求

你可能感兴趣的:(hadoop,String,hbase,Class,each,byte)