HBase读写原理与Region拆分合并

 一,HBase读写原理深入 

HBase读流程 

meta表位于的位置信息查看>>>>

 HBase写流程

  1. 首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息
  2. 根据namespace、表名和rowkey信息。找到写入数据对应的region信息
  3. 找到这个region对应的regionServer,然后发送请求
  4. 把数据分别写到HLog(write ahead log)和memstore各一份
  5. memstore达到阈值后把数据刷到磁盘,生成storeFile文件
  6. 删除HLog中的历史数据

 HBase写流程 Flash机制

当memstore的大小超过这个值的时候,会flush到磁盘,默认为128M

当memstore中的数据时间超过1小时,会flush到磁盘 

HregionServer的全局memstore的大小,超过该大小会触发flush到磁盘的操作,默认是堆大小的40%

手动flush命令: flush tableName


阻塞机制

Hbase中是周期性的检查是否满足以上标准满足则进行刷写,但是如果在下次检查到来之前,数据疯狂写入Memstore中,会出现以下问题:

会触发阻塞机制,此时无法写入数据到Memstore,数据无法写入Hbase集群。

  • memstore中数据达到512MB---》可以通过调大机器内存提高阈值

计算公式:hbase.hregion.memstore.flush.size*hbase.hregion.memstore..block.multiplier                      hbase.hregion.memstore.flush.size刷写的阀值,默认是 134217728,即128MB。                   hbase.hregion.memstore.block.multiplier是一个倍数,默认是4。

  • RegionServer全部memstore达到规定值

hbase.regionserver.global.memstore.size.lower.limit是0.95, hbase.regionserver.global.memstore.size是0.4, 堆内存总共是 16G,

触发刷写的阈值是:6.08GB  、触发阻塞的阈值是:6.4GB 


Compact合并机制(增加读取的性能,减少访问的file)

minor compact 小合并 

触发条件:

memstore flush 在进行memstore flush前后都会进行判断是否触发compact

定期检查线程 周期性检查是否需要进行compaction操作,由参数:hbase.server.thread.wakefrequency决定,默认值是10000 millseconds

  • 在将Store中多个HFile(StoreFile)合并为一个HFile 这个过程中,删除和更新的数据仅仅只是做了标记,并没有物理移除,这种合并的触发频率很高。
  • minor compact文件选择标准由以下几个参数共同决定:
<!--待合并文件数据必须大于等于下面这个值-->
<property>
    <name>hbase.hstore.compaction.min</name>
    <value>3</value>
</property>
<!--待合并文件数据必须小于等于下面这个值-->
<property>
    <name>hbase.hstore.compaction.max</name>
    <value>10</value>
</property>
<!--默认值为128m,
表示文件大小小于该值的store file 一定会加入到minor compaction的store file中
-->
<property>
    <name>hbase.hstore.compaction.min.size</name>
    <value>134217728</value>
</property>
<!--默认值为LONG.MAX_VALUE,
表示文件大小大于该值的store file 一定会被minor compaction排除-->
<property>
    <name>hbase.hstore.compaction.max.size</name>
    <value>9223372036854775807</value>
</property>

major compact 大合并

触发条件:

##使用major_compact命令手动触发:  major_compact tableName

major compaction触发时间条件:

  • 合并Store中所有的HFile为一个HFile

这个过程有删除标记的数据会被真正移除,同时超过单元格maxVersion的版本记录也会被删除。合并频率比较低,默认7天执行一次,并且性能消耗非常大,建议生产关闭(设置为 0),在应用空闲时间手动触发。一般可以是手动控制进行合并,防止出现在业务高峰期。 

二,Region拆分策略与预分区

Region中存储的是大量的rowkey数据 ,当Region中的数据条数过多的时候,直接影响查询效率.当Region过大的时候.HBase会拆分Region 

 拆分策略:

ConstantSizeRegionSplitPolicy(已遗弃)

当region大小大于某个阈值(hbase.hregion.max.filesize=10G)之后就会触发切分,一个region等分为2个region,该种拆分方式统一性的处理没有大表和小表的区分,阈值设置大不友好,设置小了又影响性能

IncreasingToUpperBoundRegionSplitPolicy

总体看和ConstantSizeRegionSplitPolicy思路相同,一个region大小大于设置阈值就会触发切分。但是这个阈值并不像 ConstantSizeRegionSplitPolicy是一个固定的值,而是会在一定条件下不断调整,调整规则和region所属表在当前regionserver上的region个数有关系.

SteppingSplitPolicy(默认策略)

如果region个数等于1, 切分阈值为flush size * 2,否则为MaxRegionFileSize。这种切分策略对于大集群中的大表、小表会比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,小 表不会再产生大量的小region,而是适可而止。

KeyPrefixRegionSplitPolicy

根据rowKey的前缀对数据进行分组,这里是指定rowKey的前多少位作为前缀,比如rowKey都是16位的,指定前5位是前缀,那么前5位相同的rowKey在进行region split的时候会分 到相同的region中。

DelimitedKeyPrefixRegionSplitPolicy

保证相同前缀的数据在同一个region中,例如rowKey的格式为:userid_eventtype_eventid,指定的delimiter为 _ ,则split的的时候会确保userid相同的数据在同一个 region中。

DisabledRegionSplitPolicy <不启用自动拆分, 需要指定手动拆分>

Region拆分策略可以全局统一配置,也可以为单独的表指定拆分策略。

### 全局
<property>
<name>hbase.regionserver.region.split.policy</name>
<value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
</property>

###局部表
create 'test2', {METADATA => {'SPLIT_POLICY' =>
'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy'}},{NAME => 'cf1'

预分区: 之前Hbase文章有提到过,新建一个table的时候默认情况下只会创建一个Region,那么在集群的情况下,只有一个RegionServer会处于使用的状态,且待拆分。这样子就会出现资源没有合理利用的问题,且说到集群自然避开不了负载均衡,这样子也就达不到负载均衡的效果了。所以在创建表之前进行预分区。

预分区作用:

  • 增加数据读写效率
  • 负载均衡,防止数据倾斜
  • 方便集群容灾调度region 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region堆

调整预分区方式:(实际会切分4个Region, 0~1000, 1000~2000, 2000~3000, 3000>>)

create 'mytest2','info1','info2',SPLITS => ['1000','2000','3000'] 

$ 有资料上了解到文件分区的方式,但是这种方式分区后,存储数据时具体是根据何种方式存储到具体的Region中还有待日后测试,实现方式这里只贴操作图

 三,Region合并

region的合并,通常情况下,是垃圾数据处理之后,为了维护数据的快速访问而去合并

Shell以外通过org.apache.hadoop.hbase.util.Merge类合并:

hbase org.apache.hadoop.hbase.util.Merge mytest \
test1,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59. \
test2,12345,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.

猜你喜欢

转载自blog.csdn.net/qq_42773863/article/details/121366260