大数据学习日志(五)——HBase读写流程、合并机制

HRegion
  • 在HBase中,会从行键方向对一个表进行切分,切分出来的每一块结构就是一个Hregion,每一个HRegion交给一个HRegionServer,这样设计能够保证请求的分布均衡
  • 因为HBase中行键是有序的,所以HRegion之间的数据是不交叉的
  • 当HRegion中的数据达到一定的限度的时候,HRegion均裂为2个Hregion,其中一个HRegion会发生转移,交给其他的HRegionServer来进行管理,注意:这个过程并没有发生数据的转移,而是管理权的转移
  • HRegion在HBase中是分布式存储的最小单位,由1个到多个HStore构成,HStore的数量由列族的数量决定的
  • 每一个HStore中包含1个memStore以及0个到多个StoreFile/Hfile
Zookeeper
  • Zookeeper在HBase中充当注册中心
  • 在HBase第一次启动的时候,会先在Zookeeper上注册一个节点/hbase节点
  • 当Active HMaster启动的时候,会先在Zookeeper上注册一个临时节点/hbase/master
  • 当Backup HMaster启动的时候,会在Zookeeper上的/hbase/backup-masters下注册一个临时的子节点
HMaster
  • 在HBase中,并不限制HMaster的个数,任何一个安装了HBase的节点上,就可以通过sh hbase-daemon.sh start master启动Hmaster,也因此,HMaster不存在单点故障问题

  • HMaster的状态:Active(活跃)和Backup(备份),如果存在多个HMaster,那么只能有1个Active HMaster,其他的都是Backup HMaster状态

  • 当HMaster启动的时候,会先向Zookeeper注册,谁先注册到Zookeeper上,那么谁就是Active状态,后注册的就只能是Backup状态

  • Active HMaster在收到请求之后需要和Backup HMaster之间进行备份

  • 一般启动3个Hmaster

  • Active HMaster会实时的监控/hbase/backup-masters下的子节点的个数变化

  • HMaster的作用

    • 修改元数据 - HMaster主要负责表的DDL(Data Definition Language - 数据定义语言)操作,不复杂表的DML(Data Manipulation Language - 数据操纵语言)操作,DDL会产生元数据
    • 管理HRegionServer - 主要是管理HRegion在HRegionServer之间的转移
  • HBase的元数据主要包括namespace名称、表名、列族名、属性值等

HBase结构的读写流程
  • 在BHase0.96之前:
    在这里插入图片描述

  • HBase开始:

    • 当客户端获取到.meta.文件的位置之后,会缓存.meta.文件的位置
    • 客户端还会缓存HRegion的位置
      在这里插入图片描述
HRegionServer
  • HRegionServer和DataNode一般部署在相同的节点上
  • HRegionServer用来管理HRegion,一个HRegionServer能够管理大概1000个HRegion
  • HRegionServer的组成结构:1个WAL、1个BlockCache以及0到多个HRegion
    • WAL(Write Ahead Log)——写之前日志,又称为HLog
      • 当HRegionServer接收到写请求后,会先将写请求记录到WAL中
      • 当记录完成之后,会将数据更新到对应的HStore的中memStore
      • WAL的存在能够有效地保证数据不丢失
      • 当WAL文件达到一定限度(默认是1G)时,会自动滚动生成一个心得WAL,原来的WAL会变成OLD_WAL,而OLD_WAL会被清除掉
    • BlockCache——块缓存
      • 本质上是一个读缓存,维系在内存中,默认大小是128M
      • 在缓存的时候,采用了“局部性”原理——本质上是根据一定的规律来进行猜测,提高命中率
        • 时间局部性:在HBase中,一条数据被读取过之后,那么这条数据被再次读取的概率要高于其他数据,那么此时会将这条数据放到缓存中
        • 空间局部性:在HBase中,一条数据被读取过之后,那么与这条数据相邻的数据被读取的概率要高于其他数据,那么此时会将相邻的数据也放到缓存中
        • BlockCache采用了LRU(Least Recently Used)策略 - 最近一段时间使用频率最低的数据或者最长时间不用的数据会被清理
    • HRegion
      • 由1个或多个HStore构成,HStore的数量由列族的数量来决定
      • 每一个HStore由一个memStore以及0到多个HFile/StoreFile构成
      • memStore本质上是一个写缓存,维系在内存中,默认是128M
      • 当memStore的使用达到一定条件时,会进行冲刷从而产生一个新的HFile
        • 冲刷条件:
          1. 当memStore使用满之后,会冲刷产生一个HFile
          2. 当WAL产生滚动时,当前HRegionServer上所有的memStore全部冲刷
          3. 当所有的memStore所占内存之和达到物理内存的35%时,那么会冲刷较大的几个memStore,知道所占内存之和小于3%
        • 随着运行时间的推移,上述的第三个冲刷条件相对更容易满足,同时导致产生大量的小文件存储在HDFS上
        • image-20200830142051991.png
