【HBase调优】Hbase万亿级存储性能优化总结

2017-04-07

背景:HBase主集群在生产环境已稳定运行有1年半时间,最大的单表region数已达7200多个,每天新增入库量就有百亿条,对HBase的认识经历了懵懂到熟的过程。为了应对业务数据的压力,HBase入库也由最初的单机多线程升级为有容灾机制的分布式入库,为及早发现集群中的问题,还开发了一套对HBase集群服务和应用全面监控的报警系统。总结下HBase优化(针对0.94版本)方面的一些经验也算对这两年HBase工作的一个描述。

相关资源:《HBase企业应用开发实战》,HBase笔记(工作中自己总结的,非常全)等,领取方式:请点击“阅读原文”查看,更多资源请查看历史消息!

服务端

1.hbase.regionserver.handler.count:rpc请求的线程数量,默认值是10,生产环境建议使用100,也不是越大越好,特别是当请求内容很大的时候,比如scan/put几M的数据,会占用过多的内存,有可能导致频繁的GC,甚至出现内存溢出。

2.hbase.master.distributed.log.splitting:默认值为true,建议设为false。关闭hbase的分布式日志切割,在log需要replay时,由master来负责重放

3.hbase.regionserver.hlog.splitlog.writer.threads:默认值是3,建议设为10,日志切割所用的线程数

4.hbase.snapshot.enabled:快照功能,默认是false(不开启),建议设为true,特别是对某些关键的表,定时用快照做备份是一个不错的选择。

5.hbase.hregion.max.filesize:默认是10G, 如果任何一个column familiy里的StoreFile超过这个值, 那么这个Region会一分为二,因为region分裂会有短暂的region下线时间(通常在5s以内),为减少对业务端的影响,建议手动定时分裂,可以设置为60G。

6.hbase.hregion.majorcompaction:hbase的region主合并的间隔时间,默认为1天,建议设置为0,禁止自动的major主合并,major合并会把一个store下所有的storefile重写为一个storefile文件,在合并过程中还会把有删除标识的数据删除,在生产集群中,主合并能持续数小时之久,为减少对业务的影响,建议在业务低峰期进行手动或者通过脚本或者api定期进行major合并。

7.hbase.hregion.memstore.flush.size:默认值128M,单位字节,一旦有memstore超过该值将被flush,如果regionserver的jvm内存比较充足(16G以上),可以调整为256M。

8.hbase.hregion.memstore.block.multiplier:默认值2,如果一个memstore的内存大小已经超过hbase.hregion.memstore.flush.size *  hbase.hregion.memstore.block.multiplier,则会阻塞该memstore的写操作,为避免阻塞,建议设置为5,如果太大,则会有OOM的风险。如果在regionserver日志中出现"Blocking updates for '<threadName>' on region <regionName> : memstore size <多少M> is >= than blocking <多少M> size"的信息时,说明这个值该调整了。

9.hbase.hstore.compaction.min:默认值为3,如果任何一个store里的storefile总数超过该值,会触发默认的合并操作,可以设置5~8,在手动的定期major compact中进行storefile文件的合并,减少合并的次数,不过这会延长合并的时间,以前的对应参数为hbase.hstore.compactionThreshold。

10.hbase.hstore.compaction.max:默认值为10,一次最多合并多少个storefile,避免OOM。

