用于记录所有数据的更改。正常写入流程下,不需要wal,因为数据会通过memstore flush成storefile,但如果在memstore flush时RegionServer崩溃或不可用,WAL此时会确保可以回放整个数据的更改。如果写入WAL失败,则整个数据操作也会失败。
通过hbase.wal.provider设置
按region对wal edits分组被称为log splitting。主要目的是为了regionserver崩溃时恢复数据。
因每个RegionServer的所有region共享一个wal file,所以对wal的每次修改都会包含所属region信息。当region打开时,wal中属于该region的edits将会被重放。所以wal file必须按照region分组,以便在重放时恢复特定region的数据。
集群启动或regionserver关闭时,由hmaster完成log spliting。为了保证一致性,受影响的region直到恢复之前不可用。
HBase基于LSM-Tree模型,所有数据的更新都经由memstore达成一定大小后刷写到磁盘上。
Flush触发的最小的单位是region
hbase.regionserver.global.memstore.size=heap*0.4
-旧版参数hbase.regionserver.global.memstore.upperLimit
regionserver上所有memstore的最大值,超过该值此regionserver上所有的memstore都将被阻塞更新并强制刷写
hbase.regionserver.global.memstore.size.lower.limit=0.95*heap*0.4
-旧版参数hbase.regionserver.global.memstore.lowerLimit
regionserver上所有memstore大小的水位线,超过该值将会强制此regionserver上所有的memstore强制刷写
hbase.hregion.memstore.flush.size=128M
单个memstore最大大小
hbase.regionserver.max.logs=32
当regionserver的hlog数量达到该值
hbase.hregion.memstore.block.multiplier=4
防止较大的写入导致oom
hbase.hstore.flusher.count=2
flush线程的数量,数量越多,并行越高,会导致hdfs的负载加重、compaction发生的频率增加
hbase.hstore.blockingStoreFiles=16
任何一个store下的StoreFiles超过该值,则memstore的刷新将会被阻塞直到compaction完成或者达到阻塞等待的时间(hbase.hstore.blockingWaitTime)
hbase.hstore.blockingWaitTime=90000