Compaction——合并机制
  • 在HBase中,提供两种Compaction机制:
    • minor Compaction:会将相邻的几个小的HFile合并成一个较大的HFile,但是较大的HFile不参与合并,合并完成之后依然会存在多个HFile
    • major Compaction:将所有的HFile进行合并,合并成一个大的HFile
  • minor Compaction的效率会更高一点,实际开发中,默认采用的是minor Compaction,因为major Compaction更耗费资源,同时消耗的时间也会更长,所以一般情况下是吧major Compaction放在凌晨进行
  • 在合并过程中,HBase会舍弃被标记为删除状态(delete/deleteall)或者是过时(VERSION超过指定数量)的数据
流程
写流程
  • 当HRegionServer在接收到写请求的时候,会将这个写请求记录到WAL中,记录完成之后,将数据更新到memStore中
  • 数据在memStore中会进行排序:行键字典序->列族字典序->列字典序->时间戳降序
  • 当memStore达到指定条件时,会冲刷产生一个新的HFile,HFile会落地到HDFS上
  • 因为数据在memStore中是有序的,所以冲刷出来的单个HFile也是有序的,但是所有的HFile之间是局部有序的,每一个HFile都会把持自己的起始行键和结束行键
  • HFile的格式经过三个版本的编号,但是这三个版本都是基于第一个版本进行改变
  • HFile的V1版本:
    • DataBlock——记录数据
      • DataBlock是HFile中数据存储的最小单位
      • DataBlock大小默认是64KB,一个HFIle中会包含一个到多个DataBlock
      • 因为HFile中的数据是有序的,所有DataBlock之间也是有序的,每一个DataBlock都可以把持自己的起始行键和结束行键
      • 小的DataBlock有利于查询,大的DataBlock有利于遍历
      • BlockCache的空间局部性是以DataBlock为单位进行存储的,当DataBlock的某一条数据被读取时,这整个DataBlock都会被存储到Block Cache中
      • DataBlock由一个Magic和多个keyvalue组成
        • Magic:魔数,本质上是一个随机数,用于进行校验
        • keyvalue:存储数据,在HBase,数据最终是以keyvalue的形式来存储的
      • MetaBlock:记录元数据,大部分的HFile中没有这块内容,一般MetaBlock出现在.meta.文件中
      • FileInfo:记录文件信息
      • DataIndex:记录DataBlock的索引
      • MetaIndex:记录MetaBlock的索引
      • Trailer:在文件的末尾占固定的字节大小,用于记录FileInfo,DataIndex、MetaIndex的起始位置
  • HFile的V2版本中引入的BloomFilter(布隆过滤器)
    在这里插入图片描述
读流程
  • 当HRegionServer接收到读请求的时候,会先试图从BlockCache中读取数据
  • 如果从BlockCache中没有读取到数据,那么试图读取memStore
  • 如果从memStore没有读取到数据,那么试图读取HFile
  • 在读取HFile的时候,会先根据行键范围进行过滤,过滤掉不符合范围的Hfile;再利用布隆过滤器进行过滤,过滤掉的文件一定是没有指定的数据的
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜色如墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值