11.hbase.hstore.blockingStoreFiles:默认为7,如果任何一个store(非.META.表里的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"时,说明这个值需要调整了

12.hbase.regionserver.global.memstore.upperLimit:默认值0.4,regionserver所有memstore占用内存在总内存中的upper比例,当达到该值,则会从整个regionserver中找出最需要flush的region进行flush,直到总内存比例降到该数以下,采用默认值即可。

13.hbase.regionserver.global.memstore.lowerLimit:默认值0.35,采用默认值即可。

14.hbase.regionserver.thread.compaction.small:默认值为1,regionserver做Minor Compaction时线程池里线程数目,可以设置为5。

15.hbase.regionserver.thread.compaction.large:默认值为1,regionserver做Major Compaction时线程池里线程数目,可以设置为8。

16.hbase.regionserver.lease.period:默认值60000(60s),客户端连接regionserver的租约超时时间,客户端必须在这个时间内汇报,否则则认为客户端已死掉。这个最好根据实际业务情况进行调整

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

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的实现,细心的同学可以看源码。

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

ZooKeeper调优

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

2.zookeeper数量:建议5个或者7个节点。给每个zookeeper 4G左右的内存,最好有独立的磁盘。

3.hbase.zookeeper.property.maxClientCnxns:zk的最大连接数,默认为300,无需调整。

4.设置操作系统的swappiness为0,则在物理内存不够的情况下才会使用交换分区,避免GC回收时会花费更多的时间,当超过zk的session超时时间则会出现regionserver宕机的误报

HDFS调优

1.dfs.name.dir:namenode的数据存放地址,可以配置多个,位于不同的磁盘并配置一个nfs远程文件系统,这样namenode的数据可以有多个备份

2.dfs.namenode.handler.count:namenode节点RPC的处理线程数,默认为10,可以设置为60

3.dfs.datanode.handler.count:datanode节点RPC的处理线程数,默认为3,可以设置为30

4.dfs.datanode.max.xcievers:datanode同时处理文件的上限,默认为256,可以设置为8192

其他

列族名、column名、rowkey均会存储到hfile中,因此这几项在设计表结构时都尽量短些

regionserver的region数量不要过1000,过多的region会导致产生很多memstore,可能会导致内存溢出,也会增加major compact的耗时

来源:http://blog.csdn.NET/odailidong/article/details/41794403

【HBase调优】Hbase万亿级存储性能优化总结相关推荐

  1. Hbase万亿级存储性能优化总结:配置项、hdfs、zookeeper、jvm参数等

    背景 hbase主集群在生产环境已稳定运行有1年半时间,最大的单表region数已达7200多个,每天新增入库量就有百亿条,对hbase的认识经历了懵懂到熟的过程.为了应对业务数据的压力,hbase入 ...

  2. JVM调优,面到了阿里性能优化师!

    小K 菜哥,我看你朋友圈,你好像换工作了? 菜哥 对啊,前阵子被产品经理烦的头疼,就想换工作了.刚好找到一个不错的. 小K 给我说说呗,让我也参考一下,我现在工资才15K,主管死坑,我也想换工作了 菜 ...

  3. mysql性能调优与架构设计 51cto_MySQL 数据库性能优化之表结构优化

    很多人都将 数据库设计范式 作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉 ...

  4. 美团万亿级 KV 存储架构与实践

    KV 存储作为美团一项重要的在线存储服务,承载了在线服务每天万亿级的请求量. 在 2019 年 QCon 全球软件开发大会(上海站)上,美团高级技术专家齐泽斌分享了<美团点评万亿级 KV 存储架 ...

  5. 实时即未来,大数据项目车联网之原始数据实时ETL任务HBase调优【九】

    1. 原始数据实时ETL任务HBase调优 1.1 数据写入hbase优化 上一节写入数据,一条条数据put到表中,对于大量数据的写入,效率极低,因此针对此项进行优化 使用hbase客户端写缓存进行批 ...

  6. Kafka万亿级消息实战

    作者:vivo互联网服务器团队-Yang Yijun 一.Kafka应用 本文主要总结当Kafka集群流量达到 万亿级记录/天或者十万亿级记录/天  甚至更高后,我们需要具备哪些能力才能保障集群高可用 ...

  7. 今天来点猛的!Kafka万亿级消息实战!

    前言 一.Kafka应用 本文主要总结当Kafka集群流量达到 万亿级记录/天或者十万亿级记录/天. 甚至更高后,我们需要具备哪些能力才能保障集群高可用.高可靠.高性能.高吞吐.安全的运行. 关于Ka ...

  8. Kafka 万亿级消息在 vivo 的实战

    作者:vivo互联网服务器团队-Yang Yijun 一.Kafka应用 本文主要总结当Kafka集群流量达到 万亿级记录/天或者十万亿级记录/天  甚至更高后,我们需要具备哪些能力才能保障集群高可用 ...

  9. 解密Elasticsearch技术,腾讯开源的万亿级分布式搜索分析引擎

    「免费学习 60+ 节公开课:投票页面,点击讲师头像」 作者 | johngqjiang,腾讯 TEG 云架构平台部研发工程师 来源 | 腾讯技术工程(ID:Tencent_TEG) [导读]Elas ...

最新文章

  1. OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现
  2. this.class.getClassLoader().getResourceAsStream与this.class.getResourceAsStream
  3. Docker容器学习梳理--日常操作总结
  4. Resource stopwords not found. Please use the NLTK Downloader to obtain the r
  5. 大剑无锋之后台运行程序并输出日志到某文件【面试推荐】
  6. android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度
  7. inur new.php id,Cmsez(随易)全站系统注入0day
  8. 史上最简单的隐马尔可夫模型讲解
  9. VMware安装Linux(CentOS7)
  10. 东方韵味传统迎接新年|旭日东升的吉利日出好运插画素材模板
  11. 贺利坚老师汇编课程66笔记:自定义除法中断学习如何编制中断程序
  12. 洛谷2142高精度减法(模板)
  13. hodj 1008 Elevator (模拟题)
  14. vue-study-1 mvx模式
  15. 计算机酷睿处理器排行,2018电脑英特尔处理器排名(cpu性能天梯图)
  16. LowB三人组--选择排序原理和实现
  17. MacOS / Vmware Fusion无法连接虚拟设备sata0:1,因为主机上没有相应设备
  18. 机器学习笔记 - IOU、mAP、ROC、AUC、准确率、召回率、F分数
  19. python用两分钟告诉你,怎样暴力破解隔壁老王的 WiFi 密码
  20. js 前端时间选择器

热门文章

  1. 一个DC FIFO的仿真实验
  2. STM32F103C8T6与ESP8266构建通信(二)
  3. 华为微博回应鸿蒙,果不其然,华为放出终极大招!鸿蒙操作系统下月正式推送。就在刚刚,华为开通了鸿蒙操作系统的官方微博,关注人数已接近八万。 ... - 雪球...
  4. 计算机配置主板技术参数,怎么看电脑的配置?教你4个方法查看新电脑pc配置硬件参数...
  5. 写给数据分析入门者:一种通用的数据分析思路
  6. 丢失api-ms-win-crt-runtime-l1-1-0.dll已解决
  7. 云计算介绍,让你更了解云计算
  8. 微信小程序 三 圆形图片
  9. 只需一次向前推导,深度神经网络可视化方法来了!(ECCVW 2022)
  10. 阿翔编程学-整理一些Javascript代码