2018-12-13
2018-12-20
本篇文章旨在针对初学者以我本人现阶段所掌握的知识就HBase的架构图中各模块作一个概念科普。不对文章内容的“绝对、完全正确性”负责。
1、开胃小菜
关于HBase的架构图,直接抓取网络上图片来分析就好了。它大概长成下面的样子:

图1 HBase架构图
从上图中可以很直观地看到整个HBase都是基于HDFS之上的。这个HDFS呢,它的全称是Hadoop distributed file system,Hadoop分布式文件系统。关于在《HBase入门指南》中提到的HBase的概念:HBase是一个用于处理大数据的分布式数据库软件。它的分布式特性在这张架构图中已经很直观地体现出来了,并且它的分布式能力是由Hadoop来提供并保证的。(其实哦,HBase的分布式能力并不一定非得基于HDFS的,理论上你任意一个分布式软件都能用来给HBase“基于”用,只不过由于HDFS太流行了,加上大多数的人其实都挺忙的,不喜欢瞎折腾,就拿HDFS来凑合过呗还能换咋的。。。)
上面图1其实挺零乱挺复杂的,对于这么复杂的一张图,小白同学表示他刚一进来,什么都不知道,就看到常威在打来福。。。哦哦,不是,小白同学说本来我学HBase的干劲挺足的,但刚开始就看到这张图,着实很打击小白同学的自信心啊。既然如此,那我们就来稍微给它简化一下。图1中的各种元素其实都是有它们各自的派系的,稍微划分一下派系后后它大概长成下图2的样子:

图2 HBase架构派系划分
上图2给这个架构图加了几个框框,把它们分成了四个派系A, B, C, D。这个框框虽然很不明显,但是眼睛睁大点还是能看清的,就当锻炼锻炼视力了。
A派系呢就像是王自如的Zealer手机测评团队一样,是独立客观以及第三方的。它就是上帝,A呢就是B, C, D存在的意义。
B派系是Zookeeper,它是用来保证HBase集群的一致性的。
C派系就是HBase集群了。有些同学可能发现了,C派系HBase中好像霸占了架构图中Zookeeper的一部分啊,这是画错了吗?非也,其实之所以这样划分,是因为现在的HBase软件体系中已经集成了有Zookeeper模块了,在默认的情况下,你不需要下载一个额外的Zookeeper软件,也能够正常运行HBase系统,并且拥有一个Zookeeper相关的进程。因此C派系中也占有了一丢丢Zookeeper的内容。但是其实是生产环境中,很少会用HBase自带的Zookeeper的。
D派系呢,就是任劳任怨的HDFS了。
上面简单的了解了一下HBase架构图中的各大派系,相信到这里,各位小白同学能够稍微对这张HBase的架构图不那么陌生了。什么?上面的图还是太恶心?好吧,那我们再进一步的处理一下这张图片,这次我直接放大招,把HBase架构图抽象一下,排除一切外在干扰,就不信你还看不懂它们之间的关系。看下图:

