HBase的架构与储存结构和各自基本原理
HBase的架构与储存结构和各自基本原理
HBase的架构
Hbase以表的方式组织数据,
表由行(Row)以及列(Column)组成,行由row key和一个或多个列及其值组成(存储是按照row key的字典顺序排序,row key的设计非常重要!!),
列必须属于某一列族(Column family),一个列族可以有一各或多个列(一列由列簇和列修饰符组成,他们通常由冒号(:) 分隔),其在存储架构中就是一个Hfile。
Hbase中的列可以达到百万级,列中的数据可以是稀疏的,空值并不占用存储空间。
数据按主键排序,同时表按主键划分为多个Region。底层是LSM树(Long-Structed Merge Tree)。
对于以上叙述,表的简略结构:(逻辑模型)
注1:建议把Hbase理解为一个多维Map
如下图,HBase 的架构图,在 HBase 中我们看到有 Client、Zookeeper、HMaster 和 HRegion。

接下来对Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等做个简单叙述:
Zookeeper
- 保证任何时候,集群中只有一个master(负责多HMaster的选举)
- 存贮所有Region的寻址入口
- 实时监控RegionServer的状态、将RegionServer的上线和下线信息实时通知给Master(服务器之间状态同步)
- 存储Hbase的schema(元数据信息)。包括有哪些table、每个table有哪些column family等
HMaster
(主要负责table和region的管理工作)
- Region分裂后,为RegionServer分配新的Region
- 负责RegionServer的负载均衡,调整region的分配
- 发现失效的region server并重新分配其上的region
(Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,见转载文章:http://developer.51cto.com/art/201708/549419.htm)
- 管理用户对table的增、删、改、查操作
- 监听zk,基于zookeeper感应rs的上下线
- 监听zk,基于zookeeper来保证HA
- 处理schema更新请求 (管理用户对表的增删修改)
- 不参与对表的读写访问
- 负载很低
- 无SPOF(单点故障)
- 在一个RegionServer死机后,负责失效节点的Region的迁移
HRegionServer
(主要负责响应用户对其上region的I/O请求,向HDFS读写数据,HbasHBase核心模块)
- HRegionSserver维护Master分配给它的region
- 维护region的cache
- 处理region的flush、compact、split
- 内部管理一系列的HRegion对象
- 一个HRegionServer会有多个HRegion和一个HLog。
Region
- 每一个HRegion又由很多的Store组成,每一个Store存储的实际上是一个列簇(ColumnFamily)下所有的数据。此外,在每一个Store(又名HStore)中有包含一块MemStore。MemStore驻留在内存中,数据到来时首先更新到MemStore中,当到达阈值之后再flush(默认64M)到对应的StoreFile(又名HFile)中,所以每一个Store包含多个StoreFile,StoreFile负责的是实际数据存储,为HBase中最小的存储单元。
- 达到某个阈值时,分裂(默认256M)。所以一个HRegionServer管理多个表,一个表下有多个Region,一个HRegion有多少个列族就有多少个Store,Store下有多个StoreFile文件,是HBase中最小的存储单元
- 以Region为单位管理, region(startKey,endKey);【默认情况下,刚创建一个表时,并不知道startkey和endkey】
- 每个Column Family单独存储:storeFile;( storefile的数量一多(到达阀值),就合并(同时合并版本以及删除之前要删除的数据);合并后大小到达阀值就split)
- 当某个Column Family累积的大小(具体的数据量) > 某阈值时,自动分裂成两个Region;合并之后,旧数据也不是立即删除,而是复制一份并同内存中的数据一起写到磁盘,在之后,LSM-Tree会提供一些机制来回收这些空间。[4]
- 如何找到某行属于哪个region呢?两张特殊的表:
- -NAMESPACE- 和.META.
StoreFile
(底层存储格式是HFile,HBase中最小的存储单元)
memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
HFile
(HFile基于Hadoop的TFile类实现,模仿Google的BIgTable论文中的SSTable格式。)
- HBase中KeyValue数据的存储格式,是hadoop的二进制格式文件。
- HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。
- Trailer中有指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。 - Data Block是hbase io的基本单元,为了提高效率,HRegionServer中有基于LRU的block cache机制。
- 每个Data块的大小可以在创建一个Table的时候通过参数指定(默认块大小64KB),大号的Block有利于顺序Scan,小号的Block利于随机查询。
- 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成
- Magic内容就是一些随机数字,目的是防止数据损坏
HLog(WAL log)
(HLog是WAL的核心实现类)
- WAL意为write ahead log,HBase中的预写日志,用来做灾难恢复使用,底层实现是HLog,HLog记录数据的所有变更。使用WAL的原因:因为MemStore存储的数据是驻留在内存中的,是不稳定的(比如宕机时),所以采用了WAL预写日志来解决这个问题。(运行MApReduce作业时,可以通过关闭WAL功能来获得性能的提升——setWriteToWAL(boolean))
- 其实HLog文件就是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中的sequence number。 Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue。
HBase的储存结构
为了清晰地表述这个,我们把HBase的存储结构分为逻辑结构和物理结构两个部分。
逻辑存储结构
通过下图直观地展示 HBase 的逻辑存储结构:

在本图中,列簇(Column Family)对应的值就是 info 和 area ,列( Column 或者称为 Qualifier )对应的就是 name 、 age 、 country 和 city ,Row key 对应的就是 Row 1 和 Row 2,Cell 对应的就是具体的值。
Row key:表的主键,按照字典序排序。列簇:在
HBase中,列簇将表进行横向切割。列:属于某一个列簇,在
HBase中可以进行动态的添加。Cell: 是指具体的Value,由{row key, column(=+ 据是没有类型的,全部是字节码形式存贮。【HBase 中通过row 和columns 确定的为一个存贮单元称为cell。】
Version:在这张图里面没有显示出来,这个是指版本号,用时间戳(TimeStamp)来表示。
看完这张图,是不是有点疑惑,怎么获取其中的一条数据呢?既然 HBase 是 KV 的数据库,那么当然是以获取 KEY 的形式来获取到 Value 啦。在 HBase 中的 KEY 组成是这样的:

KEY 的组成是以 Row key 、CF(Column Family) 、Column 和 TimeStamp 组成的。
TimeStamp 在 HBase 中充当的作用就是版本号,因为在 HBase 中有着数据多版本的特性,所以同一个 KEY 可以有多个版本的 Value 值(可以通过配置来设置多少个版本)。查询的话是默认取回最新版本的那条数据,但是也可以进行查询多个版本号的数据,在接下来的进阶操作文章中会有演示。
Region Server 和 Region 的关系

- 一个
Region Server就是一个机器节点(服务器) - 一个
Region Server包含着多个Region - 一个
Region包含着多个列簇(CF) - 一个
Region Server中可以有多张Table,一张Table可以有多个Region
物理存储结构
先来看这张图:

为了不混淆,我们可以先把以下的概念一一对应起来
逻辑结构物理结构Region ServerHRegion ServerRegionHRegionCFHStore(这里指的是Store)
在具体的物理结构中
HRegion Server就是一个机器节点,包含多个HRegion,但是这些HRegion不一定是来自于同一个Table,负责响应的是用户的IO请求,和HDFS进行交互,是服务器中的一个进程。HRegion包含多个HStore。- 一个
CF组成一个HStore,默认是10 G,如果大于10G会进行分裂。HStore是HBase的核心存储单元,一个HStore由MemStore和StoreFile组成。 MemStore是一块内存,默认大小是128M,如果超过了这个大小,那么就会进行刷盘,把内存里的数据刷进到StoreFile中。- 在
HStore对应着的是Table里面的Column Family,不管有CF中有多少的数据,都会存储在HStore中,为了避免访问不同的HStore而导致的效率低下。 HRegion是Hbase中分布式存储和负载均衡的最小单元,但不是存储的最小单元。- 一个
Hstore可以有多个StoreFile
在HBase中查找不同的CF的数据
从不同的 CF 中查询 Row 3 主键的数据,结果集如下:

更加直观地显示,在 HBase 中是以 CF 为单元的存储结构。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!