HBASE 优化之REGIONSERVER
HBASE 优化之REGIONSERVER
一,概述
本人在使用优化regionserver的过程有些心得,借此随笔的机会,向大家介绍我的心得,有些是网上拿来的有些是自己在使用过程自己的经验,希望对大家有帮助,如有不同观点希望大家立即指正。本人使用的hbase版本是 HBase 1.2.0-cdh5.10.0。本文主要从regionserver的角度进行优化hbase,简单来书就是:使regionServer查询延迟更低,磁盘IO降低,系统更加稳定,提高吞吐能力,提升资源利用率,节约成本。
二、参数优化
磁盘读流量主要是本地regionserver业务读和compact读,写流量主要是本地regionserver写、wal、flush、compact,以及其他datanode的写副本。
1,优化hlogs触发强制刷memstore
设置参数hbase.regionserver.maxlogs hbase.regionserver.hlog.blocksize
参数解释:当数据被写入的时会默认先写入wal。wal包含所有已经写入memstore但是还未flush到hfile的更改(edits)。在memstore中数据还未有持久化,当regionserver宕掉的时候,可以使用wal恢复数据。当wal变得很大的时候,在恢复的时候就需要很长的时间。因此,对wal的大小也有一些限制,当达到这些限制的时候,就会触发memstore的flush。memstore flush会使wal减少,因为数据持久化之后,就没有必要在wal中再保存这些修改,有这些属性可以配置,其中wal的最大值是由:hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize (2GB by default) 决定,一旦达到这个值就是说,memstore flush就会触发,所以当你增加memstore的大小以及调整其他的memstore设置项的时候,你也需要去调整hlog的配置。否则,wal的大小限制可能会首先被触发,因而,你将利用不到其他专门为memstore而设计的优化。抛开这些不说,通过wal的限制来触发memstore的flush并非最佳方式,这样做可能会一次flush很多region,尽管写数据是很好的分布整个集群,进而很有可能会引发flush大风暴。最好将hbase.regionserver.hlog.blocksize * hbase.regionserver.maxlogs 设置为稍微大于hbase.regionserver.global.memstore.lowerLimit * HBASE_HEAPSIZE。
2,jvm xx:MaxDirectMemory 调大
众所周知jvm堆内存大小可以通过-Xmx来设置,同样direct byteBuffer可以通过-Xx:MaxDirectMemorySize来设置,此参数的含义是当Direct ByteBuffer分配的堆外内存达到指定大小的时候,即触发Full GC ,
3,hbase.bucketcache.size
这个配置是指读缓存占用内存的大小,该值可以为内存真实值,单位为M,也可以是比例值,表示缓存大小占JVM内存大小比例,
4,hfile.block.cache.size
表示LRUBlockCache占用内存在jvm内存中的比例,目前这是唯一的LRUBlockCache,无法关闭。
5,hbase.regionserver.global.memstore.upperLimit和hbase.regionserver.global.memstore.lowerLimit
当一个region server中所有的memstore的大小总和上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认 40%的JVM内存使用量),会触发部分memstore刷新。flush顺序是按照memstore由大到小执行,先flush最大的region,再次执行次大的,直至总体memstore内存使用量低于阈值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38%的JVM内存使用量)。
6,hbase.regionserver.handle.count
server端处理request线程的个数,
7,hbase.regionserver.optionalcacheflushinterval
内存中的文件在自动刷新之前能够存活的最长时间。
8,hbase.hregion.memstore.flush.size
单个region里memstore的缓存大小,超过那么整个hregion就会flush。
9,hbase.hlog.split.skip.errors =true
如果遇到文件损坏等无法跳过去的错误,设置true,忽略之。
10,hbase.master.distributed.log.replay
是否启用分布式日志重播
// 可以看出来这里面有两种模式,分布式文件恢复模式,通过zk来恢复,还有一种是recovered.edit模式,通过创建recovered.edits文件来恢复。文件恢复是通过hbase.master.distributed.log.replay参数来设置,默认是false,走的recovered.edit模式。看得出来,这个函数是为恢复做准备工作的,如果是分布式模式,就执行prepareLogReplay准备日志恢复,否则就开始创建recovered.edits恢复文件
11,hbase.ipc.server.callqueue.handler.factor
//如果 hbase.ipc.server.callqueue.handler.factor 为 0,那么 callExecutor 池 BalancedQueueRpcExecutor,如果 hbase.ipc.server.callqueue.handler.factor 大于 0,那么池的 executor 为 RWQueueRpcExecutor,该 executor 中分为 3 个队列:write,read 和 scan,分别通过参数 hbase.ipc.server.callqueue.read.ratio 和参数 hbase.ipc.server.callqueue.scan.ratio 进行控制,其中 hbase.ipc.server.callqueue.handler.factor 用来控制队列个数。
12,hbase.ipc.server.callqueue.read.ratio 和hbase.ipc.server.callqueue.scan.ratio
hbase.ipc.server.callqueue.read.ratio 设置为0.5,代表有50%的线程数处理读请求
如果再设置hbase.ipc.server.callqueue.scan.ratio 设置为0.5,则代表在50%的读线程之中,再有50%的线程处理scan,也就是全部线程的25%
二,垃圾回收方式优化-G1
优化之前要说明一下:垃圾回收G1特点就是内存分片,支持动态调整young区大小,old区使用mixed gc方式分成多次小gc,尽量减少单次gc STW(stop the world)暂停时间,让gc对应用延迟的影响在预期范围内。总的来说,G1比较适合 对平均响应时间,最大响应时间有严格要求的应用系统。
优化原则:系统调优就是从业务到实现,从整体到局部,从架构到具体组件的。在进行gc调优之前,我们应该确保业务层和应用层已经评估优化过了。业务层和应用层的优化一般来说更容易有收益,我们不能指望一个架构设计有缺陷,应用层代码有很多已知问题的系统,通过gc调优一劳永逸。GC调优3选2原则:先来看一下衡量gc的指标有哪些。对应用吞吐量的影响(一般是gc对cpu的消耗),对延迟的影响,总内存占用(gc触发时留有内存业务可以继续,留有内存做对象拷贝碎片整理等操作,不能oom)。GC调优3选2原则: 在吞吐量、延迟、内存占用上,我们只能选择其中两个进行调优,无法三者兼得。
以下是我经过测试得出的结论:
-Xms107374182400 -Xmx107374182400 -XX:+UseG1GC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:MaxDirectMemorySize=100g -XX:G1NewSizePercent=5 -XX:G1MaxNewSizePercent=60 -XX:G1MixedGCCountTarget=64
-XX:G1OldCSetRegionThresholdPercent=4 -XX:ParallelGCThreads=63 -XX:MaxGCPauseMillis=400 -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication -XX:-ResizePLAB -XX:MaxTenuringThreshold=1
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2048M
-XX:+PrintPromotionFailure -XX:+PrintGCApplicationStoppedTime -XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1 -XX:+PrintHeapAtGC -Xloggc:/datafs/cdh/gclog/hbase-gc.{{PID}}.log
以下对上述参数的解释:
-XX:+UnlockExperimentalVMOptions 和-XX:+UnlockDiagnosticVMOptions
这2个参数主要是解锁一些隐藏的参数设置。例如:查看汇编需要加入虚拟机参数  :-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssmbly
-XX:MaxDirectMemorySize
众所周知jvm堆内存大小可以通过-Xmx老设置,同样direct byteBuffer可以通过-Xx:MaxDirectMemorySize来设置,此参数的含义是当Direct ByteBuffer分配的堆外内存达到指定大小的时候,就触发full gc。注意该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory(),在程序中可以获得 -XX:MaxDirectMemorySize的设置的值。
-XX:G1NewSizePercen
新生代内存初始空间默认整个堆内存的5%。
-XX:G1MaxNewSizePercent
新生代内存最大空间大小默认是60%。
-XX:G1MixedGCCountTarget
混合收集周期中的包含多少次混合收集的次数。设置标记周期完成后,对存活数据上限为G1MixedGCLIveThresholdPercent的老年代region执行混合垃圾回收的目标次数,默认是8次。
-XX:G1OldCSetRegionThresholdPercent
这个参数是设置混合垃圾回收期间要回收的最大旧区域数。默认值是10%。改小的话可以减少单次混合收集时间。
-XX:ParallelGCThreads
这个是STW期间,并行GC线程数,其值计算方式为:
1),如果用户指定了其大小,则使用用户指定的值。
2),否则需要根据实际的CPU所能够支持的线程数来计算这个值,如果CPU支持的线程数小于8,则其值为cpu所支持的线程数,如果CPU所支持的线程数大于8,其值的计算方式为:8加上物理cpu所支持的线程数减去8所得值的5/8或者5/16,JVM会根据实际的情况来选择是5/8或者5/16。比如:在64线程的x86 CPU上,如果用户未指定ParallelGCThreads的值,则默认的计算方式为:ParallelGCThreads = 8 + (64 - 8) * (5/8) = 8 + 35 = 43。
-XX:MaxGCPauseMillis
设置G1收集过程目标时间,默认是200ms,不是硬性条件,不是说设置越小越好,有时候设置过小反而会放大收集时间。
-XX:+ParallelRefProcEnabled
如果应用有很多的Reference or finalizable objects,那么可以使用-XX:+ParallelRefProcEnabled来减少duration。默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显。
-XX:+UseStringDeduplication
字符串去重,提高性能。我们可以通过删除重复的字符串,只保留一个char[]来优化堆内存。这个选择在Java 8 u 20被引入。
-XX:-ResizePLAB
减少gc线程间通信的东西,关闭动态提升本地buffer。Thread Local Allocation Buffer,简称就是:TLAB,即内存本地的持有的buffer。
-XX:MaxTenuringThreshold
在新生代中对象存活次数(经过Minor GC的次数)后仍然存活,就会晋升到旧生代。
-XX:+PrintGCDetails
打印gc过程详细信息。
-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
PrintGCTimeStamps时间是从jvm启动开始计时的时间。而PrintGCDateStamps就是时间戳就是当时的时间。
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2048M
开发者通过 JVM 参数 `-XX:+UseGCLogFileRotation` 实现 GC 日志轮转。指定上述参数,当日志文件大小增加到 2048MB,JVM 会进行 GC 日志轮转生成最多5个文件,扩展名分别为 `gc.log.0`、`gc.log.1`、`gc.log.2`、`gc.log.3` 和 `gc.log.4`。但是这个参数有个问题解决链接为:
https://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=2651483102&idx=1&sn=4c272df4ba8527fd54f4df3364a61a3f&chksm
=bd2507a18a528eb7ff45df8813e6bdb98c5e14dc68fa5e5c2958ad23fbd63d1b2f4982d6d6e4&mpshare=1&scene=1&srcid=#rd
-XX:+PrintPromotionFailure
看看Promotion Failed的时候是不是有很大的对象要晋升到旧生代,日志显示在晋升的时候失败。
-XX:+PrintGCApplicationStoppedTime
打印垃圾回收期间程序暂停的时间.可与上面混合使用。
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
根据-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 参数虚拟机打印的日志文件可以看出safepoint的执行过程,可以检测未知的错误。
-XX:+PrintHeapAtGC
每一次GCZ之后都会打印堆信息。
 
