HBase写入三阶段
2020-05-12 15:43:58 0 举报
hbase写入三阶段
作者其他创作
大纲/内容
Linux Disruptor
触发条件
wal.sync
Ring BufferTrunk(FSWALEntry)
wal.append
Ring BufferTrunk(SyncFuture)
Write back to MemStore
publish
WALFile
Release row locks
FSWALEntry
Hlog的持久化级别:SKIP_WAL:只写缓存,不写HLog日志ASYNC_WAL:异步将数据写入HLog日志中。SYNC_WAL:同步将数据写入日志文件中,需要注意的是,数据只是被写入文件系统中,并没有真正落盘FSYNC_WAL:同步将数据写入日志文件并强制落盘。这是最严格的日志写入等级,可以保证数据不会丢失,但是性能相对比较差。USER_DEFAULT:默认设置,如果用户没有指定,默认使用SYNC_WAL客户端设置:put.setDurability(Durability.SYNC_WAL)
1、客户端处理阶段
Acquire Locks
Update LATEST_TIMESTAMP timestamps
Sync wal
3、MemStore Flush阶段
上图的写入过程会导致吞吐量受限的问题,经过大量的演进,目前版本的写入调整为下面这种模式
HLog写入模型
图中最左侧部分是Region处理HLog写入的两个前后操作:append和sync。当调用append后,WALEdit和HLogKey会被封装成FSWALEntry类,进而再封装成Ring BufferTruck类放入Disruptor无锁有界队列中。当调用sync后,会生成一个SyncFuture,再封装成RingBufferTruck类放入同一个队列中,然后工作线程会被阻塞,等待notify()来唤醒。最右侧部分是消费者线程,在Disruptor框架中有且仅有一个消费者线程工作。这个框架会从Disruptor队列中依次取出RingBufferTruck对象,然后根据如下选项来操作:•如果RingBufferTruck对象中封装的是FSWALEntry,就会执行文件append操作,将记录追加写入HDFS文件中。需要注意的是,此时数据有可能并没有实际落盘,而只是写入到文件缓存。•如果RingBufferTruck对象是SyncFuture,会调用线程池的线程异步地批量刷盘,刷盘成功之后唤醒工作线程完成HLog的sync操作
2、Region写入阶段
RegionServer
Append WALEdit To WAL
当Region中MemStore容量超过一定阈值,系统会异步执行flush操作,将内存中的数据写入文件,形成HFile。
RegionServer接收到写入请求之后将数据解析出来,首先写入WAL,再写入对应Region列簇的MemStore。
client
SyncFuture
Sync to wal
Build WAL edit
append
1、MemStore级别限制:当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发MemStore刷新。2、Region级别限制:当Region中所有MemStore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size),会触发MemStore刷新。3、Region Server级别限制:当一个Region Server中所有Memstore的大小总和达到了上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认 40%的JVM内存使用量),会触发部分Memstore刷新。Flush顺序是按照Memstore由大到小执行,先Flush Memstore最大的Region,再执行次大的,直至总体Memstore内存使用量低于阈值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38%的JVM内存使用量)。如果此时写入吞吐量依然很高,导致总MemStore大小超过高水位阈值hbase.regionserver.global.memstore.size,RegionServer会阻塞更新并强制执行flush,直至总MemStore大小下降到低水位阈值。4、当一个Region Server中HLog数量达到上限(可通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个 HLog对应的一个或多个Region进行flush
本地缓冲区
根据rowkey找到对应的RegionServer
结束事务advance mvcc
客户端将用户的写入请求进行预处理,并根据集群元数据定位写入数据所在的RegionServer,将请求发送给对应的RegionServer
0 条评论
下一页