HBase的架构、数据模型及读写流程

Hbase简介

  HBase是一个分布式的、面向列的开源数据库存储系统 ,是对Google论文Bigtable的实现,具备高可靠性、高性能和可伸缩性,它能够处理分布在数千台通用服务器上的PB级的海量数据 。Bigtable是经过Google文件系统(GFS)来存储数据的,而HBase对应的是经过Hadoop分布式文件系统(HDFS)来存储数据的。Hbase是Apache的Hadoop项目的子项目,不一样于通常的关系数据库,它是一个适合于非结构化数据存储的数据库,另外HBase是基于行键、列键和时间戳创建索引的模式存储数据的。HBase不限制存储的数据的种类,容许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase能够在一个服务器集群上运行,而且可以根据业务进行横向扩展。数据库

Hbase与传统数据库的区别

项目 Hbase 传统数据库
数据量 线性扩展,数据量增多时可经过节点扩展进行支撑 数据量很大的时候没法存储
数据备份 数据存储在hdfs上,备份机制健全 没有很好的备份机制
访问速度 经过zookeeper协调查找数据,访问速度快 数据达到必定数量会开始变慢,很大的时候甚至没法支撑
数据表结构 列动态增长,数据自动切分,支持高并发读写,但不支持条件查询 列动态增长,数据自动切分,支持高并发读写,支持复杂的查询

Hbase的特色

   面向列: Hbase是面向列的存储和权限控制,并支持独立索引。列式存储,其数据在表中是按照某列存储的,这样在查询时只须要少数几个字段,能够大大减小读取的数据量。数组

  多版本: Hbase每个列会存储多个Version。缓存

  稀疏性: 为空的列不占用存储空间,表能够设计的很是稀疏。服务器

  可扩展性: 由于底层依赖的是HDFS,HDFS自己就能够进行扩展。数据结构

  高可靠性: WAL机制保证了数据写入时不会由于集群异常而致使写入数据丢失,Replication机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。并且Hbase底层使用HDFS,HDFS自己就会进行备份。架构

  高性能: 底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase具备很是高的写入性能。region切分主键索引和缓存机制使得Hbase在海量数据下具有必定的随机读取性能,该性能针对RowKey的查询能达到毫秒级别。并发

  HBase依赖于Zookeeper: Hbase是依赖于Zookeeper的,HBase中有内置的Zookeeper,但通常咱们会用其余的 Zookeeper 集群来监管 HMaster 和HRegionServer,Zookeeper 经过选举,保证任什么时候候,集群中只有一个活跃的 HMaster 。负载均衡

