一,HBase读写原理深入
HBase读流程
meta表位于的位置信息查看>>>>
HBase写流程
- 首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息
- 根据namespace、表名和rowkey信息。找到写入数据对应的region信息
- 找到这个region对应的regionServer,然后发送请求
- 把数据分别写到HLog(write ahead log)和memstore各一份
- memstore达到阈值后把数据刷到磁盘,生成storeFile文件
- 删除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.