HBase 概况
在大数据的各种解决方案中,我们首先想到的可能就是 Spark 和 Hadoop 了。事实上, Spark 和 Hadoop 中的 MapReduce 只是提供了计算框架。它们处理的数据往往是存储在 HDFS 这种分布式文件系统中的,我们可以认为 HDFS 是为计算框架服务的存储层。但是,HDFS 却不支持大数据的实时访问功能,为此构建于 HDFS 之后的 HBase 对此进行了扩展。 HBase 是一种类似于数据库的存储层,也就是说 HBase 适用于结构化的存储,它是由当年 Google 公布的 BigTable 的论文衍生出来的。总之,HBase 是一个运行于 HDFS 文件系统之上支持实时随机读写的一个高可用分布式数据库。
HBase 架构
HBase 是 Hadoop 生态系统的一个核心组件,而在 HBase 内部有三个重要的组件。
Zookeeper
HMaster Server
Region Servers
HBase 的整体架构如下图所示:
我们下面分别介绍这 3 个组件:
1. Region Servers
首先,Region Servers 是用来提供数据读写服务的,即 Client 可以直接连接到 Region Servers 以进行数据的访问。对于一个 Region Server 而言,其包括了多个 Region,一个Region Server 大约可以管理1000 个Region,而 Region 是 HBase 进行数据管理的基本单位,它其中存储了从 start key 到 end key 之间的所有数据,然后,这些 Region 则被分配给 Region Servers 进行管理。值得注意的是,Region 是一个逻辑上的概念;物理上,由 Region Servers 管理的数据,则是存储于 Hadoop DataNode (这是 HDFS 用于存储数据的节点)中的。总之, Region Servers 和 DataNode 一起合作来提供对数据的访问服务。
2. HMaster Server
HMaster Server 则主要执行一些管理工作。比如,HMaster Server 可以用于协调多个Region Server,监测各个 Region Server 之间的状态,并平衡 Region Server 之间的负载。此外,对数据表的创建和删除也是 HMaster Server 的任务。在 Zookeeper 的帮助下,HBase 允许多个 Master 节点共存,但是只能有一个 Master 节点处于 Active 的状态,即只有一个 Master 是提供服务的, 其他的 Master 节点处于待命的状态。当正在工作的 Master 节点宕机时,其他的 Master 则会接管 HBase 的集群。
3. Zookeeper
对于 HBase 而言,Zookeeper 的作用是至关重要的。首先 Zookeeper 是作为 HBase Master 的 HA 解决方案。也就是说,是 Zookeeper 保证了至少有一个 HBase Master 处于运行状态。并且 Zookeeper 负责 Region Server 的注册以及对 Master 和 Region Server 的状态进行监控和通知。事实上,Zookeeper 已经成为了分布式大数据框架中容错性的标准框架。
HBase 的读写流程
在 HBase 的读写操作中,涉及到两个重要的组件: HFile 和 META 表。我们可以认为 HFile 是存储于 HDFS 中的文件,而 HBase 对数据的持久化,其实就是将数据写入到 HFile 中。META 表则存储了 HRegion Server 的地址信息,HBase Client 正是通过这个表,才知道需要去哪个 HRegion Server 上进行数据的读取的。
参考上图,我们将数据读写流程整理如下:
1. HBase 写流程
当一个写请求到达 HBase 的时候,请求将会首先被发送给 Zookeeper, Zookeeper 会告诉 Client 去连接哪个 HRegion Server。
a ) Client 连接到 HRegion Server, 首先会写 HLog, HLog 是通过 Write Ahead Log 来实现 的,WAL是事务机制中常见的一致性的实现方式,可以用于保证数据的可靠性;
b ) HRegion Server 将数据写入到 MemStore 中,这是一个内存操作;
c ) 最终 MemStore 中的数据会被写入到持久化的 HFile 中;
d ) 一般, 等数据写入到 MemStore 后,就认为写入成功,于是会给 Client 发送 ACK 信息以进行确认。
2. HBase 读流程
当一个请求到达 HBase 的时候,同样请求将会首先被发送给 Zookeeper, Zookeeper 会告诉 Client 去连接哪个 HRegion Server。
a ) Client 连接到 HRegion Server,此时流程将会首先进入到 BlockCache,如果此前访问过同一 条记录,则应该可以在 BlockCache 中直接得到访问的结果。如果没有找到相应的记录,则会进行下一步;
b ) 尝试从 MemStore 中查找记录 ;
c ) 如果上面均不能获取到数据,则最终将会在 HFile 中找到数据 ;
d ) 将查询到的数据缓存一份在 BlockCache 中,以应对下一次的读取 ;
e ) 将查询到的数据返回给 Client 。
HBase 的可靠性保证
Active HMaster 和 RegionServer 都会和 Zookeeper 进行周期性的心跳,Zookeeper 通过心跳来判断 Active HMaster 和 Region Server 的存活。
当 Region Server 宕机的时候,Zookeeper 会通知 Active HMaster 进行 Region 的重分配工 作。
Active HMaster 宕机的时候,Inactive HMaster 则会收到 Zookeeper 的通知,进而变成 active 的状态。
Zookeeper 集群之间,则是自治的。
HMaster 会将 HLog 分发到所有的 Region Server 上,以应对 Region Server 上 MemStore 层数据的丢失,即丢失的数据,可以通过重放 HLog 来进行恢复。
HDFS 中的数据读写
HDFS 是 Hadoop Distributed File System 的缩写,在上面对 HBase 的读写数据进行介绍时,只是简单的提到将数据写入到了 HDFS 中,但是并没有说明 HDFS 内部的读写细节,因此,我们将在下文中进行简单介绍 。在 HDFS 内部,又可分为三个模块: NameNode 、 SecondaryNameNode 和 DataNode 。 DataNode 是真正的在每个存储节点上管理数据的模块,NameNode 是对全局数据的名字信息做管理的模块,SecondaryNameNode 是它的从节点以防挂掉。
在 HDFS 中读写数据, Client 都需要首先与 NameNode 节点进行交互。NameNode 中存储了一些 Meta 信息,可以提供了 DataNode 的地址,然后 Client 将直接与 DataNode 进行交互进而完成数据的访问。
1. 写数据流程
HDFS 写数据可以概括为如下几个步骤:
a ) HDFS Client 与 NameNode 进行交互,NameNode 挑选一些合适的 DataNode 进行副本数据的存储,并将 DataNode 的地址返回给客户端;
b ) HDFS Client 建立到 DataNode 的连接;
c ) HDFS Client 请求 DataNode 完成数据的写入动作;
d ) 这些 DataNode 将会组成一个 pipeline,此处假定存储副本为 3。Client 将会把数据包发给第一个 DataNode,第一个 DataNode 首先会存储这些数据包, 然后再将这些数据包, 转发给 pipeline 中的第二个 DataNode, 第二个 DataNode 再转发给第三个 DataNode。
具体信息,可以参考下图:
2. 读操作流程
HDFS 读数据可以概括为如下几个步骤:
a ) HDFS Client 与 NameNode 进行交互,以决定文件的起始块的存储位置,然后 NameNode将会返回拥有这些 block 的 DataNode 的地址;
b ) HDFS Client 建立到 DataNode 的连接;
c ) HDFS Client 从 DataNode 请求数据;
d ) 从 DataNode 中读取到相应的 block 后,会关闭到该 DataNode 的连接,并找到存储下一个块的最佳 DataNode;
e ) 如果从某个 DataNode 中读取数据时遇到错误,将会尝试从另外一个中进行读取。
同时会标记失败的节点,在以后不再进行尝试。
如果遇到一个坏块,则会将其上报给 NameNode。此后,可以异步的进行数据的再拷贝。
具体信息,可以参考下图:
总结
在本篇文章中,首先介绍了 HBase 架构的整个概况,随后分别介绍了 HBase 的 3 个核心组件: Region、HMaster 和 Zookeeper ,以及HBase 的读写流程,HBase 的可靠性保障,最后介绍 HBase 底层 HDFS 的数据读写流程。希望通过本篇文章,大家可以形成一个脉络性的认识,在以后想要深入 学习的时候,可以知道从何处入手。