hbase的调优

Hbase的优化

服务端优化:

  1. hbase.regionserver.handler.count:rpc请求的线程数量,默认值是10,生产环境建议使用100,特别大的时候scan/put几M的数据,会占用过多的内存,有可能导致频繁的GC,甚至oom。
  2. hbase.regionserver.hlog.splitlog.writer.threads:默认值是3,建议设为10,日志切割所用的线程数
  3. hbase.regionserver.global.memstore.upperLimit:默认值0.4,regionserver所有memstore占用内存在总内存中的upper比例,当达到该值,则会从整个regionserver中找出最需要flush的region进行flush
  4. hbase.regionserver.global.memstore.lowerLimit:默认值0.35
  5. hbase.regionserver.thread.compaction.small:默认值为1,regionserver做Minor Compaction时线程池里线程数目,可以设置为5。
  6. hbase.regionserver.thread.compaction.large:默认值为1,regionserver做Major Compaction时线程池里线程数目,可以设置为8。
  7. hbase.regionserver.lease.period:默认值60000(60s),客户端连接regionserver的超时时间,这个最好根据实际业务情况进行调整
  8. hbase.hregion.max.filesize:默认10G,StoreFile,建议手动定时分裂,可以设置为60G
  9. hbase.hregion.majorcompaction:hbase的region主合并的间隔时间,默认为1天,建议设置为0,禁止自动的major主合并,major合并会把一个store下storefile合并为storefile文件,在合并过程中删除标识的数据,主合并可能持续数小时,减少业务影响,业务低峰期手动、脚本、api定期进行major合并。
  10. hbase.hregion.memstore.flush.size:默认值128M,一旦有memstore超过该值flush,如果regionserver的jvm内存比较充足(16G),可以调整为256M。
  11. hbase.hregion.memstore.block.multiplier:默认值2,如果一个memstore的内存大小已经超过  .flush.size *  .block.multiplier,则会阻塞该memstore的写操作,为避免阻塞,建议为5,太大会有OOM的风险。在regionserver日志中出现"Blocking updates for '<threadName>' on region <regionName> : memstore size <多少M> is >= than blocking <多少M> size"的信息时,说明这个值该调整了。
  12. hbase.hstore.compaction.min:默认值为3,任何一个store里的storefile总数超过该值,会触发默认的合并操作,可以设置5~8,在手动的定期major compact中进行storefile文件的合并,减少合并的次数,延长合并的时间。
  13. hbase.hstore.compaction.max:默认值为10,一次最多合并storefile个数,避免OOM。
  14. hbase.hstore.blockingStoreFiles:默认为7,任何一个store的storefile的文件数大于该值,则在flush memstore前先进行split/compact,同时把该region添加到flushQueue,延时刷新,这期间会阻塞写操作直到compact完成/超过hbase.hstore.blockingWaitTime(90s)配置的时间,可以设置为30,避免memstore不及时flush。当regionserver运行日志中出现大量的“Region <regionName> has too many store files; delaying flush up to 90000ms"时,说明这个值需要调整了
  15. hbase.master.distributed.log.splitting:默认值为true,建议设为false。关闭hbase的分布式日志切割,在log需要replay时,由master来负责重放
  16. hbase.snapshot.enabled:快照功能,默认是false(不开启),建议设为true,特别是对某些关键的表,定时用快照做备份是一个不错的选择。
  17. hfile.block.cache.size:默认值0.25,regionserver的block cache的内存大小限制,在偏向读的业务中,可以适当调大该值,需要注意的是hbase.regionserver.global.memstore.upperLimit的值和hfile.block.cache.size的值之和必须小于0.8。
  18. dfs.socket.timeout:默认值60000(60s),建议根据实际regionserver的日志监控发现了异常进行合理的设置,比如我们设为900000,这个参数的修改需要同时更改hdfs-site.xml
  19. dfs.datanode.socket.write.timeout:默认480000(480s),有时regionserver做合并时,可能会出现datanode写超时的情况,480000 millis timeout while waiting for channel to be ready for write,这个参数的修改需要同时更改hdfs-site.xml

 

Client端优化:

1.hbase.client.write.buffer:默认为2M,写缓存大小,推荐设置为5M,单位是字节,当然越大占用的内存越多,此外测试过设为10M下的入库性能,反而没有5M好

2.hbase.client.pause:默认是1000(1s),如果你希望低延时的读或者写,建议设为200,这个值通常用于失败重试,region寻找等

3.hbase.client.retries.number:默认值是10,客户端最多重试次数,可以设为11,结合上面的参数,共重试时间71s

4.hbase.ipc.client.tcpnodelay:默认是false,建议设为true,关闭消息缓冲

5.hbase.client.scanner.caching:scan缓存,默认为1,避免占用过多的client和rs的内存,一般1000以内合理,如果一条数据太大,则应该设置一个较小的值,通常是设置业务需求的一次查询的数据条数 

如果是扫描数据对下次查询没有帮助,则可以设置scan的setCacheBlocks为false,避免使用缓存;

6.table用完需关闭,关闭scanner

7.限定扫描范围:指定列簇或者指定要查询的列,指定startRow和endRow

8.使用Filter可大量减少网络消耗

9.通过Java多线程入库和查询,并控制超时时间。后面会共享下我的hbase单机多线程入库的代码

10.建表注意事项:

开启压缩

合理的设计rowkey

进行预分区

开启bloomfilter

 

jvm和垃圾收集参数

export HBASE_REGIONSERVER_OPTS="-Xms36g -Xmx36g -Xmn1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=15 -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/data/logs/gc-$(hostname)-hbase.log"

由于我们服务器内存较大(96G),我们给一部分regionserver的jvm内存开到64G,到现在为止,还没有发生过一次full gc,hbase在内存使用控制方面确实下了不少功夫,比如各种blockcache的实现,细心的同学可以看源码。

 

ZooKeeper调优

  1. zookeeper.session.timeout:默认值3分钟,不可配置太短,避免session超时,hbase停止服务,线上生产环境由于配置为1分钟,如果太长,当regionserver挂掉,zk还得等待这个超时时间(已有patch修复),从而导致master不能及时对region进行迁移。
  2. 查看zk节点状态。重新启动zk节点前后,一定要查看状态

echo ruok | nc host port

echo stat | nc host port

3.

猜你喜欢

转载自blog.csdn.net/u014156013/article/details/84100097