Hbase从0到1:入门与架构详解
Hbase架构
- hbase组件的作用
- hbase region 定位的过程
- hbase的容错性
hbase架构图
hbase是一个数据库,最主要的作用是存储海量结构化的数据,能够实现数据的实时查询。理解hbase的架构图对学习hbase很有帮助。
首先,hbase是主从架构,有一个hmaster和多个hregionserver,需要一个写作服务叫zookeeper;底层hbase的数据是存在文件当中的,这些文件是存储在hdfs上的,所以有很多的datanode;想要操作hbase中的数据,可以通过client客户端进行,client客户端作用是存数据和取数据,需要与hbase集群进行一些交互,先与zookeeper进行交互,再与hregionserver进行交互,这与hdfs的架构很相似,hdfs中client要些数据,先与namenode交互,再向datanode中写数据。一般,对于表的操作client客户端不与hmaster进行交互,只有管理的时候才与hmaster交互,两者都分别与zookeeper交互。
客户端client的作用
- client是整个集群的访问入口,对表的删除添加,也可以对集群进行一系列的管理操作
- client底层是通过RPC机制与hmaster和zookeeper通信
- client与hmaster通信进行管理类操作
- client与hregionserver通信进行读写操作
- client还包含访问hbase的接口,并维护cache缓存机制加快对hbase的访问,同时也会与hregion交互,client相当于程序的入口
程序协调服务zookeeper的作用
- 保证任何时候,集群中只有一个hmaster,能够解决hbase的单节点故障,也即HA,当一个hmaster挂掉以后,zookeeper会自动把另一个hmaster激活,增加集群的可靠性
- 存储所有region的寻址入口,客户端client往region中写数据时,通过与zookeeper交互得知写的地址
- 实时监控region server的上线和下线信息,并通知给master;zookeeper与region server进行交互,region server告诉zookeeper我还活着,我还在线,如果region server宕机了,可以理解为下线,那么zookeeper通知master告诉他哪个region server挂掉了,region server管理了很多region信息,hbase会立马把这些region信息分配给其他的region server,如果添加了一个region server,那么hmaster会进行一系列的负载均衡,分配一些region给新上线的region server,减小集群的压力;
- 存储hbase的schema和table元数据
通过查看查看zookeeper
首先进入hbase安装目录,可以查看到有一个zkcli的命令
# bin/hbase
返回hbase的所有命令
zkcli run the zookeeper shell
进入zookeeper shell里面去查看zookeeper中到底存了哪些数据信息
# bin/base zkcli
[IP 0]help #可以查看这个shell的命令帮助
[IP 1]ls / #查看根目录有哪些文件
# 有两个文件夹,[hbase,zookeeper]
[IP 2]ls /hbase #查看hbase下有什么东西
返回很多文件夹,[meta-region-server,backup-masters,table,draining,region-in-transition,running,table-lock,master,namespace,hbaseid,...]
[IP 3]ls /hbase/table
[hbase:meta,t1,hbase:namespace],里面有三条数据,meta表,t1和namespace表
此时,可以另外开一个终端,查看hbase中有哪些表
# 先进入hbase的安装目录
# bin/hbase shell #进入hbase的shell中
>list #查看当前namespace命名空间中的表
返回,有一张t1表,所以zookeeper中存了t1
>help #可以查看命令找到list_namespace_tables命令的用法
>list_namespace_tables 'hbase' #查看另一个命名空间中的表,要指定命名空间hbase
返回,有两张表,meta和namespace
所以一共三张表和zookeeper中的一一对应
再去zookeeper shell中看其他文件夹,通过这些文件夹的命名可以大致猜到里面存了啥,[meta-region-server,backup-masters,table,draining,region-in-transition,running,table-lock,master,namespace,hbaseid,…,rs]
[IP 8]ls /hbase
[IP 9]get /hbase/master #查看master中存了啥
有些乱码,也有些能看到的信息
比如master主机名
[IP 10]get /hbase/rs #查看region server文件夹
主节点hmaster的作用
- 管理用户对table的增删改查操作,注意是对表table的管理,而不是对表中数据的管理,删除表,改变表的结构,而不是操作里面的数据
- 管理hregionserver的负载均衡,调整region布局
- 在region split后,负责新region的分配,即表的数据过大,会对region进行分割操作为了负载均衡也会进行新的region分配
- 在hregionserver停机后,负责失效hregionserver上的迁移
- hmaster失效仅会导致所有元数据无法修改,表的数据读写还可以正常进行,因为client进行读写操作过程,不与hmaster交互;只有进行表的管理操作才会与hmaster交互
hregionserver节点的作用
- 维护hregion并往hdfs中写数据
- 当表的大小超过设置值的时候,split region
- 在hregionserver停机后,负责失效hregionserver上的region迁移
hbase与zookeeper的关系
- hbase的元数据存储在zookeeper中
- 默认情况下,hbase管理zookeeper实例,比如,启动或者停止zookeeper
- zookeeper解决hbase的单节点故障问题,选举机制
- hmaster与hregionserver启动时会向zookeeper注册
zookeeper会与hbase所有组件进行交互,要搞清楚交互的目的都是什么。
hbase region 定位
- 首先,读取zookeeper中的文件,找到root表的位置
- 获取root表的信息,root表中存储了meta的信息,root表包含meta表所在的region列表,该表只会有一个region
- 根据root表来访问meta表,meta表包含所有用户空间region列表,以及regionserver服务器地址
- 通过meta表来进行表的操作
- client第一次操作以后,会将root表和meta表缓存到本地,不需要再访问zookeeper
注意,root表在老版本0.96以前,在zookeeper中存储了root表信息,在0.96以后,zookeeper没有存储root表信息,直接存储meta表的信息,第二步就省略了,没有root表了,直接从meta表的信息获得表的信息
hbase的容错性
- master容错:zookeeper重新选择一个新的master
- 无master过程中,数据读取仍正常
- 无master过程中,region的切分、负载均衡无法进行
- regionserver容错:定时向zookeeper会报心跳,**如果一段时间内未出现心跳,master将该regionser上的region重新分配到其他regionserver上,失效服务器上“预写”日志由主服务器进行分割并派送给新的regionserver
- zookeeper容错:
- zookeeper可以配置多个,推荐奇数个
- zookeeper高可靠的服务,不存在单节点故障
hbase的数据存储
回顾架构图,在hbase中,如果插入一条数据,最主要的存储就是hlog文件和hfile文件,storefile相当于把hfile做了一个轻量级的封装。在hbase中如果插入一条数据,会写两部分文件,第一部分就是hlog,存储日志文件,还会存一个region文件,首先向内存中也即menstore写数据,当他达到一定大小的时候就会写为storefile文件,storefile中最主要的就是hfile文件。
hbase中的所有数据文件都存储在hadoop HDFS文件系统上,格式主要有两种:
- hfile:hbase中keyvalue数据的存储格式,hfile是hadoop的二进制格式文件,实际上storefile就是对hfile做了轻量级包装,即storefile底层就是hfile。
- hlog file:hbase中WAL(write ahead log)的存储格式,物理上市hadoop的sequence file带项目符号的内容(写数据的时候首先会向内存中写数据,不会直接写入磁盘,如果这个时候停电了,内存中的数据就会消失,hbase就会通过WAL来恢复内存中的数据写入到HDFS中;sequence file这种文件在机器学习的迭代计算中非常的有优势)
hregionserver:hbase的存储
一个客户端往hbase中写数据的过程,从左往右看,有一个客户端client,有对数据的操作put、delete、in