其他分享
首页 > 其他分享> > HBase 读数据流程和存储数据流程、MemStore溢写合并、In-memory compaction介绍、compaction策略详解

HBase 读数据流程和存储数据流程、MemStore溢写合并、In-memory compaction介绍、compaction策略详解

作者:互联网

HBase 读数据流程和存储数据流程

从zookeeper找到meta表的region的位置,然后读取meta表中的数据。而meta中有存储了用户表的region信息

根据namespace、表名和rowkey根据meta表中的数据找到对应的region信息

找到对应的regionserver,查找对应的region

从MemStore找数据,再去BlockCache中找,如果没有,再到StoreFile上读

可以把MemStore理解为一级缓存,BlockCache为二级缓存,但注意scan的时候BlockCache意义不大,因为scan是顺序扫描

在这里插入图片描述

1、数据存储流程

  1. HBase V2.x以前版本

  • 写内存(MemStore)

  • 二阶段StoreFiles合并

  1. V2.x

  • In-memory compaction(带合并的写内存)

  • 二阶段StoreFiles合并

HBase的数据存储过程是分为几个阶段的。写入的过程与HBase的LSM结构对应。

  1. 为了提高HBase的写入速度,数据都是先写入到MemStore(内存)结构中,V2.0 MemStore也会进行Compaction

  2. MemStore写到一定程度(默认128M),由后台程序将MemStore的内容flush刷写到HDFS中的StoreFile

  3. 数据量较大时,会产生很多的StoreFile。这样对高效读取不利,HBase会将这些小的StoreFile合并,一般3-10个文件合并成一个更大的StoreFile

1.1 写入MemStore

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-709kkjMn-1641477845823)(…/…/mdfileImgPath/image-20220106212639786.png)]

1.2 MemStore溢写合并

在这里插入图片描述

1.2.1 说明

l 当MemStore写入的值变多,触发溢写操作(flush),进行文件的溢写,成为一个StoreFile

l 当溢写的文件过多时,会触发文件的合并(Compact)操作,合并有两种方式(major,minor)

1.2.2 触发条件
<property>
    <name>hbase.hregion.memstore.flush.size</name>
    <value>134217728</value>
    <source>hbase-default.xml</source>
</property>

<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。

在这里插入图片描述

1.3.2 compaction策略

但Active segment flush到pipeline中后,后台会触发一个任务来合并pipeline中的数据。合并任务会扫描pipeline中所有的segment,将segment的索引合并为一个索引。有三种合并策略:

Basic compaction策略不清理多余的数据版本,无需对cell的内存进行考核

basic适用于所有大量写模式

eager compaction会过滤重复的数据,清理多余的版本,这会带来额外的开销

eager模式主要针对数据大量过期淘汰的场景,例如:购物车、消息队列等

adaptive compaction根据数据的重复情况来决定是否使用eager策略

该策略会找出cell个数最多的一个,然后计算一个比例,如果比例超出阈值,则使用eager策略,否则使用basic策略

1.3.3 配置

  1. 可以通过hbase-site.xml来配置默认In Memory Compaction方式

    <property>
        <name>hbase.hregion.compacting.memstore.type</name> 
        <value><none|basic|eager|adaptive></value>
    </property>
    
  2. 在创建表的时候指定

    create "test_memory_compaction", {NAME => 'C1', IN_MEMORY_COMPACTION => "BASIC"}    
    

1.3.4 StoreFile合并

当MemStore超过阀值的时候,就要flush到HDFS上生成一个StoreFile。因此随着不断写入,HFile的数量将会越来越多,根据前面所述,StoreFile数量过多会降低读性能

为了避免对读性能的影响,需要对这些StoreFile进行compact操作,把多个HFile合并成一个HFile

compact操作需要对HBase的数据进行多次的重新读写,因此这个过程会产生大量的IO。可以看到compact操作的本质就是以IO操作换取后续的读性能的提高

1.3.4.1 minor compaction
1.3.4.1.1 说明

Minor Compaction操作只用来做部分文件的合并操作,包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作

小范围合并,默认是3-10个文件进行合并,不会删除其他版本的数据

Minor Compaction则只会选择数个StoreFile文件compact为一个StoreFile

Minor Compaction的过程一般较快,而且IO相对较低

1.3.4.1.2 触发条件

在打开Region或者MemStore时会自动检测是否需要进行Compact(包括Minor、Major)

minFilesToCompact由hbase.hstore.compaction.min控制,默认值为3

即Store下面的StoreFile数量减去正在compaction的数量 >=3时,需要做compaction

1.3.4.2 major compaction
1.3.4.2.1 说明

l Major Compaction操作是对Region下的Store下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件

l 一般手动触发,会删除其他版本的数据(不同时间戳的)

1.3.4.2.2 触发条件

l 如果无需进行Minor compaction,HBase会继续判断是否需要执行Major Compaction

l 如果所有的StoreFile中,最老(时间戳最小)的那个StoreFile的时间间隔大于Major Compaction的时间间隔(hbase.hregion.majorcompaction——默认7天)

<property>  
    <name>hbase.hregion.majorcompaction</name>  
    <value>604800000</value>  
    <source>hbase-default.xml</source>  
</property>  

604800000毫秒 = 604800秒 = 168小时 = 7天

标签:流程,合并,读数据,StoreFile,compaction,MemStore,HBase,segment
来源: https://blog.csdn.net/qq_40585384/article/details/122354039