我正在运行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 行,但问题似乎只出在一组特定的区域上。
当服务器收到扫描 RPC 请求时,时间限制将计算为两个值中较小值的一半:hbase.client.scanner.timeout.period 和 hbase.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
基于第一个答案。我配置了属性 hbase.client.scanner.timeout.period 和 hbase.rpc.timeout,之前打开与 HBase 群集的连接:
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");
在客户端而不是hbase-site.xml
中创建连接时,请尝试此操作:
conf.set("hbase.rpc.timeout", "1800000")
这个应该可以工作。
hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.client.scanner.timeout.period=600000 tbname /path/to/hdfs
对于 opterationTimeout,您需要更改的是:
<property>
<name>hbase.client.operation.timeout</name>
<value>10000</value>
</property>