第四章 Hbase
01 Hbase基本原理
Region定位–region

1 | 在HBase中,表的所有行都是按照RowKey的字典序排列的,表在行的方向上分割为多个分区(Region)。如图1所示。 |
Region定位–META表
1 | 有了Region标识符,就可以唯一标识每个Region。为了定位每个Region所在的位置,就可以构建一张映射表,映射表的每个条目包含两项内容,一个是Region标识符,另一个是Region服务器标识,这个条目就表示Region和Region服务器之间的对应关系,从而就可以知道某个Region被保存在哪个Region服务器中。 |

1 | 映射表包含了关于Region的元数据,因此也被称为“元数据表”,又名“meta表”。可以scan命令查看meta |
Region定位–Region定位

1 | 在HBase的早期设计中,Region的查找是通过三层架构来进行查询的,即在集群中有一个总入口ROOT表,记录了meta表分区信息及各个入口地址,这个ROOT表存放在某个Region服务器上,但是在Zookeeper中保存有它的地址。这种早期的三层架构通过先找到ROOT表,从中获取分区meta表位置,然后再获取分区meta表信息,得到Region所在的Region服务器。 |
数据存储与读取
1 | HBase集群数据的构成如图所示 |

MemStore
1 | 当Region服务器收到写请求的时候,Region服务器会将请求转至相应的Region。数据首先写入到Memstore,然后当到达一定的阀值的时候,Memstore中的数据会被刷到HFile中进行持久性存储。 |
1 | HBase将最近接收到的数据缓存在MemStore中,在持久化到HDFS之前完成排序,再顺序写入HDFS,为后续数据的检索做了优化。因为MemStore缓存的是最近增加的数据,所以也提高了对近期数据的操作速度。在持久化写入之前,在内存中对行键或单元格做些优化。 |
Store
1 | Store是Region服务器的核心,存储的是同一个列族下的数据,每个Store包含有一块MemStore和0个或多个StoreFile。StoreFile是HBase中最小的数据存储单元。 |
1 | HBase将最近接收到的数据缓存在MemStore中,在持久化到HDFS之前完成排序,再顺序写入HDFS,为后续数据的检索做了优化。因为MemStore缓存的是最近增加的数据,所以也提高了对近期数据的操作速度。在持久化写入之前,在内存中对行键或单元格做些优化。 |
Store的合并分裂

HFile

1 | MemStore内存中的数据写到StoreFile文件中,StoreFile底层是以HFile的格式保存。 |
1 | HFile里面的每个键值对就是一个简单的byte数组。但是这个byte数组里面包含了很多项,并且有固定的结构。 |

1 | 键值对结构以两个固定长度的数值开始,分别表示Key的长度和Value的长度。 |
数据存储与读取
HBase写文件流程
1 | 客户端首先访问zookeeper,从meta表得到写入数据对应的region信息和相应的region服务器。 |
HBase读文件流程
1 | 客户端先访问zookeeper,从meta表读取Region的信息对应的服务器。 |
WAL机制

1 | 分布式环境下,必须要考虑到系统出错的情形,比如Region服务器发生故障时,MemStore缓存中还没有被写入文件的数据会全部丢失。 |
02 Hbase Region管理
HFile合并
Minor合并

1 | 前面讲过 |

1 | 对需要进行Minor合并的文件的选择是触发式的,当达到触发条件才会进行Minor合并,而触发条件有很多,比如在将MemStore的数据刷到HFile时会申请对Store下符合条件的HFile进行合并,或者定期对Store内的HFile进行合并。另外对选择合并的HFile也是有条件的,如表1所示。 |
Major合并

1 | Major合并针对的是给定Region的一个列族的所有Hfile。 |
Region拆分

1 | Region拆分是HBase能够拥有良好扩展性的最重要因素。一旦一个Region的负载过大或者超过阈值时,会被分裂成新的两个Region,如图所示。 |
拆分策略

1 | 上表列举的切分策略中,切分点的定义是一致的,即当Region中最大Store的大小大于设置阈值之后才会触发拆分。而不同策略中,阈值的定义是不同的,且对集群中Region的分布有很大的影响。 |
Region合并
1 | 当RegionServer中的Region数到达最大阈值时,RegionServer就会发起Region合并。其合并过程如下: |
1 | 从Region的拆分可以看到随着表的增大,Region的数量是越来越大的,如果很多Region,它们中Memstore也过多,内存大小会触发RegionServer级别的限制,会频繁出现数据从内存刷到HFile的操作,就会对用户请求产生较大的影响,可能阻塞该RegionServer上的更新操作。过多Region会增加ZooKeeper的负担。因此当RegionServer中的Region数到达最大阈值时,RegionServer就会发起Region合并。 |
Region负载均衡

1 | 在分布式系统中,负载均衡是一个非常重要的功能,在HBase中通过Region的数量来实现负载均衡。 |
03 Hbase集群管理
运维管理
移除RegionServer节点
1 | 当集群由于升级或更换硬件等原因需要在单台机器上停止守护进程时,需要确保集群的其他部分正常工作,并且确保从客户端应用来看停用时间最短。满足此条件必须把这台RegionServer服务的Region主动转移到其他RegionServer上,而不是让HBase被动地对此RegionServer的下线进行反应。 |
1 | 集群运行时,有些操作任务是必需的,包括增加和移除节点。 |
增加RegionServer节点
1 | 随着应用系统需求的增长,整个HBase集群需要进行扩展,这时就需要往HBase集群中增加一个节点。添加一个新的RegionServer是运行集群的常用操作,首先需要修改conf目录下的regionserver文件,然后将此文件复制到集群中所有机器上,这样可以使用启动脚本就能够添加新的服务器。 |
1 | HBase底层是以HDFS来存储数据的,一般部署HBase集群时,HDFS的DataNode和HBase的RegionServer位于同一台物理机上。 |