Hadoop依靠HBase实现存储,HBase采用列存储方案(典型NoSQL),加上LSM(Log
Structured
Merge-Tree)对数据紧缩,使得数据存储效率不错,很适合大数据环境下的读操作,但是如果做删除数据,由于列存储和LSM固有的特点,这时的处理效率不高。

dd by zhj:
最近的工作需要跟HBase打交道,所以花时间把《HBase权威指南》粗略看了一遍,感觉不过瘾,又从网上找了几篇经典文章。

Hbase概念:高可靠、高性能、面向列、可伸缩的分布式存储系统,可以存储海量数据并对海量数据进行检索。利用HBase
技术可在廉价PC 上搭建起大规模结构化存储集群。HBase使用HDFS
作为底层文件存储系统,在其上可以运行MapReduce
批量处理数据,使用ZooKeeper 作为协同服务组件。

威尼斯人平台 1

下面这篇就是很经典的文章,对HBase的架构进行了比较详细的描述。我自己也进行了简单的总结,简单的说,HBase使用的是LSM(

HBase 的特性:HBase 还是一种非关系型数据库,即NoSQL 数据库。        
                                 1.容量巨大                            
                                                                       
                             HBase
的单表可以有百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具
 有弹性。                                                              
                                                                       
       2. 面向列                                                        
                                                                       
   HBase 是面向列的存储和权限控制,并支持列独立检索。                  
                                           3. 扩展性                   
                                                                       
                                      HBase
底层文件存储依赖HDFS,从“基因”上决定了其具备可扩展性。HBase 的Region
和RegionServer
的概念对应的数据可以分区,分区后数据可以位于不同的机器上,所以在HBase
核心架构层面也具备可扩展性。HBase
的扩展性是热扩展,在不停止现有服务的前提下,可以随时添加或者减少节点。  
                                                                       
                                              4. 高可靠性              
                                                                       
                                         HBase 提供WAL 和Replication
机制。前者保证了数据写入时不会因集群异常而导致写入数据的丢失;后者保证了在集群出现严重问题时,数据不会发生丢失或者损坏。而且HBase
底层使用HDFS,HDFS 本身的副本机制很大程度上保证了HBase
的高可靠性。同时,协调服务的ZooKeeper 组件具备高可用性和高可靠性。      
                                                                       
     5. 高性能                                                          
                                                                       
      底层的LSM 数据结构和Rowkey 有序排列等架构上的独特设计,使得HBase
具备非常高的写入性能。Region 切分、主键索引和缓存机制使得HBase
在海量数据下具备一定的随机读取性能,该性能针对Rowkey
的查询能够达到毫秒级别。同时,HBase
对于高并发的场景也具备很好的适应能力。

图1 HBase列存储,NoSQL环境的主流存储方案,高效读是最大优点。

Log-Structured Merge
tree)–日志结构的合并树做为存储方式,这种存储方式是很多NoSQL数据库都在使用的,它的主要特点是:

Hbase与Hadoop/HDFS:                                                 
                                                   
HBase 使用HDFS
作为底层存储系统。HBase 在 HDFS
之上通过更加复杂的“数据结构和算法”提供了高并发实时随机写和高并发实时点读及扫描的特性,实现了高效的随机读写功能。如LSM(内存+顺序写磁盘)的方式。

Lexst主要面向商业领域的大数据存储,这一点与面向互联网行业存储有所不同,除了保证要保证大量的高效的读操作,还要兼顾大量的写处理(包括插入、删除、更新,完全标准SQL操作),以及数据的完整性、可靠性、安全性,所以在存储方案选择上采用了行存储。行存储特点是写入效率高,更新和删除容易实现,并且能够有效保证数据的完整性和一致性,但是读效率不如列存储。为了解决这个问题,lexst通过以下方案加以改进:

  1. 写:完全的内存操作,速度非常快。具体来说,是写入WAL(write ahead
    log)日志和MemStore内存,完成后给客户端响应。

**Hbase与传统数据库:
**

  1. 数据聚凑和有序的行排列布局

  2. 可调的存储结构

  3. 数据平衡

  4. Build节点优化

WAL相当于MySQL的binlog。当MemStore达到一定大小后,将其flush到磁盘。

关系型数据库                                     Hbase

