Master的作用
一句话:Master是管理者,不会做具体的任务负载,它的主要作用在于管理整个集群的小弟干好活即可
作用:
- 监控RegionServer,处理RegionServer的故障转移
RegionServer并不是100%稳定的,如果某个RegionServer出现问题。
Master会将出问题的RegionServer的工作(数据、Region)转移到其它正常的RegionServer身上
# 通俗理解
一个小弟出问题了,领导将这个小弟的活,分配给其它小弟了。 - 处理元数据的变更,比如Region(数据块)的分配和移除。
Master和 Zookeeper通讯,去对整个HBase的元数据进行增删改查的操作
# HBase的元数据是存在Zookeeper中的,路径是: /hbase - 数据的负载均衡
Master会在空闲的时候,将任务的负载均衡的分配给各个RegionServer
# 其实就是做Region(数据块)的平衡分配
只有Master有权限去管理哪个RegionServer应该处理的数据块(Region) - 和Zookeeper通讯,去暴露自身的存在
维护和临时节点的关系
如果Master在某个时间 T 内,没有和ZK通讯
Zk会认为这个Master宕机,解除它和临时节点的关系
# T:超时时间,可以配置(默认15秒)
RegionServer的作用
RegionServer的作用就是:干活的
细节:
- 托管分配给它的Region(数据块),去负责对应的数据工作(存、查、改、删)
- 刷新内存缓存到HDFS形成HFile
- 维护HLog(WALs)
- 执行数据的压缩、region的分裂、HFile的合并等
Region
如图,HBase的表的数据,是分散在各个
region内。
类比HDFS去理解:
- HDFS的文件的数据,是分散在各个Block中
- HBase的表的数据,是分散在各个Region内
- HDFS的block由Datanode管理
- HBase的Region有RegionServer管理
再来看RegionServer这个名字,就是Region的Server,Region服务器
如图,在HBase的16010页面中,可以看到表是有具体的region在线。
到这里为止,我们所了解到的HBase的架构是:
- Master带RegionServer
- RegionServer内包含具体的数据块(Region)
Rowkey和Region
? 我们的某一条数据,如何确定写入到哪一个Region中呢?
- 轮训写,不指定具体Region,基于数据平衡为基准写入到某一个region内
- 逮着一个可劲写,写到它不能存了为止,再换region接着写
- 每一个region都有自己的数据范围,数据根据rowkey来确定写入到哪个region内
如图(图片高清的保存在Day03文件夹中),我们上诉的三种设计最终第三种是最合适的。
region划分范围的意义
- HBase的表的region,如果划分了范围
- 在写入的时候,可以基于范围来确定写入到哪一个Region内
可以相对均衡,是否均衡,取决于Region的范围(建表的时候的设计)是否可以让数据分散的比较彻底。
设计的好,数据非常分散,设计的不好, 数据全挤到一堆。 在查询的时候
,比如查询一条rowkey的数据,可以基于region的范围,快速锁定一个region
- 当你锁定一个Region的时候,剩余的Region全部排除
比如,表有10TB数据,有10W个region
当你单条查询的时候,可以锁定一个region,那么就排除了99999个region
也就是排除了99.99999999%的数据
所以,这就是HBase随机查询能力非常恐怖的原因
不管你数据多大,10TB 、100TB 1000PB ,随意,只要region范围做的好
上来排除99.9999999%
在目前所有的大数据数据库中, 没有任何一个数据库,在数据量上升到TB级别后
能够在单条查询上性能超过HBase
小总结
截止到目前为止:
- HBase是Master带RegionServer
- RegionServer内管理一堆Region
- 每一个Region都有自己的范围(Rowkey的范围)(范围在ZK元数据中存储)
Region的范围是包头不包尾
比如范围是100~200
100>= Rowkey < 200(到200结束,不包含200本身)
Region范围的确定原则
有2个region:
- region1:范围是100~300
- region2的范围是:300~无穷大
问题:20000应该去region1还是region2
答案:去region1
原则:HBase的Rowkey,完全按照字符串(ASCII)码来进行比较大小
对于字符串,满足:
100 < 20000 < 300
字符串比较:
213 和33比较:33大,从第一位开始 2就输给3了
补充:字符串大小比较
在程序中(Java、Python、Scala、C、C++、GO)等等,字符串比较都是按照ASCII码来进行比较大小
字符串的比较是一位一位的比较,从前到后,只要有一位是大的,比较就结束
a 和 B谁大?
a的ASCII是97
B的ASCII是66
所以 a
大于B
abc和 abe谁大?
a比较a 97比较97相等
b比较b 98比较98相等
c比较e 99比较101,e大
所以,abe大于abc
11和 2比较
第一位进行比较,1比较2,ASCII中49比较50,50比较大,2大于1
第一位2大于1,后面无需比较
最终:2大于11