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 中我们看到有 ClientZookeeperHMasterHRegion

HBase架构图

接下来对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)对应的值就是 infoarea ,列( Column 或者称为 Qualifier )对应的就是 nameagecountrycityRow key 对应的就是 Row 1Row 2Cell 对应的就是具体的值。

  • Row key :表的主键,按照字典序排序。

  • 列簇:在 HBase 中,列簇将表进行横向切割。

  • 列:属于某一个列簇,在 HBase 中可以进行动态的添加。

  • Cell : 是指具体的 Value ,由{row key, column(= +

    据是没有类型的,全部是字节码形式存贮。【HBase 中通过row 和columns 确定的为一个存贮单元称为cell。】

  • Version :在这张图里面没有显示出来,这个是指版本号,用时间戳(TimeStamp )来表示。

看完这张图,是不是有点疑惑,怎么获取其中的一条数据呢?既然 HBaseKV 的数据库,那么当然是以获取 KEY 的形式来获取到 Value 啦。在 HBase 中的 KEY 组成是这样的:

img

KEY 的组成是以 Row keyCF(Column Family)ColumnTimeStamp 组成的。

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

Region Server 和 Region 的关系

img

  • 一个 Region Server 就是一个机器节点(服务器)
  • 一个 Region Server 包含着多个 Region
  • 一个 Region 包含着多个列簇 (CF)
  • 一个 Region Server 中可以有多张 Table,一张 Table 可以有多个 Region

物理存储结构

先来看这张图:

img

为了不混淆,我们可以先把以下的概念一一对应起来

逻辑结构物理结构Region ServerHRegion ServerRegionHRegionCFHStore(这里指的是Store)

在具体的物理结构中

  • HRegion Server 就是一个机器节点,包含多个 HRegion ,但是这些 HRegion 不一定是来自于同一个 Table ,负责响应的是用户的 IO 请求,和 HDFS 进行交互,是服务器中的一个进程。
  • HRegion 包含多个 HStore
  • 一个 CF 组成一个 HStore ,默认是 10 G,如果大于 10G 会进行分裂。HStoreHBase 的核心存储单元,一个 HStoreMemStoreStoreFile 组成。
  • MemStore 是一块内存,默认大小是 128M,如果超过了这个大小,那么就会进行刷盘,把内存里的数据刷进到 StoreFile 中。
  • HStore 对应着的是 Table 里面的 Column Family,不管有 CF 中有多少的数据,都会存储在 HStore 中,为了避免访问不同的 HStore 而导致的效率低下。
  • HRegionHbase 中分布式存储和负载均衡的最小单元,但不是存储的最小单元。
  • 一个 Hstore 可以有多个 StoreFile

在HBase中查找不同的CF的数据

从不同的 CF 中查询 Row 3 主键的数据,结果集如下:

img

更加直观地显示,在 HBase 中是以 CF 为单元的存储结构。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!