1.先谈谈有序排列的问题。大数据读取时,很少有关系数据库读取单条记录的现象,普遍情况都是每次读取一批同质的数据。利用这种情况,在写入数据时,把相同或者相邻的数据按照某种排列顺序聚凑在一起时,在读取时,就可以做到一次性顺序读完。避免磁头在磁盘上的多次移动(机械硬盘的磁头移动非常费时间),这样就会显著提高数据读效率。但是每个用户对数据排列规则可能又是不一样的。比如一行数据默认的排列位置是“1,2,3”。在A用户处可能希望的排列顺序是“1,3,2”,到了B用户处,可能又是“2,3,1”。对于这种情况,lexst使用“create
layout”语句,允许用户在运行时自由选择自己的数据排列方案。顺带说一句,“create
layout”需要在建表时确立,否则将以默认位置进行排列。

  1. 读:将磁盘中的数据与MemStore中的数据进行合并后

支持向上扩展(服务器升级)            支持向外扩展 (添加新的服务器)

2.再说存储结构,lexst的存储结构保证数据可以极快的速度在内存中进行调整。比如,数据在磁盘上的存储排列顺序是“1,2,3”,但是当用户需要以“3,1,2”显示时,就要进行调整;或者用户只需要“3,1”排列,这时必须删除冗余的“2”,也是需要改变。由于编码上充分利用了X86
CPU上的SSE指令集,这个调整效率非常高,在Pentium4
2G单核芯片上的测试结果超过1,300,000行/秒。这是对读过程的又一次改进。

与B+树相比,LSM提高了写入性能,而且读取性能并没有减低多少

使用SQL查询                                    
使用API和MapReduce访问数据

3.还有数据平衡的问题。lexst是一个分布式的网络存储系统,数据的存储量极大,如果把同质数据放在一个存储节点上,那么这个单点上的数据压力就会很大,严重的会造成磁盘损坏或者节点宕机。为避免这种现象的发生,采用了平衡数据的办法,每个存储节点布置了其中一部分数据,做到每个节点不超载。当数据存储和计算时,通过数据分布算法和各节点之间协同,共同完成处理任务。

 

面向行                                               
面向列(为聚集存储设计更好的压缩和解压算法)

威尼斯人平台 2

HBase由三个部分,如下

适合结构化数据                                  适合结构化和非结构化数据

  1. HMaster

当有海量数据需要处理时,可以选择Hbase

对Region进行负载均衡,分配到合适的HRegionServer

Hbase在进行JOIN和多表合并时查询性能不好。

  1. ZooKeeper

选举HMaster,对HMaster,HRegionServer进行心跳检测(貌似是这些机器节点向ZooKeeper上报心跳)

Hbase架构设计

  1. HRegionServer

数据库的分片,HRegionServer上的组成部分如下

威尼斯人平台 3

Region:HBase中的数据都是按row-key进行排序的,对这些按row-key排序的数据进行水平切分,每一片称为一个Region,它有startkey和endkey,Region的大小可以配置,一台RegionServer中可以放多个Region

Hbase架构图

CF:列族。一个列族中的所有列存储在相同的HFile文件中

客户端Client

HFile:HFile就是Hadoop磁盘文件,一个列族中的数据保存在一个或多个HFile中,这些HFile是对列族的数据进行水平切分后得到的。

整个集群的访问入口
,使用HBase的RPC机制与HMaster和HRegionServer进行通信。对于管理类操作,Client
与HMaster 进行RPC 通信;对于数据读写类操作,Client 与RegionServer
进行RPC 交互。包含访问HBase的接口,并维护cache来加强对HBase的访问。

MemStore:HFile在内存中的体现。当我们update/delete/create时,会先写MemStore,写完后就给客户端response了,当Memstore达到一定大

协调服务组件ZooKeeper

小后,会将其写入磁盘,保存为一个新的HFile。HBase后台会对多个HFile文件进行merge,合并成一个大的HFile

ZooKeeper Quorum(队列)负责管理HBase 中多HMaster
的选举、服务器之间状态同步等。HBase 中ZooKeeper 实例存储HBase
元数据信息、实时监控RegionServer、存储所有Region
的寻址入口.保证任何时候集群中只有一个HMaster。

 

主节点HMaster

 

HMaster没有单节点问题,Hbase中可以启动多个HMaster,通过Zookeeper的Master
Election
机制保证总有一个Master在运行,主要负责Table和Region的管理工作。管理用户对表的增删查改操作。管理HRegionServer的负载均衡,调整Region分布。Region
Split之后,负责新Region的分布。在HRegionServer停机后,负责失效HRegioinServer上Region迁移工作。

 

Region 节点HRegionServer

英文:

