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

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器