结论: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不睡觉书》笔记