文章目录

  • 1. HBase简介
  • 2. HBase的角色
  • 2.1 HMaster
  • 2.2 HRegionServer
  • 2.2.1 功能
  • 2.2.2 组件
  • 3. HBase架构
  • 4. HBase数据模型
  • 5. HBase读写流程


1. HBase简介

HBase是一个分布式的、面向列的开源数据库,它是一个适合于非结构化数据存储的数据库。
:上亿行、百万列。
面向列:面向列(簇)的存储和权限控制,列(簇)独立检索。
稀疏:对于为空(null)的列,并不占用存储空间,因此,表的设计的非常的稀疏。

2. HBase的角色

2.1 HMaster

HBase的主节点。HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。

功能:

  1. 监控RegionServer
  2. 处理RegionServer故障转移
  3. 处理元数据的变更
  4. 处理Region的分配或移除
  5. 在空闲时间进行数据的负载均衡
  6. 通过Zookeeper发布自己的位置给客户端
  7. 管理用户对Table的增、删、改、查操作

2.2 HRegionServer

HBase的从节点。HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储。

2.2.1 功能

  1. 负责存储HBase的实际数据
  2. 处理分配给它的Region
  3. 刷新缓存到HDFS
  4. 维护HLog
  5. 执行压缩
  6. 负责处理Region分片

2.2.2 组件

  1. Write-Ahead logs(WAL|Hlog,写前日志)
    HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
    每个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,完成数据恢复。
  2. HRegion
    HBase表的分片,HBase表会根据RowKey值被切分成不同的Region存储在RegionServer中,在一个RegionServer中可以有多个不同的Region。如果表很大,一个表可能对应着多个Region。当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为Regions,一个Region由[startkey,endkey)表示,不同的Region会被Master分配给相应的RegionServer进行管理。
  3. HStore
    HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。一个Store对应HBase表中的一个列簇。
  4. MemStore
    写数据存储的内存(写缓存)。用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
  5. HStoreFile
    HStoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile。
    MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除(如果版本设置的是3,但现在有4个版本,那么在合并的时候,就会把第4个删除。),因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的Compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
  6. HFile
    这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。HBase最小的存储单元,在HBase中,数据是没有数据类型的,全部是二进制的。

3. HBase架构

avro格式 hbase hbase alter_Hadoop

  • RegionServer运行于DataNode上,数量可以与DatNode数量一致。
  • 文件类型
    HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括:
  1. HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile。
  2. HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File。

4. HBase数据模型

avro格式 hbase hbase alter_HDFS_02

  • 确定一个单元格的位置(cell)
    rowkey + Colume Family + Colume + timestamp(版本version)。数据有版本的概念,即一个单元格可能有多个值,但是只有最新得一个对外显示。
  • Row Key
    行键,Table的主键,Table中的记录默认按照Row Key升序排序
  • Timestamp
    时间戳,每次数据操作对应的时间戳,可以看作是数据的version number。
  • Column Family
    列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的Column放在一个Column Family中,这样最高效。

5. HBase读写流程

avro格式 hbase hbase alter_数据_03

写数据流程:

  1. Client也是先访问zookeeper,进而找到.META.表,并获取.META.表信息。
  2. 确定当前将要写入的数据所对应的RegionServer服务器和Region。
  3. Client向该RegionServer服务器发起写入数据请求,然后RegionServer收到请求并响应。
  4. Client先把数据写入到HLog,以防止数据丢失。
  5. 然后将数据写入到MemStore。
  6. 如果HLog和MemStore均写入成功,则这条数据写入成功。在此过程中,如果MemStore达到阈值,会把MemStore中的数据flush到StoreFile中。
  7. 当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的Storefile。当Storefile越来越大,Region也会越来越大,达到阈值后(默认10G),会触发Split操作,将Region一分为二。

尖叫提示:因为内存空间是有限的,所以说溢写过程必定伴随着大量的小文件产生。

读数据流程:

HBase的RegionServer的内存MemStore,block cache。Memstore作业主要是写,另一部分主要是读的。block cache用的是Least Recently Used(LRU),如果block cache达到上限,会启动淘汰机制。

  1. 首先Client先去访问Zookeeper,从Zookeeper里面找到.META.表所在的位置信息,即找到这个.META.表在哪个HRegionServer上保存着。HRegionServer保存着.META.的这样一张表以及表数据。
  2. 接着Client通过刚才获取到的HRegionServer的IP来访问.META.表所在的HRegionServer,从而读取到.META.,进而获取到.META.表中存放的元数据。
  3. Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描(scan)所在
    HRegionServer的MemStore,如果没有,扫描block cache(读数据的缓存),如果还没有去StoreFile来查询数据,查到数据之后将数据读到block cache。
  4. 最后HRegionServer把查询到的数据响应给Client。

其他:

  • 如何查看WAL
    -p 后面是wal在HDFS上的存储路径
    -j json格式
# hbase wal -p /hbase/WALs/bigdata111,16020,1587325987208/bigdata111%2C16020%2C1587325987208.158789072845
  • 将Memstore中的数据刷新到Store File
  • 默认刷新
    ① 用stop-hbase.sh停止的时候会将内存中的数据写入磁盘,所以会发现在停止hbase的时候会很慢。
    ② 达到Memstore刷新阈值
  • 手动刷新
    hbase(main)> flush ‘stu’ 将Memstore中的数据刷新到HDFS。