【问题标题】:Hbase Client RPC TimeoutHbase 客户端 RPC 超时
【发布时间】:2015-06-18 18:46:01
【问题描述】:

我正在运行 Hbase 1.0.1/Hadoop 2.5.2。我正在尝试对表运行扫描,但出现 RPC 超时。

我已将 Hbase RPC 超时更改为 2 分钟,我可以通过 UI 确认...

<property>
  <name>hbase.rpc.timeout</name>
  <value>120000</value>
  <source>hbase-site.xml</source>
</property>

...但是我的客户端在 60 秒后仍然超时...

Caused by: java.io.IOException: Call to xxxxxxx/172.16.5.13:16020 failed on local exception: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call id=2968, waitTime=60001, operationTimeout=60000 expired.
    at org.apache.hadoop.hbase.ipc.RpcClientImpl.wrapException(RpcClientImpl.java:1235)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1203)
    at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:216)
    at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:300)
    at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.scan(ClientProtos.java:31751)
    at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:199)
    at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:62)
    at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:126)
    ... 6 more
Caused by: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call id=2968, waitTime=60001, operationTimeout=60000 expired.
    at org.apache.hadoop.hbase.ipc.Call.checkAndSetTimeout(Call.java:70)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1177)
    ... 12 more

我尝试更改缓存块大小,但这似乎没有任何区别。

还有其他一些我错过的超时。表中有很多行(数百万),虽然扫描只返回 10 的数千,但问题似乎只出在一组特定的区域。

【问题讨论】:

  • 我有同样的问题,你解决了吗?谢谢
  • 我最终放弃了。我们正在写入的数据量开始超过我们 HBase 平台的吞吐量。由于原始事件数据与我们的事件计数器相比具有次要价值,我们决定停止将其记录在 HBase 中。我们现在将它作为 JSON 记录写入文本文件,如果需要,我们仍然可以运行 map reduce 作业,并将 HBase 留给更关键的数据。

标签: hbase


【解决方案1】:

当服务器接收到扫描 RPC 请求时,时间限制被计算为两个值中较小者的一半:hbase.client.scanner.timeout.periodhbase.rpc .timeout(两者都默认为 60000 毫秒或一分钟)。 这就是为什么在设置 2 分钟后,您的扫描会在 60 秒内超时。

当达到时间限制时,服务器会返回它在该时间点之前累积的结果。此结果集可能为空。如果您的使用模式包括扫描时间超过一分钟,您可以增加这些值。

为确保超时时间不会太短,您可以将 hbase.cells.scanned.per.heartbeat.check 配置为发生超时检查之前必须扫描的最小单元数.默认值为 10000。值越小,超时检查就越频繁。

以下链接可能有助于配置 Hbase 扫描超时:

https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.4.2/bk_installing_manually_book/content/best-practices-timeouts-phoenix.html

https://www.cloudera.com/documentation/enterprise/5-5-x/topics/admin_hbase_scanner_heartbeat.html#concept_xsl_dz1_jt

【讨论】:

    【解决方案2】:

    基于第一个答案。我在打开与 HBase 集群的连接之前配置了属性 hbase.client.scanner.timeout.periodhbase.rpc.timeout

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    
    Configuration conf = HBaseConfiguration.create();
    
    conf.set("hbase.rpc.timeout", "1800000");
    conf.set("hbase.client.scanner.timeout.period", "1800000");
    

    【讨论】:

      【解决方案3】:

      在客户端而不是hbase-site.xml 中创建连接时试试这个:

      conf.set("hbase.rpc.timeout", "1800000")
      

      【讨论】:

      • hbase.rpc.timeout 是客户端属性吗?
      • 是的。我最近一年没用过HBase,你可以试试。
      • 我使用的是 Phoenix,这个问题来自 Phoenix 层。知道如何在 Phoenix 上添加它
      【解决方案4】:

      这个应该可以的。

      hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.client.scanner.timeout.period=600000 tbname /path/to/hdfs
      

      【讨论】:

        【解决方案5】:

        对于opterationTimeout,你需要改变的是这个:

          <property>
            <name>hbase.client.operation.timeout</name>
            <value>10000</value>
          </property>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 1970-01-01
          • 2011-09-03
          • 2020-07-17
          • 2011-07-24
          • 2016-09-15
          • 1970-01-01
          相关资源
          最近更新 更多