1.提升Bulkload效率
操作场景
批量加载功能采用了MapReduce jobs直接生成符合HBase内部数据格式的文件,然后把生成的StoreFiles文件加载到正在运行的集群。使用批量加载相比直接使用HBase的API会节约更多的CPU和网络资源。
ImportTSV是一个HBase的表数据加载工具。
前提条件
在执行批量加载时需要通过“Dimporttsv.bulk.output”参数指定文件的输出路径
操作步骤
参数入口:执行批量加载任务时,在BulkLoad命令行中加入如下参数。
参数
功能
默认值/建议值
hbase39现有值
hbasea现有值
-Dimporttsv.mapper.class
用户自定义mapper通过把键值对的构造从mapper移动到reducer以帮助提高性能。mapper只需要把每一行的原始文本发送给reducer,reducer解析每一行的每一条记录并创建键值对。
说明:
当该值配置为“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时,只在执行没有HBASE_CELL_VISIBILITY OR HBASE_CELL_TTL选项的批量加载命令时使用。使用“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时可以得到更好的性能
org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper
和
org.apache.hadoop.hbase.mapreduce.TsvImporterTextMappe
不需要调整
不需要调整
2.提升连续put场景(修改为建议值)
操作场景:
对大批量、连续put的场景,配置下面的两个参数为“false”时能大量提升性能。
“hbase.regionserver.wal.durable.sync”
“hbase.regionserver.hfile.durable.sync”
当提升性能时,缺点是对于DataNode(默认是3个)同时故障时,存在小概率数据丢失的现象。对数据可靠性要求高的场景请慎重配置
参数
功能
默认值/建议值
hbase39现有值
hbasea现有值
hbase.regionserver.wal.durable.sync
每一条wal是否持久化到硬盘
默认true,建议改为false
无,即默认true
无,即默认true
hbase.regionserver.hfile.durable.sync
hfile写是否立即持久化到硬盘。
默认true,建议改为false
无,即默认true
无,即默认true
3.Put和Scan性能综合调优
与JVM GC参数有关的参数
RegionServer GC_OPTS参数设置建议:
-Xms与-Xmx设置相同的值,需要根据实际情况设置,增大内存可以提高读写性能,可以参考参数“hfile.block.cache.size”(见表12-4 )和参数“hbase.regionserver.global.memstore.size”(见表12-3 )的介绍进行设置。
-XX:NewSize与-XX:MaxNewSize设置相同值,建议低负载场景下设置为“512M”,高负载场景下设置为“2048M”。
-XX:CMSInitiatingOccupancyFraction建议设置为“100 * (hfile.block.cache.size + hbase.regionserver.global.memstore.size + 0.05)”,最大值不超过90。
-XX:MaxDirectMemorySize表示JVM使用的堆外内存,建议低负载情况下设置为“512M”,高负载情况下设置为“2048M”。
参数
功能
默认值/建议值
hbase39现有值
hbasea现有值
hfile.block.cache.size
(提升实时读数据效率)
-Xms与-Xmx设置相同的值,需要根据实际情况设置,增大内存可以提高读写性能
数据缓存所占的RegionServer GC -Xmx百分比,在读高负载情况下可以适当调大以增大缓存命中率以提高性能
默认值0.25
0.4
0.4
hbase.regionserver.global.memstore.size
建议设置为“hbase.hregion.memstore.flush.size * 写活跃region数 / RegionServer GC -Xmx”。默认值为“0.4”,表示使用RegionServer GC -Xmx的40%。
默认值0.4
0.4
0.4
-XX:NewSize与-XX:MaxNewSize设置相同值
建议低负载场景下设置为“512M”,高负载场景下设置为“2048M”。
低负载:512M 高负载:2048M
无
无
-XX:CMSInitiatingOccupancyFraction
建议设置为“100 * (hfile.block.cache.size + hbase.regionserver.global.memstore.size + 0.05)”,最大值不超过90
计算值:70
无
无
-XX:MaxDirectMemorySize
表示JVM使用的堆外内存,建议低负载情况下设置为“512M”,高负载情况下设置为“2048M”。
低负载:512M 高负载:2048M
无
无
Put相关参数
RegionServer处理put请求的数据,会将数据写入memstore和hlog,
当memstore大小达到设置的“hbase.hregion.memstore.flush.size”参数值大小时,memstore就会刷新到HDFS生成HFile。
当当前region的列簇的HFile数量达到“hbase.hstore.compaction.min”参数值时会触发compaction。
当当前region的列簇HFile数达到“hbase.hstore.blockingStoreFiles”参数值时会阻塞memstore刷新生成HFile的操作,导致put请求阻塞。
参数
功能
默认值/建议值
hbase39现有值
hbasea现有值
hbase.hregion.memstore.flush.size
当memstore大小达到设置的“hbase.hregion.memstore.flush.size”参数值大小时,memstore就会刷新到HDFS生成HFile。
建议设置为HDFS块大小的整数倍,在内存足够put负载大情况下可以调整增大。单位:字节
默认值:134217728字节
=128mb
256mb
128mb
hbase.hstore.compaction.min
当一个Store中文件超过该值时,会进行compact,适当增大该值,可以减少文件被重复执行compaction。但是如果过大,会导致Store中文件数过多而影响读取的性能。
默认值 :6
无
无
hbase.hstore.compaction.max
控制一次compaction操作时的文件数量的最大值。与“hbase.hstore.compaction.max.size”的作用基本相同,主要是控制一次compaction操作的时间不要太长
10
空值
10
hbase.hstore.blockingStoreFiles
当列簇的HFile数达到该阈值,阻塞该region的所有操作,直到compcation完成,在put高负载场景下可以适当调大。
默认值:15
10
10
hbase.hstore.flusher.count
memstore的flush线程数,在put高负载场景下可以适当调大
2
无
无
hbase.regionserver.thread.compaction.small
HFile compaction线程数,在put高负载情况下可以适当调大
10
无
无
Scan相关参数
参数
功能
默认值/建议值
hbase39现有值
hbasea现有值
hbase.client.scanner.timeout.period
客户端和RegionServer端参数,表示scan租约的时间,建议设置为60000ms的整数倍,在读高负载情况下可以适当调大。单位:毫秒。
60000ms
60s
无
Handler相关参数
参数
功能
默认值/建议值
hbase39现有值
hbasea现有值
hbase.regionserver.handler.count
(提升实时读数据效率)
RegionServer上的RPC服务器实例数,建议设置为200 ~ 400之间。
200
30
30
hbase.regionserver.metahandler.count
RegionServer中处理优先请求的程序实例的数量,建议设置为200 ~ 400之间。
100
10
无
4.提升实时写数据效率
写数据服务端调优
参数
功能
默认值/建议值
hbase39现有值
hbasea现有值
hbase.regionserver.thread.compaction.throttle
控制一次Minor Compaction时,进行compaction的文件总大小的阈值。Compaction时的文件总大小会影响这一次compaction的执行时间,如果太大,可能会阻塞其它的compaction或flush操作。
1610612736(单位:字节)
无
无
hbase.hregion.majorcompaction
设置Major Compaction的执行周期。默认值为604800000毫秒。由于执行Major Compaction会占用较多的系统资源,如果正在处于系统繁忙时期,会影响系统的性能。
如果业务没有较多的更新、删除、回收过期数据空间时,可以把该值设置为0,以禁止Major Compaction。
如果必须要执行Major Compaction,以回收更多的空间,可以适当增加该值,同时配置参数“hbase.offpeak.end.hour”和“hbase.offpeak.start.hour”以控制Major Compaction发生在业务空闲的时期
604800000(单位:毫秒)
0.7day
0
7day
hbase.regionserver.maxlogs
hbase.regionserver.hlog.blocksize
表示一个RegionServer上未进行Flush的Hlog的文件数量的阈值,如果大于该值,RegionServer会强制进行flush操作。
表示每个HLog文件的最大大小。如果HLog文件大小大于该值,就会滚动出一个新的HLog文件,旧的将被禁用并归档。
这两个参数共同决定了RegionServer中可以存在的未进行Flush的hlog数量。当这个数据量小于MemStore的总大小的时候,会出现由于HLog文件过多而触发的强制flush操作。这个时候可以适当调整这两个参数的大小,以避免出现这种强制flush的情况。
32
134217728(单位:字节)—128mb
32
无
无
无
5.读/写数据表设计调优
配置参数
描述
默认值
COMPRESSION
配置数据的压缩算法,这里的压缩是HFile中block级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目的。
说明:
并非所有数据都可以进行有效压缩。例如一张图片的数据,因为图片一般已经是压缩后的数据,所以压缩效果有限。 常用的压缩算法是SNAPPY,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。
NONE
BLOCKSIZE
配置HFile中block块的大小,不同的block块大小,可以影响HBase读写数据的效率。越大的block块,配合压缩算法,压缩的效率就越好;但是由于HBase的读取数据是以block块为单位的,所以越大的block块,对于随机读的情况,性能可能会比较差。
如果要提升写入的性能,一般扩大到128KB或者256KB,可以提升写数据的效率,也不会影响太大的随机读性能。
65536(单位:字节)
IN_MEMORY
配置这个表的数据优先缓存在内存中,这样可以有效提升读取的性能。对于一些小表,而且需要频繁进行读取操作的,可以设置此配置项。
false
6.JVM参数优化
当集群数据量达到一定规模后,JVM的默认配置将无法满足集群的业务需求,轻则集群变慢,重则集群服务不可用。所以需要根据实际的业务情况进行合理的JVM参数配置,提高集群性能
变量名
变量影响的角色
hbase39现有值
hbasea现有值
HBASE_OPTS
该变量中设置的参数,将影响HBase的所有角色
-Xms8g -Xmx8g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:-CMSConcurrentMTEnabled -XX:+CMSIncrementalMode -D java .net.preferIPv4St
ack=true $HBASE_OPTS
HBASE_OPTS="$HBASE_OPTS -XX:+UseConcMarkSweepGC -XX:ErrorFile=/app/log/hbase/hs_err_pid%p.log -Djava .io.tmpdir=/tmp"
SERVER_GC_OPTS
该变量中设置的参数,将影响HBase Server端的所有角色,例如:Master、RegionServer等。
SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/app/log/hbase/gc.log-`date +'%Y%m%d%H%M'`"
CLIENT_GC_OPTS
该变量中设置的参数,将影响HBase的Client进程
HBASE_MASTER_OPTS
该变量中设置的参数,将影响HBase的Master
HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xmx30720m $JDK_DEPENDED_OPTS”
HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS-XX:MaxDirectMemorySize=4096m "
HBASE_REGIONSERVER_OPTS
该变量中设置的参数,将影响HBase的RegionServer
HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xmn4096m -XX:CMSInitiatingOccupancyFraction=70-Xms20480m -Xmx20480m $JDK_DEPENDED_OPTS”
HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS-XX:MaxDirectMemorySize=4096m "
HBASE_THRIFT_OPTS
该变量中设置的参数,将影响HBase的Thrift