优化指定客户机群的单台HBase节点的稳定写入速度至不少于9.4MB/s。
(1)关掉HLog
put.setWriteToWAL(false);
(2)加大JVM内存>=90GB
(3)使用mapreduce批量写入(4)调大写缓存,调小读缓存
hbase.regionserver.global.memestore.upperlimit = 0.5
hfile.block.cache.size = 0.3
(5)使用批量写
table.put(puts)
(6)autoflush设置
table.setAutoFlush(false)
...
table.flushCommits();
或者设置
hbase.client.write.buffer
(7)延迟日志flush
hbase.regionserver.optionallogflushinterval
默认1s,增大改值
(8)增大regionserver handler数量
hbase.regionserver.handler.count=300
HBase服务端调优
GC_OPTS
HBase是利用内存完成读写操作。提高HBase内存可以有效提高HBase性能。GC_OPTS主要需要调整HeapSize和NewSize的大小。调整HeapSize大小的时候,建议将Xms和Xmx设置成相同的值,这样可以避免JVM动态调整HeapSize大小的时候影响性能。调整NewSize大小的时候,建议把其设置为HeapSize大小的1/9。
当HBase集群规模越大,Region数量越多时,可以适当调大HMaster的GC_OPTS参数
RegionServer需要比HMaster更大的内存,在内存充足的情况下,HeapSize可以相对设置大一些。
HMaster的HeapSize为4G的时候,HBase集群可以支持100000个Region的规模。根据经验值,单个RegionServer的HeapSize不建议超过20GB。
# HMaster、RegionServer GC_OPTS配置如下:
HMaster: -Xms2G -Xmx2G -XX:NewSize=256M -XX:MaxNewSize=256M
RegionServer: -Xms4G -Xmx4G -XX:NewSize=512M -XX:MaxNewSize=512M
RegionServer并发请求处理数量
hbase.regionserver.handler.count
表示RegionServer在同一时刻能够并发处理多少请求。如果设置过高会导致激烈的线程竞争,如果设置过小,请求将会在RegionServer长时间等待,降低处理能力。应该根据资源情况,适当增加处理线程数。
建议根据CPU的使用情况,可以设置为100至300之间的值。
控制MemStore的大小
hbase.hregion.memstore.flush.size
默认值128M,单位字节,一旦有MemStore超过该值将被flush,如果regionserver的jvm内存比较充足(16G以上),可以调整为256M。在内存足够put负载大情况下可以调整增大。
BlockCache优化
BlockCache作为读缓存,合理设置对于提高读性能非常重要。默认情况下,BlockCache和MemStore的配置各占40%,可以根据集群业务进行修正,比如读多写少业务可以将BlockCache占比调大。另外BlockCache的策略也很重要,不同策略对读性能来说影响并不大,但是对GC的影响 却很显著。
HBase缓存区大小,主要影响查询性能。根据查询模式以及查询记录分布情况来决定缓存区的大小。如果采用随机查询使得缓存区的命中率较低,可以适当降低缓存大小。
hfile.block.cache.size,默认0.4,用来提高读性能
hbase.regionserver.global.memstore.size,默认0.4,用来提高写性能
控制HFile个数
MemStore在flush之前,会进行StoreFile的文件数量校验(通过hbase.hstore.blockingStoreFiles
参数配置),如果大于设定值,系统将会强制执行Compaction操作进行文件合并,在合并的过程中会阻塞MemStore的数据写入,等待其他线程将StoreFile进行合并。通常情况下发生在数据写入很快的情况下。
hbase.hstore.compactionThreshold
表示启动Compaction的最低阈值,该值不能太大,否则会积累太多文件,一般建议设置为5~8左右。
hbase.hstore.blockingStoreFiles
默认设置为7,可以适当调大一些。
Split优化
hbase.hregion.max.filesize
表示HBase中Region的文件总大小的最大值。当Region中的文件大于该参数时,将会导致Region分裂。
- 如果该参数设置过小时,可能会导致Split操作频繁
- 如果该参数设置过大时,会导致Compaction操作需要处理的文件个数增大,影响Compaction执行效率
Compaction优化
hbase.hstore.compaction.min
当一个Store中文件超过该值时,会进行Compaction,适当增大该值,可以减少文件被重复执行Compaction。但是如果过大,会导致Store中文件数过多而影响读取的性能。
hbase.hstore.compaction.max
控制一次Compaction操作时的文件数据量的最大值。
hbase.hstore.compaction.max.size
如果一个HFile文件的大小大于该值,那么在Minor Compaction操作中不会选择这个文件进行Compaction操作,除非进行Major Compaction操作。这个值可以防止较大的HFile参与Compaction操作。在禁止Major Compaction后,一个Store中可能存在几个HFile,而不会合并成为一个HFile,这样不会对数据读取造成太大的性能影响。
原则是:尽量要减小Compaction的次数和Compaction的执行时间