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 |
|
这两个参数共同决定了RegionServer中可以存在的未进行Flush的hlog数量。当这个数据量小于MemStore的总大小的时候,会出现由于HLog文件过多而触发的强制flush操作。这个时候可以适当调整这两个参数的大小,以避免出现这种强制flush的情况。 |
| 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 -Djava.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 |