HBase 实现原理以及系统架构详解

好用的东西,总能找到对应的开源实现,这就是开源得魅力。

下面一张图看下Hbase的前世今生

这里写图片描述

HBase是一个构建在HDFS上的分布式列存储系统;
HBase是基于Google BigTable模型开发的,典型的key/value系统;
HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;
从逻辑上讲,HBase将数据按照表、行和列进行存储。
与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

Hbase表的特点
大:一个表可以有数十亿行,上百万列;
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
面向列:面向列(族)的存储和权限控制,列(族)独立检索;
稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
数据类型单一:Hbase中的数据都是字符串,没有类型。

我们再看一下Hbase在hadoop中所占的角色:

这里写图片描述

其中:

HBase位于结构化存储层,围绕HBase,各部件对HBase的支持情况:
Hadoop部件            作用
HDFS              高可靠的底层存储支持
MapReduce            高性能的计算能力
Zookeeper            稳定服务和failover机制
Pig&Hive           高层语言支持,便于数据统计
Sqoop             提供RDBMS数据导入,便于传统数据库向HBase迁移

Hbase的数据模型:

这里写图片描述

  • 行键,Table的主键,Table中的记录按照Row Key排序
  • 时间戳,每次数据操作对应的时间戳,可以看作是数据的version number
  • 列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。

Table与Region

这里写图片描述

  1. Table随着记录增多不断变大,会自动分裂成多份Splits,成为Regions
  2. 一个region由[startkey,endkey)表示
  3. 不同region会被Master分配给相应的RegionServer进行管理

ROOT与META表

这里写图片描述

  • Hbase中有两张特殊表,ROOT和META
  • META:记录了用户表的Region信息,可以有多个region
  • ROOT:记录了META表的Region信息,ROOT中只有一个region
  • Zookeeper中记录了ROOT表的location
  • 客户端访问数据的流程:
    Client -> Zookeeper -> -ROOT- -> .META. -> 用户数据表

Memstore与storefile

  • 1:一个region由个store组成,每个store包含一个列族的所有数据。
  • 2:store包括位于把内存的memstore和位于硬盘的storefile
  • 3:写操作先写memstore,当memstore中的数据量到达某个阀值,hregionserver会启动flashcache进场写入storefile,每次写入形成单独的一个storefile
  • 4:当storefile文件的数量增到到一定阀值后,系统会进行自动合并,在合并过程中会进行版本合并和删除,形成更大的storefile
  • 5:当storefile大小超越一定阀值后,会把当前的region分割为两个,并有Hmaster分配到相应的region服务器,实现负载均衡。
  • 6:客户端检索数据时,先在memstore找,然后是storefile。

Hbase系统架构

这里写图片描述

组成部件说明

  1. Client:
    使用HBase RPC机制与HMaster和HRegionServer进行通信
    Client与HMaster进行通信进行管理类操作
    Client与HRegionServer进行数据读写类操作
  2. Zookeeper:
    Zookeeper Quorum存储-ROOT-表地址、HMaster地址
    HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况
    Zookeeper避免HMaster单点问题
  3. HMaster:
    HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行
    主要负责Table和Region的管理工作:
    1 管理用户对表的增删改查操作
    2 管理HRegionServer的负载均衡,调整Region分布
    3 Region Split后,负责新Region的分布
    4 在HRegionServer停机后,负责失效HRegionServer上Region迁移
  4. HRegionServer:
    HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据

这里写图片描述

–Region server维护region,处理对这些region的IO请求
–Region server负责split在运行过程中变得过大的region

如上图所示,当Client连上HReigonServer后,后者会打开相应的HRegion对象,为每个HColumeFamily创建Store实例,每个Store实例有一个MemStore,一个或多个StoreFile,StoreFile是HFile轻量级的包装。
1 写数据过程
首先是把Log写入到HLog中,HLog是标准的Hadoop Sequence File,由于Log数据量小,而且是顺序写,速度非常快;同时把数据写入到内存MemStore中,成功后返回给Client,所以对Client来说,HBase写的速度非常快,因为数据只要写入到内存中,就算成功了。
接着检查MemStore是否已满,如果满了,就把内存中的MemStore Flush到磁盘上,形成一个新的StoreFile。
当Storefile文件的数量增长到一定阈值后,系统会进行合并(Compact),在合并过程中会进行版本合并和删除工作,形成更大的storefile。
当Storefile大小超过一定阈值后,会把当前的Region分割为两个(Split),并由Hmaster分配到相应的HRegionServer,实现负载均衡
2 读数据过程
由于无法直接修改HBase里的数据,所有的update和delete操作都转换成insert操作,而且HBase里也没有索引,因此读数据都是以Scan的方式进行。
Client在读数据时,一般会指定timestamp和ColumnFamily.
首先,根据ColumnFamily可以过滤掉很大一部分Store,这也是HBase作为列式数据库的一大优势。
然后,根据timestamp和Bloom Filter排除掉一些StoreFiles
最后,在剩下的StoreFile (包含MemStore)里Scan查找

Hstore:

HBase存储的核心。由MemStore和StoreFile组成。
MemStore是Sorted Memory Buffer。用户写入数据的流程:

这里写图片描述

Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上
由此过程可知,HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。

HLog

引入HLog原因:
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer以外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况
工作机制:
每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

参考:
http://www.searchtb.com/2011/01/understanding-hbase.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值