HRegionServer 主要负责响应用户I/O 请求,向HDFS 文件系统中读写数据。

译文:


一.Hbase 架构的组件

  •  Region Server:提供数据的读写服务,当客户端访问数据时,直接和Region
    Server通信。
  • HBase Master:Region的分配,.DDL操作(创建表,删除表)
  • Zookeeper:是HDFS的一部分,维护一个活跃的集群状态

Hadoop DataNode存储着Region Server
管理的数据,所有的Hbase数据存储在HDFS文件系统中,Region Servers在HDFS
DataNode中是可配置的,并使数据存储靠近在它所需要的地方,就近服务,当王HBASE写数据时时Local的,但是当一个region
被移动之后,Hbase的数据就不是Local的,除非做了压缩(compaction)操作。NameNode维护物理数据块的元数据信息。

威尼斯人平台 4

 

HBase 存储

二.Regions

HBase Tables 通过行健的范围(row key range)被水平切分成多个Region,
一个Region包含了所有的,在Region开始键和结束之内的行,Regions被分配到集群的节点上,成为 Region
Servers,提供数据的读写服务,一个region server可以服务1000 个Region。

威尼斯人平台 5

 

三.HBase HMaster

分配Region,DDL操作(创建表, 删除表)

协调各个Reion Server :

        -在启动时分配Region、在恢复或是负载均衡时重新分配Region。

        -监控所有集群当中的Region Server实例,从ZooKeeper中监听通知。

管理功能:

        -提供创建、删除、更新表的接口。

威尼斯人平台 6

 

威尼斯人平台 7

四.ZooKeeper:协调器

Hbase使用Zookeeper作为分布式协调服务,来维护集群中的Server状态,ZooKeeper维护着哪些Server是活跃或是可用的。提供Server
失败时的通知。Zookeeper使用一致性机制来保证公共的共享状态,注意,需要使用奇数的三台或是五台机器,保证一致。

威尼斯人平台 8

 

存储单元Cell

五、组件之间如何工作

Zookeeper一般在分布式系统中的成员之间协调共享的状态信息,Region
Server和活跃的HMaster通过会话连接到Zookeeper,ZooKeeper维护短暂的阶段,通过心跳机制用于活跃的会话。

威尼斯人平台 9

每个Region Server创建一个短暂的节点,HMaster监控这些节点发现可用的Region
Server,同时HMaster 也监控这些节点的服务器故障。HMaster
通过撞见一个临时的节点,Zookeeper决定其中一个HMaster作为活跃的。活跃的HMaster
给ZooKeeper发送心跳信息,不活跃的HMaster在活跃的HMaster出现故障时,接受通知。

如果一个Region
Server或是一个活跃的HMaster在发送心跳信息时失败或是出现了故障,则会话过期,相应的临时节点将被删除,监听器将因这些删除的节点更新通知信息,活跃的HMaster将监听Region
Server,并且将会恢复出现故障的Region Server,不活跃的HMaster
监听活跃的HMaster故障,如果一个活跃的HMaster出现故障,则不活跃的HMaster将会变得活跃。

六  Hbase 的首次读与写

有一个特殊的Hbase 目录表叫做Meta表,它拥有Region
在集群中的位置信息,ZooKeeper存储着Meta表的位置。

如下就是客户端首次读写Hbase 所发生的事情:

1.客户端从Zookeeper的Meta表中获取Region Server。

2.客户端将查询 .META.服务器,获取它想访问的相对应的Region
Server的行健。客户端将缓存这些信息以及META 表的位置。

3.护额端将从相应的Region Server获取行。

如果再次读取,客户端将使用缓存来获取META
的位置及之前的行健。这样时间久了,客户端不需要查询META表,除非Region
移动所导致的丢失,这样的话,则将会重新查询更新缓存。

威尼斯人平台 10

 

威尼斯人平台 11

七 Hbase META表

META 表集群中所有Region的列表

.META. 表像是一个B树

.META. 表结构为:

– Key: region start key,region id

– Values: RegionServer

威尼斯人平台 12

 

威尼斯人平台 13

八  Region Server 的组件

Region Server 运行在HDFS DataNode上,并有如下组件:

WAL:Write Ahead Log
提前写日志是一个分布式文件系统上的文件,WAL存储没有持久化的新数据,用于故障恢复,类似Oracle
的Redo Log。

BlockCache:读缓存,它把频繁读取的数据放入内存中,采用LRU

MemStore:写缓存,存储来没有来得及写入磁盘的新数据,每一个region的每一个列族有一个MemStore

