数据模型
1.Name Space
命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。HBase两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间
2.Table
Table类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景
3.Row
HBase表中的每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要
4.Column
HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,例如info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义
5.Time Stamp
用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间
6.Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮
HBase基本架构
![]()
架构角色
1.Region Server
Region Server为 Region的管理者,其实现类为HRegionServer,主要作用如下:
对于数据的操作:get, put, delete;
对于Region的操作:splitRegion、compactRegion
2.Master
Master是所有Region Server的管理者,其实现类为HMaster,主要作用如下:
对于表的操作:create, delete, alter
对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移
3.Zookeeper
HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作
4.HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持
RegionServer架构
![]()
1.StoreFile
memStore内存中的数据写到文件后就是StoreFile(即memstore的每次flush操作都会生成一个新的StoreFile),
Store底层是以HFile的格式保存。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的
2.MemStore
memStore是放在内存里的。保存修改的数据即keyValues。当memStore的大小到一个阈值(默认64M)时,memStore会被flush到文件,即生成一个快照。目前hbase会有一个线程来负责memStore的flush操作
也就是写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile。
3.WAL
由于数据要经MemStore排序后才能刷写到HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入MemStore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
4.BlockCache
读缓存,每次查询出的数据会缓存在BlockCache中,方便下次查询
Region/Store/StoreFile/Hfile之间的关系
1.Region
rable在行的方向上分隔为多个Region。Region是Hbase中分布式存储和负载均衡的最小单元。即不同的region可以分在不同的Region Server上,但同一个Region是不会拆分到多个Server上。
Region按大小分隔,表中每一行只能属于一个region。随着数据不断插入表,region不断增大,当region的某个列族到一个阈值(默认256M)时就会分成两个新的region
2.Store
每一个region有一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个ColumnFamily建一个store(即有几个ColumnFamily,也就有几个Stroe),一个Stroe由一个memStore和0或多个StoreFile组成
Hbase以store的大小来判断是否需要切分region
3.MemStore
memStore是放在内存里的。保存修改的数据即keyValues。当memStore的大小到一个阈值(默认64M)时,memStore会被flush到文件,即生成一个快照。目前hbase会有一个线程来负责memStore的flush操作
也就是写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile。
4.StoreFile
memStore内存中的数据写到文件后就是StoreFile(即memstore的每次flush操作都会生成一个新的StoreFile),
Store底层是以HFile的格式保存。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的
5.HFile
HFile是HBasezhongKeyValue数据的存储格式,是hadoop的二进制格式文件。一个StoreFile对应着一个HFile。而HFile是存储在HDFS之上的。HFile文件格式是基于Google Bigtable中的SSTable。首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和Fileinfo。Trailer中指针指向其他数据块的起始点,Fileinfo记录了文件的一些meta信息