HBase架构和原理

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cenjianteng/article/details/96365421

HBase简介

  • 分布式、可扩展的大数据存储
  • 版本化的非关系数据库
  • 随机访问,实时读/
  • 大表 - 数十亿行 乘以 百万列 
  • 面向列数据库
  • K-V 存储

HBase和Hadoop / HDFS有什么区别?

HDFS是一种分布式文件系统,非常适合存储大型文件。它不是通用文件系统,并且不提供文件中的快速单个记录查找。HBase建立在HDFS之上,为大型表提供快速记录查找(和更新)。HBase内部数据放在HDFS上的索引“StoreFiles”中,以进行高速查找。

数据模型

此表中看起来为空的单元格在HBase中不占用空间,这就是HBase“稀疏的原因。

请求row1 detailedInfo : phone T2时间戳 不会有返回值。

  • 表:   HBase由多行组成
  • 行:    HBase中的一行由一个行键和一个或多个具有与之关联的值的列组成。行存储时,行按字母顺序排序。
  • 列族: HBase表中的每一列,都归属于某个列族。表中的每一行都具有相同的列族,但给定的行可能不会在给定的列族中存储任何内容。列族和列族限定符之间用冒号(:)进行分隔。列名都以列族作为前缀,例如basicInfo : name = “小明basicInfo : gender = “20” 都属于basicInfo这个列族。
  • 列限定符: 列限定符将添加到列族中,以提供给定数据的索引。虽然列族在创建表时是固定的,但列限定符是可变的,并且行之间可能有很大差异。例如:列族basicInfo,其列限定符可能是 basicInfo : name 也可能是 basicInfo : gender
  • Cell:   {row keycolumnFamilyversion} 唯一确定的单元格。cell中的数据是没有类型的,全部是字节码形式存储。可以有一个无限数量的单元格,其中行和列相同但单元格地址仅在其版本维度上有所不同。
  • 时间戳: 时间戳与每个值一起写入,并且是给定版本值的标识符。默认情况下,timestamp表示写入数据时RegionServer上的时间,但是当您将数据放入单元格时,可以指定不同的时间戳值。

HBase架构和原理

 

组成部件说明:

Client

使用HBase RPC机制与HMasterHRegionServer进行通信
ClientHMaster进行管理类操作
ClientHRegionServer进行数据读写类操作

Zookeeper

Zookeeper Quorum存储-ROOT-表地址、HMaster地址
HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况
Zookeeper避免HMaster单点问题

Zookeeper的主要作用:客户端首先联系ZooKeeper子集群(quorum)(一个由ZooKeeper节点组成的单独集群)查找行健。上述过程是通过ZooKeeper获取含有-ROOT-region服务器名(主机名)来完成的。通过含有-ROOT-region服务器可以查询到含有.META.表中对应的region服务器名,其中包含请求的行健信息。这两处的主要内容都被缓存下来了,并且都只查询一次。最终,通过查询.META服务器来获取客户端查询的行健数据所在region的服务器名。一旦知道了数据的实际位置,即region的位置,HBase会缓存这次查询的信息,同时直接联系管理实际数据的HRegionServer。所以,之后客户端可以通过缓存信息很好地定位所需的数据位置,而不用再次查找.META.表。

HMaster

HMaster没有单点问题,HBase可以启动多个HMaster,通过ZookeeperMaster Election机制保证总有一个Master在运行
主要负责TableRegion的管理工作:
1. 管理用户对表的增删改查操作
2. 管理HRegionServer的负载均衡,调整Region分布
3. Region Split后,负责新Region的分布
4. HRegionServer停机后,负责失效HRegionServerRegion迁移

HRegionServer

HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写

https://images2018.cnblogs.com/blog/1217276/201805/1217276-20180502154607794-710652455.png

                                                https://images2018.cnblogs.com/blog/1217276/201805/1217276-20180502155839968-280021952.png

HRegionServer管理一系列HRegion对象;
每个HRegion对应Table中一个RegionHRegion由多个HStore组成;
每个HStore对应Table中一个Column Family的存储;
Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。

可以看到,client访问hbase上的数据并不需要master参与(寻址访问zookeeperregion server,数据读写访问region server),master仅仅维护tableregion的元数据信息(table的元数据信息保存在zookeeper上),负载很低。HRegionServer存取一个子表时,会创建一个HRegion对象,然后对表的每个列族创建一个Store实例,每个Store都会有一个MemStore0个或多个StoreFile与之对应,每个StoreFile都会对应一个HFileHFile就是实际的存储文件。因此,一个HRegion(表)有多少个列族就有多少个Store。一个HRegionServer会有多个HRegion和一个HLog

HRegion

table在行的方向上分隔为多个RegionRegionHBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。

Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阀值(默认256M)时就会分成两个新的region

