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