hbase的一些优化

Hbase部署的环境千差万别,因此默认的配置并不能很好地满足实际生产环境的应用,对于不同的应用场景需要进行一定的调优。这里记述一下,工作过程中调整过的一些参数。

  1. mapreduce.map.speculative mapreduce.reduce.speculative 是否启动map阶段的推测执行,默认为true。其实一般情况设置为false比较好。可通过方法job.setMapSpeculativeExecution 和 job.setReduceSpeculativeExecution来设置。

  2. hbase.mapreduce.input.autobalance TableScanMR原理上主要实现了ScanAPI的并行化,将scan按照region边界进行切分。这种场景下整个scan的时间基本等于最大region扫描的时间。在某些有数据倾斜的场景下可能出现某一个region上有大量待扫描数据,而其他大量region上都仅有很少的待扫描数据。这样并行化效果并不好。针对这种数据倾斜的场景TableScanMR做了平衡处理,它会将大region上的scan切分成多个小的scan使得所有分解后的scan扫描的数据量基本相当。此参数设置为true时可启动优化,默认为false。

  3. hbase.regionserver.handler.count 定义了用户访问表的请求的线程数,默认为30。较小的值可防止客户端在高并发使用较大缓冲区的情况下使服务器负载过重,从而发生OutOfMemoryError。

  4. hbase.hregion.max.filesize 默认为10737418240即10g,更大的region可以减少集群总的region数目,可以适当增大region的大小

  5. hbase.regionserver.global.memstore.upperLimit和hbase.regionserver.global.memstore.lowerLimit是memstore刷新的上限阈值和下限阈值,默认分别为0.4和0.35。上下限设置得近一些,可以防止过度刷新。当处理读请求时,可以降低上下限来增加块缓存的空间。对于写请求如果数据量都特别小,可以适当地增大阈值,防止过多的I/O操作。

  6. hbase.hstore.blockingStoreFiles 默认为16,此值决定了当一个region中的存储文件数目达到阈值时,更新操作如put和delete等将会被阻塞以便进行合并操作以减少文件数目。如果region服务器文件数量很大,则不应该增大这个值,过高的值会延迟由于服务器负载过重而产生的无法避免的问题。

  7. hbase.hregion.memstore.block.multiplier 默认为2,是一个用来阻塞客户端请求的安全阈值。当有足够的存储空间时,中以适当增大该值,从而能处理更多的写请求。不要过大,否则会超过memstore的限制,阻塞写请求。

  8. hbase.regionserver.maxlogs和hbase.regionserver.hlog.blocksize。hbase.regionserver.maxlogs默认为32,hbase.regionserver.hlog.blocksize默认为2 HDFS block size(默认为128MB)。这个两个值决定了WAL文件的大小,WAL的最大值为hbase.regionserver.maxlogs hbase.regionserver.hlog.blocksize=32 256MB = 8G。如果值过于低,会导致memstore频繁的flush。要确保hbase.regionserver.hlog.blocksize hbase.regionserver.maxlogs >= hbase.regionserver.global.memstore.lowerLimit * HBASE_HEAPSIZE。

    此公式存疑,另见官网wiki:

    1
    HBase also has a limit on the number of WAL files, designed to ensure there’s never too much data that needs to be replayed during recovery. This limit needs to be set according to memstore configuration, so that all the necessary data would fit. It is recommended to allocate enough WAL files to store at least that much data (when all memstores are close to full). For example, with 16Gb RS heap, default memstore settings (0.4), and default WAL file size (~60Mb), 16Gb*0.4/60, the starting point for WAL file count is ~109. However, as all memstores are not expected to be full all the time, less WAL files can be allocated.

地址: http://hbase.apache.org/book.html#config.wals