一、常用配置
1.1 配置说明
配置项 | 值 | 说明 |
---|---|---|
hbase.cluster.name | xx-xxxxx-xx-xxxx.xx | 集群名称, 区分环境 |
hbase.client.ipc.pool.type | RoundRobin | socket连接池的类型: Reusable/RoundRobin/ThreadLocal 默认RoundRobin |
hbase.client.keyvalue.maxsize | 2097152 | 存储文件中的单个entry的大小上限. 默认10485760(10M) |
hbase.client.pause | 40 | 客户端暂停时间, 常用于客户端在重试前的等待时间. 默认100ms |
hbase.ipc.client.tcpnodelay | true | 设置tcp socket连接no delay. 默认true |
hbase.client.ipc.pool.size | 2 | socket连接池大小 |
hbase.rpc.timeout | 300 | 一次RPC的超时时间. 默认60000ms |
hbase.client.operation.timeout | 1000 | 一次操作的超时时间. 默认1200000ms |
hbase.client.retries.number | 10 | 最大重试次数. 默认35 |
hbase.client.prefetch.limit | 100 | 预取region地址个数. 实际对于随机存取意义不大 |
hbase.client.scanner.caching | 30 | Scan时一次next请求获取的行数. 默认100 |
hbase.ipc.client.connection.maxidletime | 2147483647 | 客户端连接最大空闲时间 |
zookeeper.session.timeout | 10000 | zk会话超时时间. 默认180000ms |
zookeeper.recovery.retry | 2 | zk重试次数 |
附:官方默认配置
1.2 关于配置的注意点
1.2.1 超时设置
我们跟客户端约定的超时是1s, 所以hbase.client.operation.timeout不得设置超过1s(不跟客户端交互的可以适当放宽)
当前遇到比较多的问题, 都是rpc超时问题. rpc超时后会有重试, 多次重试之间会有时间间隔, 一旦达到最大重试次数或者最大超时时间, 请求失败, 停止重试. 时间间隔由hbase.client.pause指定, 单次rpc超时由hbase.rpc.timeout指定, 最大超时时间由hbase.client.operation.timeout指定
每次的时间间隔会不相同, 简单地说: 重试次数越多, 时间间隔越长. 具体策略代码说明如下:

1.2.2 连接池设置
关于socket连接池大小(hbase.client.ipc.pool.size)设置, 一般建议: <10万qps, 用2
二、常见问题汇总
2.1 超时问题
2.1.1 客户端问题or服务端问题
关注报错日志中的四个超时: callDuration/callTimeout waitTime/rpcTimeout
其中, callDuration和callTimeout是客户端调用时的超时, 当callDuration>callTimeout, 表示客户端有问题. 这个时候有可能是客户端容器有问题(比如GC), 可能是网络问题, 也可能是hbase-client客户端有问题
waitTime/rpcTimeout出现在每次的rpc调用里, 当waitTime>rpcTimeout, 表示服务端处理超时
2.1.2 服务端问题的几种类型
2.1.2.1 location超时
报错: java.io.IOException: Timeout when waiting for location
服务发布的一开始有可能会报这类错误.
如果是项目运行过程中报此类错误, 则是server端问题, 需联系hbase同学定位解决
2.1.2.2 其他 server 问题汇总
包括以下报错:
- org.apache.hadoop.hbase.ipc.FailedServerException: This server is in the failed. servers list
- java.io.IOException: IPC server unable to write call method@xx-xxxxx-xx-xxxx.xx/xxx.xxx.xxx.xxx:xxxxx
- java.io.IOException: Can not send request because relogin is in progress
2.2 quotas问题
报错日志中出现以下两种报错, 则为读/写quotas设置过小/未设置. 需要 给htable配置quotas
org.apache.hadoop.hbase.quotas.ThrottlingException: number of read requests exceeded.
org.apache.hadoop.hbase.quotas.ThrottlingException: number of write requests exceeded.
注意:
- quotas的读/写配置, 要参考read capacity/write capacity, 比例可以直接1:1
- quotas的配置, 是最小保证配置. 举例: quotas读配置了100, 如果当前服务不忙, read capacity>100, server照样可以保证执行; 一旦服务忙起来, server只能保证100的read capacity
- quotas是均分在每个region上的, 也就是说, 一旦出现热点region访问/写入, 单个region的 read capacity>(quotas/region数), 就有可能会报错. 所以对于热点读, 要加缓存; 在设计表时, 要保证key的散列度, 防止出现热点写
- 不配置quotas, 则表的优先级最低, 一旦server忙起来, 就会出现读写报错