HBASE 优化之REGIONSERVER的更多相关文章
- Spark读Hbase优化 --手动划分region提高并行数
		
一. Hbase的region 我们先简单介绍下Hbase的架构和Hbase的region: 从物理集群的角度看,Hbase集群中,由一个Hmaster管理多个HRegionServer,其中每个HR ...
 - 大数据技术之_11_HBase学习_02_HBase API 操作 + HBase 与 Hive 集成 + HBase 优化
		
第6章 HBase API 操作6.1 环境准备6.2 HBase API6.2.1 判断表是否存在6.2.2 抽取获取 Configuration.Connection.Admin 对象的方法以及关 ...
 - HBase优化实战
		
本文来自网易云社区. 背景 Datastream一直以来在使用HBase分流日志,每天的数据量很大,日均大概在80亿条,10TB的数据.对于像Datastream这种数据量巨大.对写入要求非常高,并且 ...
 - Hbase优化方案
		
1.预分区设计 真正存储数据的是region要维护一个区间段的rowkey startRow~endRowkey ->手动设置预分区 create 'user_p','info','partit ...
 - HBase优化相关
		
1.HBase预分区 HBase在创建表时,默认会自动创建一个Region分区.在导入数据时,所有客户端都向这个Region写数据,直到这个Region足够大才进行切分.这样在大量数据并行写入时,容易 ...
 - HBase之二:Hbase优化
		