Hfiles :存储行,作为键值对,在硬盘上。

威尼斯人平台 14

 

Hbase 写步骤1:

当客户端提交一个Put 请求,第一步是把数据写入WAL:

-编辑到在磁盘上的WAL的文件,添加到WAL文件的末尾

-WAL用于宕机恢复

威尼斯人平台 15

 

Hbase 写步骤2

一旦数据写入WAL,将会把它放到MemStore里,然后将返回一个ACk给客户端

威尼斯人平台 16

 

威尼斯人平台 17

MemStore

MemStore
存储以键值对的方式更新内存,和存储在HFile是一样的。每一个列族就有一个MemStore
,以每个列族顺序的更新。

威尼斯人平台 18

 

 

威尼斯人平台 19

HBase Region 刷新(Flush)

当MemStore
积累到足够的数据,则整个排序后的集合被写到HDFS的新的HFile中,每个列族使用多个HFiles,列族包含真实的单元格,或者是键值对的实例,随着KeyValue键值对在MemStores中编辑排序后,作为文件刷新到磁盘上。

注意列族是有数量限制的,每一个列族有一个MemStore,当MemStore满了,则进行刷新。它也会保持最后一次写的序列号,这让系统知道直到现在都有什么已经被持久化了。

最高的序列号作为一个meta field
存储在HFile中,来显示持久化在哪里结束,在哪里继续。当一个region
启动后,读取序列号,最高的则作为新编辑的序列号。

威尼斯人平台 20

 

