hbase常用配置设置和常见问题汇总

一、常用配置

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忙起来, 就会出现读写报错