1. 预先分区 默认情况下,在创建 HBase 表的时候会自动创建一个 Region 分区,当导入数据的时候,所有的 HBase 客户端都向这一个 Region 写数据,直到这个 Region ...
 - Hbase优化总结
		
1.JVM参数优化: –Xmn=12G –Xms=24G -Xmx=24G 根据实际机器情况调整,一般为整个机器内存的一半,同时建议regionServer的堆内存建议不要超过32G ; -XX: ...
 - hbase优化小结
		
目录: 1,背景 2,GC 3,hbase cache 4,compaction 5,其他 1,背景 项目组中,hbase主要用来备份mysql数据库中的表.主要通过接入mysql binlog,经s ...
 - Hbase优化:(待重点研究)
		
一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB ...
 
随机推荐
- servlet操作本地文件汇总: 判断文件是否存在;文件重命名;文件复制; 获取文件属性信息,转成Json对象; 获取指定类型的文件; 查找替换.txt中的文本
			
package servlet; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...
 - css中width:auto和width:100%的区别是什么
			
width的值一般是这样设置的: 1,width:50px://宽度设为50px 2,width:50%://宽度设为父类宽度的50% 3,还有一个值是auto(默认值),宽度是自动的,随着内容的增加 ...
 - Shiro-ini认证
			