每个region由以下信息标识:

  1. <表名,startRowKey,创建时间>
  2. 由目录表(-ROOT-.META.)记录该regionendRowKey

HRegion定位:Region被分配给哪个RegionServer是完全动态的,所以需要机制来定位Region具体在哪个region server

HBase使用三层结构来定位region

  1. 通过zookeeper里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一个region
  2. 通过-ROOT-表查找.META.表的第一个表中相应的region的位置。其实-ROOT-表是.META.表的第一个region.META.表中的每一个region-ROOT-表中都是一行记录。
  3. 通过.META.表找到所要的用户表region的位置。用户表中的每个region.META表中都是一行记录。

注意:

 -ROOT-表永远不会被分隔为多个region,保证了最多需要三次跳转,就能定位到任意的regionclient会将查询的位置信息缓存起来,缓存不会主动失效,因此如果client上的缓存全部失效,则需要进行6次网络来回,才能定位到正确的region,其中三次用来发现缓存失效,另外三次用来获取位置信息。

tableregion的关系

table默认最初只有一个region,随着记录数的不断增加而变大,起初的region会逐渐分裂成多个region,一个region有【startKey, endKey】表示,不同的region会被master分配给相应的regionserver管理。

regionhbase分布式存储和负载均衡的最小单元,不同的region分不到不同的regionServer

注意:region虽然是分布式存储的最小单元,但并不是存储的最小单元。region是由一个或者多个store组成的,每个store就是一个column family。每个store又由memStore1至多个store file 组成(memstore到一个阀值会刷新,写入到storefile,有hlog来保证数据的安全性,一个regionServer有且只有一个hlog)                               

HStore

HBase存储的核心。由MemStoreStoreFile组成。MemStoreStored Memory Buffer

HLog

引入HLog原因:在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。

工作机制:
每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入MemStore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同regionlog数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些regionHRegionServerLoad Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flushStoreFiles,完成数据恢复。

HBase的存储格式

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:

1. HFileHBaseKey-Value数据的存储格式,HFileHadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile

2. HLog FileHBaseWAL(Write Ahead Log)的存储格式,物理上是HadoopSequence File

HFile

https://images2018.cnblogs.com/blog/1217276/201805/1217276-20180503005707958-1447071381.jpg

图片解释:

HFile文件不定长,长度固定的块只有两个:TrailerFileInfo

Trailer中指针指向其他数据块的起始点

File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY

Data IndexMeta Index块记录了每个Data块和Meta块的起始点

Data BlockHBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRUBlock Cache机制

每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询 

每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏

HFile里面的每个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构。

https://images2018.cnblogs.com/blog/1217276/201805/1217276-20180503010131198-724999946.jpg

KeyLengthValueLength:两个固定的长度,分别代表KeyValue的长度 

Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey 

Column Family Length是固定长度的数值,表示Family的长度 

接着就是Column Family,再接着是Qualifier,然后是两个固定长度的数值,表示Time StampKey TypePut/Delete 

Value部分没有这么复杂的结构,就是纯粹的二进制数据

HLog File

https://images2018.cnblogs.com/blog/1217276/201805/1217276-20180503010301359-528531120.jpg

HLog文件就是一个普通的Hadoop Sequence FileSequence File KeyHLogKey对象,HLogKey中记录了写入数据的归属信息,除了tableregion名字外,同时还包括 sequence numbertimestamptimestamp写入时间sequence number的起始值为0,或者是最近一次存入文件系统中sequence number 

HLog Sequece FileValueHBaseKeyValue对象,即对应HFile中的KeyValue

写流程

https://images2018.cnblogs.com/blog/1217276/201805/1217276-20180503001412746-1581550869.png

1) Client通过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据;

2) 数据被写入RegionMemStore,知道MemStore达到预设阀值(MemStore)

3) MemStore中的数据被Flush成一个StoreFile

4) 随着StoreFile文件的不断增多,当其数量增长到一定阀值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除;

5) StoreFiles通过不断的Compact合并操作,逐步形成越来越大的StoreFile

6) 单个StoreFile大小超过一定阀值后,触发Split操作,把当前Region Split2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1Region的压力得以分流到2Region上。

可以看出HBase只有增添数据,所有的更新和删除操作都是在后续的Compact历程中举行的,使得用户的写操作只要进入内存就可以立刻返回,实现了HBase I/O的高性能。

读流程

1) Client访问Zookeeper,查找-ROOT-表,获取.META.表信息;

2) .META.表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer

3) 通过RegionServer获取需要查找的数据;

4) RegionServer的内存分为MemStoreBlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache

寻址过程:client—>Zookeeper—>ROOT—>.META. —>RegionServer—>Region—>client

 

参考: https://www.cnblogs.com/swordfall/p/8737328.html

展开阅读全文

没有更多推荐了,返回首页