hbase中数据flush,compaction以及region拆分时机

1. 数据的 Flush 过程

当 Memstore 太大了达到尺寸上的阀值,或者达到了刷写时间间隔阀值的时候,HBaes 会被这个 Memstore 的内容刷写到HDFS系统上,称为一个存储在硬盘上的HFile文件。 同时删除 HLog 中的历史数据 至此,我们可以称为数据真正地被持久化到硬盘上,就算宕机,断电,数据也不会丢失了。

有 3 个条件满足任意一个都可以触发 flush:

1.当一个 RegionServer 中的所有 MemStore 的大小只和超过了堆内存的 40%. 
则这个 RegionServer 中所有的 MemStore 一起刷到 HFile 中
hbase.regionserver.global.memstore.size=0.4    //regionserver级别
hbase.regionserver.global.memstore.size.lower.limit=0.95   //溢写0.05的百分比即停止

2.当有任何一个 MemStore 的存活时间超过了 1h, 则这个 RegionServer 中所有的 MemStore 一起刷到 HFile 中.
hbase.regionserver.optionalcacheflushinterval=3600000   //regionserver级别

3.当所有的 Region 中的 MemStore 之和超过 128M, 也会触发.
hbase.hregion.memstore.flush.size=134217728(128M)   //region级别

2.数据的合并过程

由于前面的刷写过程的存在, 有可能会导致磁盘上有比较多的 HFile 小文件, 而 HDFS 并不适合存储小文件, 所以就存在了一个小文件合并的过程.

有 2 种合并:

1.小和并(Minor Compaction): 当一个 Region 中的 HFile 的数量超过一个值(默认10)的时候, 这个 Region 中的 HFile 会进行合并成换一个文件, 并删除旧的文件.

 <!-- 每个minor compaction操作的 允许的最大hfile文件上限 -->  
    <property>  
        <name>hbase.hstore.compaction.max</name>  
        <value>10</value>  
        <description>Max number of HStoreFiles to compact per 'minor'  
            compaction.</description>  
    </property> 

2.大合并(Major Compaction): Major compaction 指一个 region 下的所有 HFile 做归并排序, 最后形成一个大的HFile. 这可以提高读性能.

<!-- 一个region进行 major compaction合并的周期,在这个点的时候, 这个region下的所有hfile会进行合并,默认是7天,major   
        compaction非常耗资源,建议生产关闭(设置为0),在应用空闲时间手动触发 -->  
    <property>  
        <name>hbase.hregion.majorcompaction</name>  
        <value>604800000</value>  
        <description>The time (in miliseconds) between 'major' compactions of  
            all  
            HStoreFiles in a region. Default: Set to 7 days. Major compactions tend to  
            happen exactly when you need them least so enable them such that they  
            run at  
            off-peak for your deploy; or, since this setting is on a periodicity that is  
            unlikely to match your loading, run the compactions via an external  
            invocation out of a cron job or some such.  
        </description>  
    </property>  

但是, major compaction重写所有的Hfile, 占用大量硬盘IO和网络带宽. 这也被称为写放大现象(write amplification)

Major compaction 可以被调度成自动运行的模式, 但是由于写放大的问题(write amplification), major compaction通常在一周执行一次或者只在凌晨运行.

3. Region 拆分

最初, 每张表只有一个 region, 当一个 region 变得太大时, 它就分裂成 2 个子region.

2个子 region, 各占原始 region 的一半数据, 仍然被相同的 region server管理.

然后Region server向HBase master节点汇报拆分完成.

如果集群内还有其他 region server, master 节点倾向于做负载均衡, 所以master节点有可能调度新的 region 到其他 region server, 由其他 region 管理新的分裂出的region.

一个region大小超过256M时,region会拆分
以后的拆分时机n*n*n*256M   //n为region的个数,最大的拆分时机不大于10G
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase数据存储在Region,每个Region负责一段连续的key范围。当一个Region数据量过大或者key范围过于分散时,需要进行Region拆分或合并操作。 ## Region拆分 Region拆分可以将一个过大的Region分割成两个或多个相对较小的Region,以便更好地管理和利用硬件资源。 ### 触发条件 当一个Region数据量超过了hbase.hregion.max.filesize(默认为1GB)或者key范围过于分散时,会触发Region拆分操作。 ### 操作过程 1. HBase会在Region拆分点(split point)处选择一个新的Region作为拆分后的Region之一,同时将原有Region数据分配到拆分后的两个Region。 2. HBase会将拆分点及其前面的数据都分配给新的Region,将拆分点后面的数据留在原有的Region。 3. HBase会将拆分点及其前面的数据范围作为新Region的key范围,将原有Region的key范围修改为拆分点后面的数据范围。 ### 操作示例 假设有一个Region的key范围为[a,c),数据量为1.5GB,超过了hbase.hregion.max.filesize,需要进行拆分操作。 1. HBase会选择一个拆分点(split point),例如选择b作为拆分点。 2. HBase会创建一个新的Region,key范围为[b,c),同时将[a,b)范围内的数据分配给新的Region,将[c,∞)范围内的数据留在原有的Region。 3. HBase会将[a,b)范围作为原有Region的key范围,将[b,c)范围作为新Region的key范围。 ## Region合并 Region合并可以将相邻的两个Region合并为一个Region,以便更好地利用硬件资源。 ### 触发条件 当相邻的两个Region数据总量小于hbase.hregion.max.filesize(默认为1GB)且key范围连续时,会触发Region合并操作。 ### 操作过程 1. HBase会选择相邻的两个Region进行合并,将它们的数据合并到一个新的Region。 2. HBase会将两个Region的key范围合并为一个key范围。 ### 操作示例 假设有两个相邻的Region,key范围分别为[a,b)和[b,c),数据总量小于hbase.hregion.max.filesize,需要进行合并操作。 1. HBase会将两个Region数据合并到一个新的Region,key范围为[a,c)。 2. HBase会将两个Region的key范围合并为[a,c)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值