#2019.2.2 shiro的ini认证 先用IDEA创建一个普通的MAVEN项目,并导入依赖 <!--Junit单元测试--> <groupId>junit</gro ...
 - 安装linux虚拟机配置静态ip(桥接模式)
			
1.centOs7.VMware Workstation14 2.常规新建虚拟机操作后,来到选择连接模式: 这里选择桥接模式,复制物理网络连接状态(就是把实际的主机网卡信息拷贝一份,让虚拟机也有一份和 ...
 - 多渠道打包如何运行/debug指定的渠道
			
如果配置了多渠道,像这里有3个,分别为flavor1,flavor2,flavor3 productFlavors { flavor1{ packageName "com.xxx.yymad ...
 - Csrf_token  |||  CSRF跨站请求伪造
			
# 注: 部分内容参考网上,侵删 CSRF(Cross-site request forgery) 跨站请求伪造,是一种对网站的恶意利用 它会通过伪装成受信任用户的请求来利用受信任的网站来获取一 ...
 - 关于jetbrains系列产品2018.1.5以后的使用(crack)方法
			
产品请一律官网下载:https://www.jetbrains.com/ 我这里以JetBrains GoLand 2018.2.1为例说明下非付费的使用方法(若资金允许,请点击https://www ...
 - java.lang.NoSuchMethodError: com.opensymphony.xwork2.config.ConfigurationManager.addConfigurationPro
			
java.lang.NoSuchMethodError: com.opensymphony.xwork2.config.ConfigurationManager.addConfigurationPro ...
 - Spring4.x Jpa + hibernate的配置(废弃JpaTemplate)
			
近年来 ORM(Object-Relational Mapping,对象关系映射,即实体对象和数据库表的映射)技术市场热闹非凡,各种各样的持久化框架应运而生,其中影响最大的是 Hibernate 和 ...
 - BZOJ-3105: 新Nim游戏 (nim博弈&线性基)
			
pro: 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从 ...