美文网首页
[Hbase] hbase的存储设计

[Hbase] hbase的存储设计

作者: LZhan | 来源:发表于2019-10-21 14:01 被阅读0次

    1.Hbase中的LSM存储思想

    1.1 什么是LSM树?
    LSM树是日志结构合并树,是由两个或两个以上的存储结构组成的,各自对应自己的存储介质。
    LSM树的简易模型描述:

    LSM简易模型.png

    第一层数据往往存储在内存当中,以快速插入为目标;第二层则是对第一层数据持久化的表现,当第一层中数据存储超过内存存储阈值,会将第一层数据刷写到硬盘上;第三层则是对第二层产生的在硬盘上的小文件的聚合合并。

    1.2 LSM思想在HBase中的实现
    结合下图说明:

    image.png

    <1> Level 0:日志/内存
    用户数据达到了regionserver,为了加速随机写,并不会直接将数据刷写到硬盘上,是写入log和memstore,即wal机制写入内存
    <2> Level 1:日志/内存
    将数据写入内存有存在阈值的概念,当超过阈值时会被异步线程刷写到硬盘中,生成硬盘中的文件,即storefile
    <3> Level 2:合并
    硬盘上存在很多的小文件,会在合适的时候会将按顺序将小文件合并成大文件。

    2.HBase存储模块简介

    image.png

    思考:storefile和hfile之间的关系???

    RegionServer=Region+Store+MemStore+StoreFile+HFile+HLog

    每个RegionServer是由多个Region组成成的,Region之间的数据是互斥的,并不会产生重复。
    Store则对应列族,有多少个列族就有多少个Store。每个Store里面只有1个Memstore,每个Store里面有多个HFile(StoreFile是HFile的抽象对象,所有如果说到StoreFile就是等于HFile)。每次Memstore的刷写(flush)就产生一个新的HFile出来。

    数据存储的流程基本为:
    用户数据 ====> Hlog ====> HRegion ====> MemStore ====> StoreFile ====> 合并封装成HFile
    ====》 向HDFS上刷写文件

    所以,Hlog(wal机制)+MemStore构成了LSM中的c0,保证数据可以快速随机写入,降低存储延迟,同时保证了高可用性;
    StoreFile+HFile构成了LSM中的c1,实现了不可靠数据的持久化。

    2.1 Region解析

    <1> 什么是Region?
    多个行构成Region,每一个Region会存储到确定的RegionServer,(是如何确定的呢???)
    Region是HBase分布式存储的最小单元。
    当Region变大达到阈值后,Region就会被拆分成两个Region,每个Region有三个标识,tableName,startRowkey和createTime。
    <2> Region的特点
    Region是HBase进行分布式存储和负载均衡的最小单元。存储的最小单元是HFile。
    Region的数量一定不能低于集群中节点的数量,Region在进行切分之后,会将Region信息重新写回到hbase:meta元信息表中(通过zookeeper找到元信息表在哪一个节点上)

    2.2 HFile解析

    HBase实际以HFile格式将数据保存在HDFS上。

    1. Store + MemStore + StoreFile
      Store就是一个列族,设置了几个列族,对于任意一个Region来说,就有几个Store。
      所以HBase被称为列式数据库,把一起访问的数据放在一个store里面。内存阈值默认是64M。

    2、HFile文件
    HFile的组成部分:


    HFile组成.png

    HFile的区域:


    image.png

    Data数据块:


    image.png

    Data数据块的第一位存储的是块的类型,后面存储的是多个KeyValue键值对,也就是单元格(Cell)的实现类。Cell是一个接口,KeyValue是它的实现类。

    image.png

    2.3 KeyValue类

    单元格Cell最重要的实现类

    image.png
    KeyValue类里面最后一个部分是存储数据的Value,而前面的部分都是存储跟该单元格相关的元数据信息。如果你存储的value很小,那么这个单元格的绝大部分空间就是rowkey,column family,column等的元数据,所以如果列族和列的名字如果很长,大部分的空间都被拿来存储这些元数据了。

    注意:如果存储的数据主要是归档数据,不太要求读写性能,可以使用压缩算法,极大地节省列簇,列等信息的空间。

    3.Hbase中的增删改查

    HBase:支持随机读写
    HDFS:要么新增,要么整个删除,不能修改
    其实HBase几乎总是在做新增操作。

    image.png

    KeyValue类中keyType的标识,可以用来标识是否是删除的数据,HBase中的删除操作并不是将数据真正的删除,而是进行标记,等到再次scan的时候,就不会查询出来。
    在之后运行的某个时间点,hbase会确定将标识为删除的数据给删除掉。但并不是在插入的过程中就直接删除掉了。

    真正删除数据发生在合并(Compaction)过程中
    HBase每隔一段时间会进行一次Compaction,合并的文件是HFile文件,合并分为minor compaction和major compaction。
    在HBase进行major compaction的时候,会将多个HFile合并成1个HFile,在这个过程中,一旦检测到被打上墓碑标记的记录,在合并的过程中就忽略这条记录。这样在新产生的HFile中,就没有这条记录了。

    相关文章

      网友评论

          本文标题:[Hbase] hbase的存储设计

          本文链接:https://www.haomeiwen.com/subject/mhnamctx.html