• HBase之WAL与Flush


    Write Ahead Log (WAL)

    用于记录所有数据的更改。正常写入流程下,不需要wal,因为数据会通过memstore flush成storefile,但如果在memstore flush时RegionServer崩溃或不可用,WAL此时会确保可以回放整个数据的更改。如果写入WAL失败,则整个数据操作也会失败。

    • 正常每个RegionServer只有一个WAL,但存储hbase:meta表的RegionServer不同,该表会有专用的WAL。
    • WAL的目录为/hbase/WALs/ ,每个region有子目录

    WAL Provider

    通过hbase.wal.provider设置

    • WAL的实现:
      • filesystem:1.x版本的默认实现,使用dfsclient通过pipeline模式写入副本。日志中为FSHLog或FSHLogProvider
      • asyncfs:2.x版本的默认实现,AsyncFSWAL。使用dfsclient并发写入到每个副本。
      • multiwal:asyncfs或filesystem的多个实例实现

    WAL Splitting

    按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直到恢复之前不可用。

    splitting 步骤

    1. 将regionserver的wal目录重命名为/hbase/WALs/< host >,< port>,< startcode>-splitting
    2. 对每个日志文件进行spliting,将每个region对应的记录写到/hbase///recovered.edits/.temp文件中,该文件包含wal log中所有的关于该region的记录。log spliting完成之后,.temp文件将会被重命名为第一个写入该文件的sequence ID。
    3. log spliting完成之后,相关region就可以分配给regionserver。当region处于opend时,会检查recovered.edits目录下是否有文件,如果有则会重放,读取文件并将数据保存到memstore中。当所有的文件重放完成,memstore将数据刷写到磁盘之后,这些文件将会被删除。

    Flush

    HBase基于LSM-Tree模型,所有数据的更新都经由memstore达成一定大小后刷写到磁盘上。

    触发条件

    Flush触发的最小的单位是region

    1. 当某个MemStore的大小达到hbase.hregion.memstore.flush.size,所有属于该region下的MemStore都将被刷写到磁盘。
    2. 当某个regionserver所有的memstore的大小达到hbase.regionserver.global.memstore.size,该regionserver上所有的memstore将按照使用大小降序来flush,直到所有memstore的大小小于hbase.regionserver.global.memstore.size.lower.limit
    3. 当regionseverv上的wal log数量超过hbase.regionserver.max.logs,该regionserver上的所有memstore都将flush来减少wal log的数量。会按照时间先后顺序来flush,直到数量小于该参数值。
    4. 当region中所有的memstore大于hbase.hregion.memstore.block.multiplier*hbase.hregion.memstore.flush.size的值时,此时会阻塞写入并执行flush。
    5. 手动触发Flush

    相关参数

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    makedown文字上色技巧
    【华为OD机试真题 python】 字符串比较【2022 Q4 | 200分】
    显示屏没有信号monitor no signal from device
    大语言模型助力审计问题自动定性
    C# - Entity Framework 对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性
    C/C++语言100题练习计划 86——数的计算(递推实现)
    计算机网络_实验6_交换机的自学习算法
    C++ 将off格式文件转换成ply格式存储
    B-树----(多插平衡树)
    如何做一个无符号数识别程序
  • 原文地址:https://blog.csdn.net/zincooo/article/details/134421188