HBase组件
在物理上,HBase是由三种类型的servers组成的主从型架构。Region servers服务于数据的读取和写入。客户端在访问数据时,直接与HBase Region servers 进行通信。区域分配、DDL(创建、删除表)操作由HBase主进程处理。Zookeeper是HDFS的一部分,它维护着一个活的集群状态。
Hadoop DataNode存储的是 Region servers 管理的数据。所有HBase的数据都存储在HDFS文件中。 Region servers 与HDFS DataNode对接,这使得 Region servers 所服务的数据能够实现数据定位(将数据放在需要的地方附近)。HBase的数据在写入时是本地的,但当区域被移动时,直到compaction之前,数据都不是本地的。
NameNode维护由文件组成的所有物理数据块的元数据信息。
Regions
HBase表按行键范围横向划分为 "Regions"。一个region包含该区域的开始键和结束键之间的表中的所有记录。Regions被分配给集群中的节点,称为 "Region Servers",这些节点为数据的读取和写入服务。一个Region Servers可以服务于大约1000个region。
HBase Master
Region分配、DDL(创建、删除表)操作由Hbase Master处理。
一个 master 负责:
- 协调region servers
- 在启动时分配region,重新分配region用于恢复或负载平衡。
- 监控集群中的所有 RegionServer 实例(监听来自 zookeeper 的通知)。
- 管理功能
ZooKeeper: The Coordinator
HBase使用ZooKeeper作为分布式协调服务来维护集群中的服务器状态。Zookeeper维护哪些服务器是活的、可用的,并提供服务器故障通知。Zookeeper使用共识(consensus)来保证共同的共享状态。需要注意的是,应该有三台或五台机器进行共识。
How the Components Work Together:各组件如何共同工作
Zookeeper用于协调分布式系统成员的共享状态信息。Region servers 和活动的HMaster用会话连接到ZooKeeper。ZooKeeper通过心率来维护活动会话的临时节点。
每个Region Server都会创建一个临时节点。HMaster监控这些节点以发现可用的Region Server,同时它还监控这些节点是否有服务器故障。HMasters 创建临时节点。Zookeeper确定第一个并使用它来确保只有一个master是活动的。活动的HMaster向Zookeeper发送心跳,非活动的HMaster监听活动的HMaster故障通知。
如果Region Server或活动中的HMaster未能发送心跳,则会话过期,并删除相应的临时节点。 更新的监听者会收到被删除节点的通知。活动的HMaster监听Region Server,并在失败时恢复区域服务器。Inactive HMaster监听active HMaster失败,如果active HMaster失败,则Inactive HMaster变为active HMaster。
HBase First Read or Write:HBase第一次读或写
有一个特殊的HBase目录表,叫做META表,它保存了集群中regions的位置。ZooKeeper存储了META表的位置。
这是客户端第一次读取或写入HBase时发生的事情:
对于未来的读取,客户端使用缓存来检索META位置和之前读取的row keys。随着时间的推移,它不需要查询META表,除非因为某个Region 移动而没有命中,否则它将重新查询并更新缓存。
- 这个meta表是一个HBase表,它保留了系统中所有区域的列表。
- .meta.表就像一个b树。
- .META.表的结构如下:
- Key: region start key,region id
- Values: RegionServer
Region Server Components
Region Server运行在一个HDFS数据节点上,有以下组件。
- WAL:Write Ahead Log是分布式文件系统中的一个文件。WAL是用来存储还没有被持久化到永久存储的新数据;它用于故障时的恢复。
- BlockCache:是读取缓存。它将频繁读取的数据存储在内存中。最近最少使用的数据在满时被驱逐。
- MemStore:是写缓存。它存储还没有写到磁盘的新数据。它在写到磁盘之前会被排序。每个列族每个区域有一个MemStore。
- Hfiles将行作为排序的KeyValues存储在磁盘上。
HBase Write Steps (1)
当客户端发出Put请求时,第一步是将数据写到 write-ahead日志,即WAL。
- - Edits被附加到存储在磁盘上的WAL文件的末尾。
- - WAL是用来恢复未被写入的数据,以备服务器崩溃时恢复未被写入的数据。
HBase Write Steps (2)
一旦数据被写入WAL,就会被放置到MemStore中。然后,put请求确认返回给客户端。
HBase MemStore
MemStore以排序的KeyValues的形式在内存中存储更新,就像在HFile中存储一样。每个列族有一个MemStore。更新是按照每个列族进行排序的。
HBase Region Flush
当MemStore积累了足够的数据后,整个排序后的数据集被写入HDFS中的新HFile。HBase在每个列族中使用多个HFile,其中包含实际的单元格,或KeyValue实例。这些文件是随着时间的推移而创建的,因为在MemStores中排序的KeyValue edits作为文件被刷新到磁盘上。
注意,这就是为什么HBase中的列族数量有限制的原因之一。每个CF只有一个MemStore;当一个CF满了,它们都会被刷新。它还会保存最后写的序列号,这样系统就知道到现在为止持久化了什么。
最高的序列号被存储为每个HFile中的元字段,以反映持久化的位置和继续持久化的位置。在region启动时,序列号被读取,最高的序列号作为新edits的序列号。
HBase HFile
数据存储在一个HFile中,其中包含排序的Key/Value。当MemStore积累了足够的数据后,整个排序的KeyValue集被写入HDFS中的新HFile。这是一种顺序写法。它的速度非常快,因为它避免了移动磁盘驱动器头。
HBase HFile Structure
一个HFile包含一个多层索引,它允许HBase在不读取整个文件的情况下寻找数据。多层索引就像一个b+树。
- 键值对的存储顺序依次递增
- 按行键指向64KB "块 "中的键值数据的键值索引
- 每个块都有自己的叶子索引
- 每个块的最后一个键被放在中间索引中。
- 根索引指向中间索引