Hbase的架构图

    Hbase的架构图以下: 分布式

    一、HBase架构中有若干个从节点HRegionServer,负责维护主节点HMaster分配给它的HRegion,响应客户端Client的I/O请求,向HDFS文件系统中读写数据,切分在运行过程当中变得过大的HRegion。并发性能与HRegionServer的个数有关。高并发

    二、一个HRegionServer中有若干个HRegion,若干连续的行构成一个HRegion,当一个HRegion全部的storefile的大小超过阈值后,这个HRegion会分割为两个,并由HMaster分配到相应的HRegionServer服务器,实现负载均衡,因此一张完整的表可能被保存在多个HRegionServer上,HRegion是HBase中分布式存储和负载均衡的最小单元,但并非存储的最小单元。

    三、HBase中的每张表都经过RowKey按照必定的范围被分割成多个子表(HRegion),默认一个HRegion超过256M就要被分割成两个,这个过程由HRegionServer管理,而HRegion的分配由HMaster管理。 一个HRegion中有若干个Store,每一个Store是一个列族,Store分两种,新插入的数据在内存数据MemStore中,满了以后写到磁盘StoreFile中,数据以HFile的格式保存在hdfs的DataNode中,StoreFile中有Hfile的元数据,方便索引。客户端在检索数据时,先在MemStore找,找不到再找StoreFile。不断的写StoreFile生成HFile会产生不少小文件不利于性能,因此会合并小StoreFile造成更大的,过大的话再切分。

    四、HLog是一种预写日志WAL log,即Write ahead log,对hbase操做以前会将指令先写入HLog,如MemStore中的数据还没写入StoreFile时停电了,就能够进行数据恢复。每一个HRegionServer只有一个HLog,缺点是若是一台HRegionServer下线,为了恢复其上的HRegion,须要将HLog进行拆分,而后分发到其它HRegionServer上进行恢复。

    五、HMaster管理用户的增删改查操做,管理HRegionServer的负载均衡,调整Region分布,在HRegionServer停机后,负责失效HRegionServer上的HRegion迁移。因为master只维护表和HRegion的元数据,而不参与表数据I/O的过程,HMaster下线仅致使全部元数据的修改被冻结(没法建立删除表,没法修改表的schema,没法进行HRegion的负载均衡,没法处理HRegion上下线,没法进行HRegion的合并,惟一例外的是HRegion的 split能够正常进行,由于只有HRegionServer参与),表的数据读写还能够正常进行。所以HMaster下线短期内对整个HBase集群没有影响。从上线过程能够看到,HMaster保存的 信息全是能够冗余信息(均可以从系统其它地方收集到或者计算出来),所以,通常HBase集群中老是有一个HMaster在提供服务,还有一个以上的"HMaster"在等待时机抢占它的位置。

    六、客户端client包含有各类接口,client维护着一些cache来加快对HBase的访问,好比HRegion的位置信息。读写操做时,客户端直接与HRegionServer通讯,建表等管理操做则请求ZooKeeper与HMaster通讯。

    七、ZooKeeper是分布式应用程序协调服务,保存了表元数据寻址地址(-ROOT-表的地址)、HMaster和HRegionServer的状态信息。它的做用是保证集群中只有一个HMaster,实时监控HRegionServer的状态并通知给HMaster。

    八、-ROOT-表和.META.表是两个内置表。.META.表中每一行记录了一个用户表HRegion的信息,当用户表特别大时,HRegion也会很是多,.META.表也变得很是大,这时.META.本身也须要划分红多个HRegion,托管到多个HRegionServer上,此时须要用-ROOT-表去定位.META.,即-ROOT-表保存.META.表的HRegion信息。-ROOT-表永远只有一个HRegion,也就只会存放在一台HRegionServer上,定位任意HRegion须要3次跳转。示意图以下: 

    九、HFile是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内容就是一些随机数字,目的是防止数据损坏。

Hbase数据模型

  HBase是一个面向列的存储数据库,与通常的关系型数据库不一样,它里面的数据是以列的形式来进行存储的。在Hbase中一张表的列簇不会超过5个,每一个列簇中的列数没有限制,HBase表的数据模型以下图:

  一、hbase表由若干行组成,行之间是有序的,按照惟一行键RowKey排序。

  二、每一行由多个列族ColumnFamily组成,列族须要在建立表的时候定义好,如在语句create 'test','col1','col2'中,test为表名,col1为列族名。HBase的权限控制、存储以及调优都是在列族层面进行的,同一列族的数据存储在同一目录下,建议列族数目很少于3个。

  三、列族由多个列column组成,列不用预先定义,能够随时修改。

  四、每个单元格cell都有惟一的时间戳timestamp标记版本。由于Hbase不适合修改数据,因此用时间戳记录版本,修改数据就是添加新数据。单元格内的数据都是以字节数组表示的键值对。

HBase读数据流程

  Hbase的读数据流程以下:

    一、Client访问Zookeeper,获取-ROOT-表的元数据信息,即表位于哪一个RegionServer。

    二、Zookeeper收到Client请求,并向客户端返回此RegionServer的地址。

    三、Client经过获取到的RegionServer的IP去访问RegionServer。

    四、Client接着读取RegionServer中的-ROOT-表的内容,获取到.META表的地址。

    五、Client根据.META表的地址,访问.META表,获取到数据的元数据信息。

    六、client根据获取到的数据的元数据信息,去访问对应的HRegionServer,而后扫描所在的MemeStore和storefile来查询数据。

HBase写数据流程

  Hbase的写数据流程以下:

    一、Client向Zookeeper发送写数据请求。

    二、Zookeeper收到Client发送的写数据请求,而后返回要写入数据对应的HRegionServer服务器和HRegion信息。

    三、Client根据Zookeeper发送过来的信息向对应的HRegionServer服务器发起写入数据请求,而后HRegionServer收到请求并响应。

    四、Client先把数据写入到HLog中,防止数据丢失,而后再写入数据。

    五、若是 Hlog 和 Memstore 均写入成功,则这条数据写入成功。在此过程当中,若是 Memstore达到16kb,会把 Memstore 中的数据写到一个队列中。

    六、每次写满一个MemStore就会生一个HFile。

    七、当HFile达到必定数量时,HRegionServer调用HDFS的API对HFile进行合并。

相关文章
相关标签/搜索