HBase的数据模型
HBase基于HDFS进行底层数据存储,HBase是谷歌内部工具BigTable的一个开源实现,BigTable基于DFS。
HBase是一个稀疏多维的排序的映射表,以下表中涉及的概念:
- 行键 :RowKey 唯一标识符
- 列族
- 列限定符
- 单元格
- 时间戳
表中存储的每一个值都是未经解释的字符串,一行有一个行键和任意多个列。
表支持动态扩展,列族可以动态增加删除,每个列族可以包含多个列族,不同与关系型数据库的静态特性。列族是HBase存储的基本单元,HBase是列式存储,不同的列族会被存储到不同的文件中去。
传统关系型数据库用行列坐标可以确定一个数据,但是在HBase中是用4维坐标,行键,列族,列限定符,时间戳。
表不存在删除记录的说法,HBase会保留旧版本也就是旧记录。
HBase不用像关系型数据库进行范式化去除冗余,HBase存储空间足够大,不用刻意为了节省空间而必须花费时间去做多表连接的操作,这样会降低数据分析的效率。
列式存储面向分析型应用,在诸如性别分析年龄分析场景下,针对某一列的数据还不需要去扫描其他字段列的数据,分析效率高。并且,由于一列数据的数据类型相同,可以带来很高的数据压缩率。
而传统的关系型的行式存储,面向事务型应用有优势。但是不适用于分析型,效率会比较低。
Hbase 的三大核心组件
- 库函数:客户端通过库函数去获得存储的数据
- Master
- Region服务器:一个表被分为多个region,这些region就是由Region服务器进行维护管理。客户端存取数据也是直接和Region接触,不会去Master上存取。(**客户端不依赖于Master来获取数据位置信息)
Region的寻址过程:
HBase维持了一个元数据表,该表只有两列,一列是Region 的Id,第二列是Region服务器的Id。存放元数据的表叫.META.表。
当Region条目多到一定程度,无法存在.META.表时,会建一个-ROOT-表用来存放存储.META.表的region 的位置信息。而-ROOT-不会再分裂。-ROOT-的地址是写死在ZooKeeper文件中的。
一共是三级寻址结构,第一层是Zookeeper文件,第二级是-ROOT-,-ROOT-表只有一个region来存放它。第三级.META.,.META.有多个region来存放它。
在一个Region服务器中,可以存放10-1000个region,这些region公用一个HLog文件。在一个region中包含多个Strore,每个Store代表HBase中的一个列族。这些数据不是直接写到底层HDFS中,而是先存入对应Store中的缓存区MemStore中去,缓冲区满了才刷写入Store中StoreFile中。每一个StoreFile都是通过HDFS的HFile去存储的。
用户读写过程
写:先写MemStore缓存,同时日志HLog,HLOG是预写式日志,为了保证数据安全和方便恢复。只有当日志中数据刷入磁盘才能返回响应给用户。
读:先去读缓存中数据,因为缓存中数据是最新的。缓存找不到才去磁盘文件StoreFile中去找。