图3 HBase架构图抽象版
2、架构图详解
继续继续,下面要详细讲讲图1 HBase架构中各模块的含义了,这部分的内容就相当让人脑阔疼咯。我们以上帝视角,从客户端Client自上往下讲起。
2.1、Client
首先还是要来了解一下概念。Client到底是什么东东?
从广义的角度来说, Client其实就是你自己,Client是人!上面我们才刚刚讲过,B, C, D,也就是Hadoop, HBase以及Zookeeper存在的意义就是要服务于A,也就是Client,也就是人。假如都没有人去操作这个HBase系统了,那你HBase系统的功能再强大又有什么意义呢?有的同学可能要抬杠了,说人家企业里的HBase系统,都是无人植守,按照程序自动去运行,一样跑的很嗨啊,哪像你说的那样,没有人去操作HBase系统就没有意义了。好的,这位同学请坐下。这些跑的很嗨的程序还不是由人去写的。。程序其实就是人类的意志的产物而已,程序怎么跑还不是由人说了算。所以,归根结底。无论是你坐在电脑前对着hbase shell敲命令行,还是自己写代码去操纵HBase,亦或是在地球的另一端通过各种软件来向HBase下达指令,你就是Client。
那从狭义的角度来说,我们下到代码层面来说,Client是HBase开放出来给程序员们使用的各种API接口。Client也像是一个承上启下的角色,对上要接收来自人的意志,对下要将人的意志转化成一条条HBase程序并逐一执行。
那说了这么多,Client在HBase系统中有什么用呢?其实它只有一个作用。
- 它是整个HBase系统的入口。
在代码层面来讲,它就是各种API接口。有了这些接口,我们就可以实现对数据的CURD,甚至是发送一些管理级的命令。
2.2、Zookeeper
Zookeeper也是Apache软件基金会中的一个顶级项目。它是给分布式系统提供协同服务的软件。协同服务是什么鬼?也许会有不少人对这个词很陌生。下面我们就来解释一下什么是协同服务。
Zookeeper从字面上翻译过来就是:动物园管理员。那为什么会起这么个名字呢?原来啊Apache软件基金会下面关于分布式的软件有很多,它们基本都会联系上一种动物,或名字或LOGO。如Hadoop(小象象),Pig(油腻猪),Hive(怪蜜蜂),HBase(酷海豚)等等等等。那么,在分布式应用当中,同步无疑是其最重要的特性,常有的同步包括:
1、配置同步;
2、时间同步;
3、相互感知(集群中各主机的上线下线消息及各种状态)。
上面提到的这几个“同步”就是“协同”的白话语言。
而为了 blah,blah,blah... 就需要一个Zookeeper来专门负责这种“同步服务”。
除了“同步服务”以外,Zookeeper还保存着HBase系统中的配置信息。什么配置信息呢?
1、master与slaver机器的信息
地址啊端口啊这些。
HMaster可以通过查询Zookeeper来了解当前哪些slaver还在正常工作当中。
假如当前master宕机了,Zookeeper还可以通过保存着的backup master的信息来重新推选出一个新的master,起到保证HBase系统高可用性的作用。
2、保存 hbase:meta 表所在的位置
hbase:meta 表在HBase中是非常重要的一张表,它是由HBase系统创建并维护的。这里暂且记住它非常重要就好了。
3、保存HBase系统中所有的表信息
假如客户端发起一个CRUD请求,首先要知道这张表存不存在吧,又保存在哪吧。通过Zookeeper就可以实现非常快速的响应,因为整个Zookeeper都是驻留在内存中的。
4、其它信息
还有各种杂七杂八但很重要的信息,都由Zookeeper来保存。
因此,Zookeeper在HBase系统中就是用于给运行在不同机器上的HBase程序提供协同服务的。
2.3、HBase
HBase模块个人理解它就像是一个装饰器。把原本HDFS(Hadoop distributed file system)的功能用“数据库的语言”来复述一遍。它在集群中共有两个进程:1. HMaster; 2. HRegionServer。整个架构图中HBase部分这么繁杂,概括出来其实也就两个东东而已。。。
2.3.1、HMaster
首先在这里先简单了解一下“HBase集群”的概念。HBase集群中有若干台计算机,其中有一台是“主机(Master)”,其余的都是“从机(Slaver)”。一般在生产系统中,还会有一台“备用主机(backup master)”。
这个HMaster进程,就是运行在“主机”上的。准确的说,应该是HMaster在哪一台计算机上运行,哪一台计算机就是“主机”。
HMaster既然作为一个“上位者”,那它肯定是轻易不会去干活的,不然领导的尊严何在?类比一下企业当中的master,他们的日常工作就对外搞搞外交,对内签签名,再视察一下各部门的工作情况,还会根据企业现阶段的发展状况作一下资源调度等等。那我们的HBase当中也基本一样,唯一的不同就是HMaster不用去外面搞外交,它只处理自己HBase系统内部的事务。
HMaster的作用主要有以下几个:
1、分发Region
首先,Region是什么?在HBase中,如果一张表所包含的内容超过设定的上限,即一张表很大的话,会将这张表水平地分成两半。比如,某张表共有1000行20列数据,HBase嫌这张表太大了,影响我检索效率。将它分成两部分,第一部分内容为第1 ~ 499行。第二部分内容为第500 ~ 1000行。那这切分出来的部分,就被称为Region。在这里,就是有两个Region。
其次,HBase系统会将这些Region尽量均衡地分发给这些“从机(Slaver)”。让集群中每台从机都干同样多同样重的活。这可以说是HMaster的首要任务。
2、监控HRegionServer
* 负责HRegionServer的故障转移
HRegionServer会定期地向HMaster发送心跳报告。当HMaster收不到HRegionServer的消息时,就认为该HRegionServer已经失去作用了。这个时候HMaster就得下达指令,将原本在HRegionServer上的数据迁移到其它正常工作的机器上去。到这里你肯定会有个疑问:根据前面讲到的判断HRegionServer故障的方式来看,这个时候HMaster已经不能够和该HRegionServer通信了,那你是怎么下达指令,让原本在这台HRegionServer上的数据进行迁移的呢?这个问题,这里暂且不讲,我们只要知道,它能够做到就是了。刚开始接触,不要一下子灌输太多概念,很容易乱的。HDFS的好处在这就体现出来了。
* 负责HRegionServer的负载均衡
当HBase系统中某台机器上的某个Region的大小超过上限时,它会被RegionServer切割成两半,切割后多出来的一个Region又会由HMaster根据集群的情况来做负载均衡,其目的就是尽可能地让每台从机干同样多同样重的活。这里还有一个:RegionServer中由“小合并”“大合并”生成的Region也会需要HMaster来做负载均衡。
那这里又有一个新的疑问:HMaster是如何得知HRegionServer是忙还是闲的呢? HRegionServer会定期向HMaster发送一份自己的运行报告,类似于企业当中各部门领导定期向老板递交工作报告一样。然后HMaster就汇总这些运行报告并分析从而作出决策并最终下达指令。
3、管理元数据
在HBase中有一个由系统创建的表: hbase:meta 。这里我们姑且称它为“元数据表”。那这个“元数据表”是干什么用的呢?
原来啊,在HBase中,所有的数据都是以“表”的形式来管理的。而当你的表增长到一定程度的时候,它会影响到你CRUD的效率。举个粟子,假设你的某张表A里有1亿条数据,现在你要查询其中一条数据。又假设你又有一张表B里面有1000条数据,同样你要查询其中一条数据,你说A和B哪个检索速度快?因此,当你的表增长到一定程度时,HMaster就会把这个表切割成几块,假设有一张表共有1000行,HMaster把它分割成两块T1和T2,T1的数据范围从第0行到第499行。T2的数据范围从第500行到第999行。不同的块根据负载均衡存储在不同的HRegionServer中。然后你要查询某一条数据的话,就首先确定你这条数据是坐落在哪一个“块”当中的,确定好后直接去这个“块”当中查询,这样检索速度就快很多了。那么,这些不同的“块”被分别存储到哪个HRegionServer中呢?这些不同的“块”又是包含了哪些范围的数据呢?这些信息就是记载在这个 hbase:meta 也就是“元数据”表中的了。一句大白话总结:元数据表是负责记载你想要查询的数据是在哪台HRegionServer上保存着的信息的。
那话说回来,HMaster对于“元数据表”的管理方式,就是负责更新这个表中的数据内容的咯,换句话说就是如果HMaster挂掉了,那这个hbase:meta的数据就停止更新了。
2.3.2、HRegionServer
HRegionServer就复杂咯。。。
我们还是再来看看HRegionServer的架构图吧。

图4 HRegionServer架构图
首先呢要明确一个概念:一个HRegionServer就代表着一台计算机。我们这里所讲的一切都是基于这个大前提来讲的。事实上确实也是,一台计算机上就运行一个HRegionServer进程,我不确定会不会有运行两个HRegionServer进程的计算机,但是我觉得既然你要玩分布式,