HStore 存储是HBase 存储的核心, 由两部分组成:MemStore
和StoreFile。MemStore 是Sorted Memory
Buffer,用户写入的数据首先会放入MemStore 中,当MemStore
满了以后会缓冲(flush)成一个StoreFile(底层实现是HFile,只有当storeFile满了之后才会将数据存储到HFile),当StoreFile
文件数量增长到一定阈值,会触发Compact 操作,将多个StoreFiles
合并成一个StoreFile,在合并过程中会进行版本合并和数据删除,因此可以看出HBase
其实只有增加数据,所有的更新和删除操作都是在后续的Compact
过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase
I/O 的高性能。StoreFiles 在触发Compact
操作后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split
操作,同时把当前Region 分裂成2 个Region,父Region会下线,新分裂的2
个子Region 会被HMaster 分配到相应的HRegionServer 上,使得原先1个Region
的压力得以分流到2 个Region
上。每个Region除了包含多个store外,还包含一个HLOG(预写式日志(WAL),HBase在写动作完成之前先写入到WAL,这样如果内存中的数据还没有写入到硬盘上就发生了崩溃,可以根基HLOG进行恢复。

HBase HFile

数据存储在HFile,HFile 存储键值,当MemStore
积累到足够的数据,整个排序的键值集合会写入到HDFS中新的HFile
中。这是一个顺序的写,非常快,能避免移动磁头。

威尼斯人平台 21

 


HFile 的结构

HFile
包含一个多层的索引,这样不必读取整个文件就能查找到数据,多层索引像一个B+树。

  • 键值对以升序存储
  • 在64K的块中,索引通过行健指向键值对的数据。
  • 每个块有自己的叶子索引
  • 每个块的最后的键被放入到一个中间索引中。
  • 根索引指向中间索引。

trailer (追踪器)指向 meta的块,并在持久化到文件的最后时被写入。trailer
拥有 bloom过滤器的信息以及时间范围(time range)的信息。Bloom
过滤器帮助跳过那些不含行健的文件,时间范围(time
range)则跳过那些不包含在时间范围内的文件。

威尼斯人平台 22

 

HFile Index

索引是在HFile 打开并放入内存中时被加载的,这允许在单个磁盘上执行查找。

威尼斯人平台 23

 

 

HBase 读合并

一个行的键值单元格可以被存储在很多地方,行单元格已经被存储到HFile中、在MemStore最近被更新的单元格、在Block
cache最佳被读取的单元格,所以当你读取一行数据时,系统怎么能把相对应的单元格内容返回呢?一次读把block
cache, MemStore, and HFiles中的键值合并的步骤如下:

  1. 首先,扫描器(scanner )在读缓存的Block
    cache寻找行单元格,最近读取的键值缓存在Block
    cache中,当内存需要时刚使用过的(Least Recently Used )将会被丢弃。
  2. 接下来,扫描器(scanner)将在MemStore中查找,以及在内存中最近被写入的写缓存。
  3. 如果扫描器(scanner)在MemStore 和Block
    Cache没有找到所有的数据,则HBase 将使用 Block
    Cache的索引以及bloom过滤器把含有目标的行单元格所在的HFiles
    加载到内存中。

威尼斯人平台 24

 

每个MemStore有许多HFiles
文件,这样对一个读取操作来说,多个文件将不得不被多次检查,势必会影响性能,这种现象叫做读放大(read amplification)。

威尼斯人平台 25

 

 

 

HBase 辅压缩(minor compaction)

HBase将会自动把小HFiles 文件重写为大的HFiles 文件,这个过程叫做minor
compaction。

辅助压缩减少文件的数量,并执行合并排序。

 威尼斯人平台 26

 

 

HBase 主压缩(Major Compaction)

主压缩将会合并和重写一个region 的所有HFile 文件,根据每个列族写一个HFile
文件,并在这个过程中,删除deleted 和expired 的单元格,这将提高读性能。

然而因为主压缩重写了所有的文件,这个过程中将会导致大量的磁盘IO操作以及网络拥堵。我们把这个过程叫做写放大(write
amplification)。

 威尼斯人平台 27

 

Region = 临近的键

  • 一个表将被水平分割为一个或多个Region,一个Region包含相邻的起始键和结束键之间的行的排序后的区域。
  • 每个region默认1GB 
  • 一个region的表通过Region Server 向客户端提供服务
  • 一个region server可以服务1000 个region

威尼斯人平台 28

 

 

Region 分裂

初始时一个table在一个region 中,当一个region
变大之后,将会被分裂为2个子region,每个子Region
代表一半的原始Region,在一个相同的 Region server中并行打开。

然后把分裂报告给HMaster。因为需要负载均衡的缘故,HMaster
可能会调度新的Region移动到其他的Server上。

 威尼斯人平台 29

 

读负载均衡(Read Load Balancing)

分裂一开始发生在相同的region server上,但是由于负载均衡的原因。HMaster
可能会调度新的Region被移动到其他的服务器上。

导致的结果是新的Region Server 提供数据的服务需要读取远端的HDFS
节点。直到主压缩把数据文件移动到Regions
server本地节点上,Hbase数据当写入时是本地的,

但是当一个region
移动(诸如负载均衡或是恢复操作等),它将不会是本地的,直到做了主压缩的操作(major
compaction.)

威尼斯人平台 30

 

HDFS数据复制

所有的读写操作发生在主节点上,HDFS 复制WAL和HFile
块,HFile复制是自动发生的,HBase 依赖HDFS提供数据的安全,

当数据写入HDFS,本地化地写入一个拷贝,然后复制到第二个节点,然后复制到第三个节点。

WAL 文件和
HFile文件通过磁盘和复制进行持久化,那么HBase怎么恢复还没来得及进行持久化到HFile中的MemStore更新呢?

威尼斯人平台 31

威尼斯人平台 32 

 

HBase 故障恢复

当一个RegionServer 挂掉了,坏掉的Region
不可用直到发现和恢复的步骤发生。Zookeeper 决定节点的失败,然后失去region
server的心跳。

然后HMaster 将会被通知Region Server已经挂掉了。

当HMaster检查到region server已经挂掉后,HMaster
将会把故障Server上的Region重写分配到活跃的Region servers上。

为了恢复宕掉的region server,memstore 将不会刷新到磁盘上,HMaster
分裂属于region server 的WAL 到单独的文件,

然后存储到新的region servers的数据节点上,每个Region
Server从单独的分裂的WAL回放WAL。来重建坏掉的Region的MemStore。

威尼斯人平台 33

 

 

数据恢复

WAL 文件包含编辑列表,一个编辑代表一个单独的put 、delete.Edits
是按时间的前后顺序排列地写入,为了持久化,增加的文件将会Append到WAL
文件的末尾。

当数据在内存中而没有持久化到磁盘上时失败了将会发生什么?通过读取WAL将WAL
文件回放,

添加和排序包含的edits到当前的MemStore,最后MemStore
刷新将改变写入到HFile中。

威尼斯人平台 34

 

 

九 HBase架构的优点

强一致模型:当写操作返回时,所有的读将看到一样的结果

自动扩展:Regions 随着数据变大将分裂;使用HDFS传播和复制数据

内建的恢复机制:使用WAL

和Hadoop的集成:直接使用mapreduce

十 HBase架构的缺点

WAL回放较慢

故障恢复较慢

主压缩导致IO瓶颈。

 

相关文章