WAL的优化

结论:WAL没啥可优化的!!!
结论:WAL没啥可优化的!!!
结论:WAL没啥可优化的!!!


一个Region默认只有一个WAL实例(在HBase1.0可以开启MultiWAL功能,开始支持多个WAL。参见HBASE-5699)。WAL实例启动后在内存中维护了一个线程安全的并发集合(ConcurrentNavigableMap)。这个ConcurrentNavigableMap包含了很多个WAL文件的引用。当一个文件写满了就会开始下一个文件。当WAL工作的时候WAL文件数量会不断增长直到达到一个阈值后开始滚动。

跟WAL有关的优化参数有:

  • hbase.regionserver.maxlogs:Region中的最大WAL文件数量,默认值是32。 当WAL的数量超过这个阀值之后就会引发WAL日志滚动,旧的日志会被清理掉。
  • hbase.regionserver.hlog.blocksize:HDFS块大小,没有默认值,如果不设定该值,HBase就会直接调用HDFS的API去获取出。
  • hbase.regionserver.logroll.multiplier:WAL文件大小因子。每一个WAL文件所占的大小通过HDFS块大小 * WAL文件大小因子得出。默认值是0.95。

早期关于WAL的设置优化主要是针对如何设置合理的 hbase.regionserver.maxlogs的。maxlogs就是允许有多少个WAL文件同时存在于Region之中,当WAL的数量超过了这个阈值之后就会引发WAL日志滚动,关于WAL日志滚动参见WAL预写日志。 

关于如何设置合理的maxlogs数值,Hortonworks给出了建议公式:

(regionserver_heap_size * memstore_fraction) / default_WAL_size
  • regionserver_heap_size:RegionServer的堆内存大小。
  • memstore_fraction:memstore在JVM的堆内存中占用的比例。
  • default_WAL_size:单个WAL文件的大小。

举个例子:
regionserver_heap_size:假设集群中的每个RegionServer 的堆内存大小是16GB。
memstore fraction:假设memstore占40%的堆内存大小,那么这个数值就是0.4。
default_WAL_size:假设设定了 hbase.regionserver.logroll.multiplier为0.95,而HDFS的块大小是64MB,那么现在单个WAL文件的大小就是60.8MB,为了计算简单就算60MB。
套用公式就是:(1638MB * 0.4) / 60MB = 109。则WAL大小的上限的最优值是109。

不过,后来HBase舍弃了hbase.regionserver.maxlogs。理由是大多数人并不知道这个公式,所以直接采用了默认值32。但是在上面的例子中,maxlogs轻易地就超过了100。而在例子中的参数其实都是很平常的服务器设置。这就给大多数用户造成了很多不便。

因此在新的版本中,HBase把hbase.regionserver.maxlogs的定义权从用户手中收回。直接由HBase内部自己计算出maxlogs的最优值。

Math.max(32, (regionserverHeapSize * memstoreSizeRatio * 2 / logRollSize))
  • regionserverHeapSize:RegionServer的堆内存大小。
  • memstoreSizeRatio:memstore在JVM的堆内存中占用的比例。
  • logRollSize:单个WAL文件的大小。

在新的版本中,如果设置了hbase.regionserver.maxlogs,会得到一句警告'hbase.regionserver.maxlogs'  was deprecated。意味设置了也没有什么用。

其实Region级别的优化对性能的提高效果并不是很大, 而对于Store的优化比对Region的优化更重要。


《Hbase不睡觉书》笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值