一、基本原理1.1 Row Key (行键)1.2 Column Family(列族)1.3 Column Qualifier (列限定符)1.4 Column(列)1.5 Cell1.6 Timestamp(天数戳)二、储存内部结构2.1 Regions2.2 Region Server三、Hbase控制系统构架3.1 控制系统构架3.2 模块间的协同四、统计数据的随机存取业务流程详述4.1 载入统计数据的业务流程4.2 读取统计数据的业务流程
一、基本原理
两个众所周知的 Hbase Table 表如下表所示:
1.1 Row Key (行键)
Row Key 是用以索引历史记录的换行符。想出访 HBase Table 中的统计数据,多于下列四种形式:
透过选定的Row Key 展开出访;
透过 Row Key 的 range 展开出访,即出访选定范围内的行;
展开全表扫描器。
Row Key 可以是任意字符串,储存时统计数据按照 Row Key的字典序展开排序。这里需要注意下列两点:
因为字典序对 Int 排序的结果是 1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。如果你使用整型的字符串作为行键,那么为了保持整型的自然序,行键必须用 0 作左填充。
行的一次随机存取操作时原子性的 (不论一次随机存取多少列)。
1.2 Column Family(列族)
HBase 表中的每个列,都归属于某个列族。列族是表的 Schema 的一部分,所以列族需要在创建表时展开定义。列族的所有列都以列族名作为前缀,例如courses:history,courses:math 都属于 courses 这个列族。
1.3 Column Qualifier (列限定符)
列限定符,你可以理解为是具体的列名,例如 courses:history,courses:math 都属于 courses这个列族,它们的列限定符分别是history 和 math。需要注意的是列限定符不是表 Schema 的一部分,你可以在插入统计数据的过程中动态创建列。
1.4 Column(列)
HBase 中的列由列族和列限定符组成,它们由 :(冒号) 展开分隔,即两个完整的列名应该表述为 列族名 :列限定符。
1.5 Cell
Cell是行,列族和列限定符的组合,并包含值和天数戳。你可以等价理解为关系型统计数据库中由选定行和选定列确定的两个单元格,但不同的是 HBase 中的两个单元格是由多个版本的统计数据组成的,每个版本的统计数据用天数戳展开区分。
1.6 Timestamp(天数戳)
HBase 中透过 row key 和 column确定的为两个储存单元称为Cell。每个 Cell 都保存着同一份统计数据的多个版本。版本透过天数戳来索引,天数戳的类型是 64 位整型,天数戳可以由 HBase 在统计数据载入时自动赋值,也可以由客户显式选定。每个 Cell中,不同版本的统计数据按照天数戳倒序排列,即最新的统计数据排在最前面。
二、储存内部结构
2.1 Regions
HBase Table 中的所有行按照 Row Key的字典序排列。HBase Tables 透过行键的范围 (row key range) 被水平切分成多个Region, 两个 Region 包含了在 start key 和 end key 之间的所有行。
每个表一开始多于两个 Region,随着统计数据不断增加,Region 会不断增大,当增大到两个阀值的时候,Region 就会等分为两个新的 Region。当 Table 中的行不断增多,就会有越来越多的 Region。
Region 是 HBase 中分布式储存和负载均衡的最小单元。这意味着不同的 Region 可以分布在不同的 Region Server 上。但两个 Region 是不会拆分到多个 Server 上的。
2.2 Region Server
Region Server运行在 HDFS 的 DataNode 上。它具有下列模块:
**WAL(Write Ahead Log,预写日志)**:用于储存尚未进持久化储存的统计数据历史记录,以便在发生故障时展开恢复。
BlockCache:读缓存。它将频繁读取的统计数据储存在内存中,如果储存不足,它将按照最近最少使用原则 清除多余的统计数据。
MemStore:写缓存。它储存尚未载入磁盘的新统计数据,并会在统计数据载入磁盘之前对其展开排序。每个 Region 上的每个列族都有两个 MemStore。
HFile :将行统计数据按照 Key\Values 的形式储存在文件控制系统上。
Region Server 存取两个子表时,会创建两个 Region 对象,然后对表的每个列族创建两个Store 实例,每个 Store 会有 0 个或多个 StoreFile 与之对应,每个 StoreFile 则对应两个 HFile,HFile 就是实际储存在 HDFS 上的文件。
三、Hbase控制系统构架
3.1 控制系统构架
HBase 控制系统遵循 Master/Salve 构架,由四种不同类型的模块组成:
Zookeeper
保证任何时候,集群中多于两个 Master;
存贮所有 Region 的寻址入口;
实时监控 Region Server 的状态,将 Region Server 的上线和下线信息实时通知给 Master;
储存 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family 等信息。
Master
为 Region Server 分配 Region ;
负责 Region Server 的负载均衡 ;
发现失效的 Region Server 并重新分配其上的 Region;
GFS 上的垃圾文件回收;
处理 Schema 的更新请求。
Region Server
Region Server 负责维护 Master 分配给它的 Region ,并处理发送到 Region 上的 IO 请求;
Region Server 负责切分在运行过程中变得过大的 Region。
3.2 模块间的协同
HBase 使用 ZooKeeper 作为分布式协调服务来维护集群中的服务器状态。 Zookeeper 负责维护可用服务列表,并提供服务故障通知等服务:
每个 Region Server 都会在 ZooKeeper 上创建两个临时节点,Master 透过 Zookeeper 的 Watcher 机制对节点展开监控,从而可以发现新加入的 Region Server 或故障退出的 Region Server;
所有 Masters 会竞争性地在 Zookeeper 上创建同两个临时节点,由于 Zookeeper 只能有两个同名节点,所以必然多于两个 Master 能够创建成功,此时该 Master 就是主 Master,主 Master 会定期向 Zookeeper 发送心跳。备用 Masters 则透过 Watcher 机制对主 HMaster 所在节点展开监听;
如果主 Master 未能定时发送心跳,则其持有的 Zookeeper 会话会过期,相应的临时节点也会被删除,这会触发定义在该节点上的 Watcher 事件,使得备用的 Master Servers 得到通知。所有备用的 Master Servers 在接到通知后,会再次去竞争性地创建临时节点,完成主 Master 的选举。
四、统计数据的随机存取业务流程详述
4.1 载入统计数据的业务流程
Client 向 Region Server 提交写请求;
Region Server 找到目标 Region;
Region 检查统计数据是否与 Schema 一致;
将更新载入 WAL Log;
将更新载入 Memstore;
判断 Memstore 储存是否已满,如果储存已满则需要 flush 为 Store Hfile 文件。
更为详细载入业务流程可以参考:HBase - 统计数据载入业务流程解析
4.2 读取统计数据的业务流程
下列是客户端首次随机存取 HBase 上统计数据的业务流程:
客户端从 ZookeepeMETA 表所在的 Region Server;
客户端出访 META 表所在的 Region Server,从 META表中查询到出访行键所在的 Region Server,之后客户端将缓存这些信息以及META 表的位置;
META表,除非 Region 移动导致缓存失效,这样的话,则将会重新查询并更新缓存。
注:META表是 HBase 中一张特殊的表,它保存了所有 Region 的位置信息,META 表自己的位置信息则储存在 ZooKeeper 上。
更为详细读取统计数据业务流程参考:
HBase 原理-统计数据读取业务流程解析
HBase 原理-迟到的‘统计数据读取业务流程部分细节