Hbase--读写流程

1、写

put ‘ns:tbname’,'rowkey','cf:column','value'

step1:用户操作客户端提交写入请求,服务端验证请求是否合法,ns或者表是否存在,接受请求

问题1:如何通过指定的表就能找到这张表对应的所有Region信息呢?

问题2:需要根据每个region的范围来判断rowkey属于哪个region,如何知道每个region的范围?

问题3:如何知道这个region对应的regionserver是哪台机器呢?

  • 解答:
  • 肯定有元数据:元数据实现了表与region的关系映射,并且记录了每个region的信息
    • region的范围
    • region所在regionserver的地址
  • 通过检索元数据来得到表的region的信息

问题4:元数据在哪,元数据的内容?

  • 系统自带的hbase数据库中有两张表
    在这里插入图片描述
  • hbase:meta:元数据表
  • 内容
    在这里插入图片描述
  • Rowkey:Hbase中每个region的名称
hanjiaxiaozhi01:t1,10,1593328469691.cc54add317aec284b67504896c53823d.
  • 表名,开始范围,region的创建时间,region的唯一id编号
  • region的信息
    • NAME:就是region的名称
    • STARTKEY,ENDKEY
    • 这个region的范围
column=info:regioninfo, 
timestamp=1593478743796, 
value={
   ENCODED => 5ed890.5edfc4a719e7d7d8367fc4a719e7d7d8367c47f88bc655e2, 
   NAME => 'student:stu,,1593246405890.5edc47f88bc655e2.     fc4a719e7d7d8367c47f88bc655e2.', 
   STARTKEY => '', 
   ENDKEY => ''
 }
  • region所在的regionserver
column=info:server, 
timestamp=1593478743796, 
value=node-02:60020 890.5edfc4a719e7d7d8367
  • 总结:元数据表中就存储了Hbase中每个region对应的范围和所在regionserver的地址
    • 如何给定表名,就能得到这张表的所有region信息呢?
    • 通过rowkey的前缀匹配,只要给定表名,就能根据元数据表中进行rowkey前缀匹配查询,得到这个表的所有region的信息
    • PrefixFilter:rowkey的前缀匹配
  • hbase:namespace
    • 用于记录Hbase中所有的namespace的信息

问题5:meta表是hbase中的一张表,我们要插入数据到别的表中,就要先读meta表,得到别的表的元数据,我们如何知道meta表的region在哪台机器?

  • meta表是没有记录自己的region的信息,如果记录,会出现死循环
  • 肯定有一个独立的地方存储了meta表的region的信息
  • 为什么我们写代码的时候,要请求Zookeeper?
    • Zookeeper中存储了 meta表的地址
    • 所有Hbase的客户端,都要先请求Zookeeper获取Meta的元数据,才能实现对其他表的读写

step2:找到写入的这条数据所对应的region,请求regionserver实现写入

step3:regionserver根据region的名称来操作写入region,根据列族来判断写入哪个store

step4:将这一列的数据存储在MemStore中

  • 先写WAL/HLog:Write ahead log
    • 预写日志:用于记录所有的操作
      • 类似于Hadoop中的edits文件,MySQL中的binlog
    • 先将这个操作记录在一个文件中,然后再写入数据,是否降低了写的性能?
      • 肯定的,降低了写的性能
    • 原因:保证数据安全
      • 数据在Hbase中存储
        • 内存:MemStore
          • 通过WAL进行恢复
          • 如果避免WAL文件故障呢?
            • 将WAL存储在HDFS上
        • 磁盘:HDFS上的HFILE
          • HDFS文件有副本
    • 牺牲了一定的写的性能来保证数据的安全
  • 然后写MemStore
  • Flush:将内存中的数据写入HDFS
  • Compact:将每个Storefile文件进行合并,构建整体有序,加快读取
  • Split:将一个region分裂为两个region

2、读

get
scan
  • step1:请求zookeeper读取元数据所在的位置,读取元数据表
  • step2:根据元数据表中的信息对数据表的region进行判断,要读取哪个region的数据
    • 如果是get:通过rowkey的分区规则来判断读取哪个region
    • 如果是scan:读取所有region
  • step3:找到region对应的regionserver,提交读请求
  • step4:根据列族来读取region中的store
  • step5
    • 先读memstore
    • 如果开启了 缓存:读取memCache
    • 再读HDFS
    • 如果HDFS也没有,没有这个数据

3、角色功能

在这里插入图片描述

HMaster

  • 管理所有的RegionServer
  • 分配Hbase中所有的region
    • 创建一张表,新的region的分配
    • 负责RegionServer的负载均衡
      • Region的移动
    • Split:分裂出来的新的region,将一个老的region分裂为两个新的region
      • RegionServer负责分割
      • Master负责分配
  • 所有zookeeper中元数据的修改
    • 元数据
      • Zookeeper:hbase的元数据
      • meta表:所有表的元数据
    • Zookeeper
    • DDL操作
  • 通过zookeeper监听所有RegionServer,如果regionserver故障
    • Master通过元数据来恢复这个Regionserver中的所有region

HRegionserver

  • 负责接收并处理所有客户端的数据的读写请求
  • 负责Hbase中所有数据的存储,管理所有region
  • 负责维护WAL
  • 维护读缓存:blockCache
  • 写缓存:memstore

Zookeeper

  • 负责实现HA
  • 负责存储Hbase中几乎所有的元数据,除了表的元数据
  • 系统容错
    • 所有regionserver都会在zk中注册,创建一个节点
    • master会监听regionserver的节点
    • 如果regionserver故障,master就会发现
    • 就会启动恢复过程
  • 存储区meta表的地址
  • 存储Flush/Split的过程状态

HDFS

  • 负责接收RegionServer的读写请求
  • 实现Hbase中数据的持久化
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值