HBase 读数据流程和存储数据流程
1、数据存储流程
-
HBase V2.x以前版本
-
V2.x
HBase的数据存储过程是分为几个阶段的。写入的过程与HBase的LSM结构对应。
-
为了提高HBase的写入速度,数据都是先写入到MemStore(内存)结构中,V2.0 MemStore也会进行Compaction
-
MemStore写到一定程度(默认128M),由后台程序将MemStore的内容flush刷写到HDFS中的StoreFile
-
数据量较大时,会产生很多的StoreFile。这样对高效读取不利,HBase会将这些小的StoreFile合并,一般3-10个文件合并成一个更大的StoreFile
1.1 写入MemStore
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-709kkjMn-1641477845823)(…/…/mdfileImgPath/image-20220106212639786.png)]
-
Client访问zookeeper,从ZK中找到meta表的region位置
-
读取meta表中的数据,根据namespace、表名、rowkey获取对应的Region信息
-
通过刚刚获取的地址访问对应的RegionServer,拿到对应的表存储的RegionServer
-
去表所在的RegionServer进行数据的添加
-
查找对应的region,在region中寻找列族,先向MemStore中写入数据
1.2 MemStore溢写合并
1.2.1 说明
1.2.2 触发条件
- 一旦MemStore达到128M时,则触发Flush溢出(Region级别)
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
<source>hbase-default.xml</source>
</property>
- MemStore的存活时间超过1小时(默认),触发Flush溢写(RegionServer级别)
<property>
<name>hbase.regionserver.optionalcacheflushinterval</name>
<value>3600000</value>
<source>hbase-default.xml</source>
</property>
1.3 In-memory合并
1.3.1 In-memory compaction介绍
In-memory合并是HBase 2.0之后添加的。它与默认的MemStore的区别:实现了在内存中进行compaction(合并)。
在CompactingMemStore中,数据是以段(Segment)为单位存储数据的。MemStore包含了多个segment。
-
当数据写入时,首先写入到的是Active segment中(也就是当前可以写入的segment段)
-
在2.0之前,如果MemStore中的数据量达到指定的阈值时,就会将数据flush到磁盘中的一个StoreFile
-
2.0的In-memory compaction,active segment满了后,将数据移动到pipeline中。这个过程跟以前不一样,以前是flush到磁盘,而这次是将Active segment的数据,移到称为pipeline的内存当中。一个pipeline中可以有多个segment。而In-memory compaction会将pipeline的多个segment合并为更大的、更紧凑的segment,这就是compaction
-
HBase会尽量延长CompactingMemStore的生命周期,以达到减少总的IO开销。当需要把CompactingMemStore flush到磁盘时,pipeline中所有的segment会被移动到一个snapshot中,然后进行合并后写入到HFile
1.3.2 compaction策略
但Active segment flush到pipeline中后,后台会触发一个任务来合并pipeline中的数据。合并任务会扫描pipeline中所有的segment,将segment的索引合并为一个索引。有三种合并策略:
- basic(基础型)
- eager(饥渴型)
- adaptive(适应型)
1.3.3 配置
-
可以通过hbase-site.xml来配置默认In Memory Compaction方式
<property> <name>hbase.hregion.compacting.memstore.type</name> <value><none|basic|eager|adaptive></value> </property>
-
在创建表的时候指定
create "test_memory_compaction", {NAME => 'C1', IN_MEMORY_COMPACTION => "BASIC"}
1.3.4 StoreFile合并
1.3.4.1 minor compaction
1.3.4.1.1 说明
1.3.4.1.2 触发条件
1.3.4.2 major compaction
1.3.4.2.1 说明
l Major Compaction操作是对Region下的Store下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件
l 一般手动触发,会删除其他版本的数据(不同时间戳的)
1.3.4.2.2 触发条件
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
<source>hbase-default.xml</source>
</property>
604800000毫秒 = 604800秒 = 168小时 = 7天