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数据库中有两张表
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210227212242218.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2ODkzNDk3,size_16,color_FFFFFF,t_70)
- hbase:meta:元数据表
- 内容
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210227212252448.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2ODkzNDk3,size_16,color_FFFFFF,t_70)
- 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 => ''
}
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
- 磁盘:HDFS上的HFILE
牺牲了一定的写的性能来保证数据的安全
然后写MemStore
Flush
:将内存中的数据写入HDFSCompact
:将每个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、角色功能
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210227212832607.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2ODkzNDk3,size_16,color_FFFFFF,t_70)
HMaster
管理所有的RegionServer
分配Hbase中所有的region
- 创建一张表,新的region的分配
- 负责RegionServer的负载均衡
- 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中数据的持久化