hbase原理

1. 读流程

简要图示
在这里插入图片描述

1-2、客户端从zookeeper中获取meta表所在的regionserver节点信息。
3-4、客户端访问meta表所在的regionserver节点,获取到region所在的regionserver信息。
5、客户端访问具体的region所在的regionserver,找到对应的region及store。
5.1-6、首先从memstore中读取数据,如果读取到了那么直接将数据返回;如果没有,则去blockcache读取数据。
5.2-6、如果blockcache中读取到数据,则直接返回数据给客户端;如果读取不到,则遍历storefile文件,查找数据。
5.3-6、如果从storefile中读取不到数据,则返回客户端为空;如果读取到数据,那么需要将数据先缓存到blockcache中(方便下一次读取),然后再将数据返回给客户端。
blockcache是内存空间,如果缓存的数据比较多,满了之后会采用LRU策略,将比较老的数据进行删除。
详细图示
在这里插入图片描述
1:client访问zookeeper,获取hbase:meta表所在的regionsever信息。
2:client访问hbase:meta表所在的regionsever,将hbase:meta表记录的元数据加载到内存,再根据要查询的rowkey,查询到查询数据所在的Region和Regionserver。
3:client对所要查询数据的Regionserver发出读请求。
4:Regionserver构建RegionScanner(查询rowkey涉及多少个Region,就构建多少个RegionScanner),对Region进行检索。
4.1:RegionScanner构建StoreScanner(Region有多少个Store,就构建多少个StoreScanner,Store的数量取决于table的columnfamily的数量),对列族进行检索。
4.1.1:StoreScanner构建一个MemStoreScanner和一个或多个StoreFileScanner(数量取决于StoreFile的数量)。
4.1.2:Bloom Filter过滤掉查询rowkey一定不在的MemStoreScanner和StoreFileScanner。
4.1.3:筛选后的Scanner准备读取数据,将对应的StoreFile定位到满足的RowKey的
起始位置(没太懂?)。
4.1.4:将所有的StoreFileScanner和MemStoreScanner合并构建最小堆:KeyValueHeap:PriorityQueue,排序的规则按照KeyValue从小到大排序(没太懂?)。
4.2:多个StoreScanner合并构建最小堆(已排序的完全二叉树)StoreHeap:PriorityQueue(Java的map集合)(没太懂?)。(Hyperbase一般是一个列族)
4.3:从KeyValueHeap:PriorityQueue中经过一系列筛选后一行行的得到需要查询的KeyValue。
参考资料:
https://blog.csdn.net/weixin_46074059/article/details/122055857
https://zhuanlan.zhihu.com/p/464641924?utm_id=0

2. 写流程在这里插入图片描述

1-2:client从zookeeper获取hbase:meta表所在RegionServer。
3-4:client从hbase:meta表所在RegionServer获取数据所在RegionServer。
5:client和数据所在RegionServer建立连接,发送写入请求。
6:然后将DML要做的操作写入到日志wal-log
7-8:然后将数据的修改更新到memstore中,本次操作结束

一个region由多个store组成,一个store对应一个CF(列族),store包括位于内存中的memstore和位于磁盘的storefile(1 memstore + n storefile)。
写操作先写入memstore,当memstore数据写到阈值之后,创建一个新的memstore。
旧的memstore写成一个独立的storefile。regionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile,存放到hdfs上(hfile)。
当storefile文件的数量增长到一定阈值后,系统会进行合并(minor compaction、majorcompaction)
在合并过程中会进行版本合并和删除工作,形成更大的storefile。
当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。
参考资料:
https://blog.csdn.net/weixin_46074059/article/details/122055857

  • 31
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值