Apache HBase™ 是以 hdfs 为数据存储的,一种分布式、可扩展的 NoSQL 数据库。
Bigtable 是一个稀疏的、分布式的、持久的多维排序 map。
该映射由行键、列键和时间戳索引;映射中的每个值都是一个未解释的字节数组
HBase 使用与 Bigtable 非常相似的数据模型。用户将数据行存储在带标签的表中。数 据行具有可排序的键和任意数量的列。该表存储稀疏,因此如果用户喜欢,同一表中的行可 以具有疯狂变化的列。
HBase 数据模型的关键在于稀疏、分布式、多维、排序的映射。其中映射 map 指代非关系型数据库的 key-Value 结构。
什么时候用Hbase?
数据库量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选项,如果只有几百万行甚至不到的数据量,RDBMS是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态
如果你不需要辅助索引,静态类型的列,事务等特性,一个已经用RDBMS的系统想要切换到Hbase,则需要重新设计系统。
保证硬件资源足够,每个HDFS集群在少于5个节点的时候,都不能表现的很好。因为HDFS默认的复制数量是3,再加上一个NameNode。
常见应用场景
- 存储业务数据:车辆GPS信息,司机点位信息,用户操作信息,设备访问信息。。。
- 存储日志数据:架构监控数据(登录日志,中间件访问日志,推送日志,短信邮件发送记录。。。),业务操作日志信息
- 存储业务附件:UDFS系统存储图像,视频,文档等附件信息
一般不使用原生的Hbase API,使用原生的API会导致访问不可监控,影响系统稳定性,以致于版本升级的不可控。
逻辑结构
{
"row_key1":{
"personal_info":{
"name":"zhangsan", "city":"北京", "phone":"131********"
},
"office_info":{
"tel":"010-1111111", "address":"atguigu"
}
},
"row_key11":{
"personal_info":{
"city":"上海", "phone":"132********"
},
"office_info":{
"tel":"010-1111111" 尚硅谷大数据技术之 HBase
}
},
"row_key2":{
......
}
物理结构
物理存储结构即为数据映射关系,而在概念视图的空单元格,底层实际根本不存储。
数据模型
Name Space
类似关系型数据库的 database 概念,每个命名空间下有多个表。
HBase 两 个自带的命名空间,分别是 hbase (存放的是 HBase 内置的表),default(用户默认使用的命名空间)。
Table
类似关系型数据库的表概念。
不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。
因为数据存储时稀疏的,所有往 HBase 写入数据时,字段可以动态、按需 指定。
Row
每行数据都由一个 RowKey 和多个 **Column(列)**组成。
数据按照 RowKey 的字典顺序存储,并且查询数据时只能根据 RowKey 进行检索。
Column
由 Column Family(列族)和 Column Qualifier(列限定符)限定
例如 info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。
Time Stamp
用于标识数据的不同版本(version)
每条数据写入时,系统会自动为其加上该字段, 其值为写入 HBase 的时间。
Cell
{rowkey, column Family:column Qualifier, timestamp} 唯一确定的单元.
由字节码形式存贮。
存储设计
在Hbase中,表被分割成多个更小的块然后分散的存储在不同的服务器上,这些小块叫做Regions,存放Regions的地方叫做RegionServer。
Master进程负责处理不同的RegionServer之间的Region的分发。
在Hbase实现中HRegionServer和HRegion类代表RegionServer和Region。
HRegionServer除了包含一些HRegions之外,还处理两种类型的文件用于数据存储
- HLog, 预写日志文件,也叫做WAL(write-ahead log)
- HFile 真实的数据存储文件
HLog
-
MasterProcWAL:HMaster记录管理操作,比如解决冲突的服务器,表创建和其它DDLs等操作到它的WAL文件中,这个WALs存储在MasterProcWALs目录下,它不像RegionServer的WALs,HMaster的WAL也支持弹性操作,就是如果Master服务器挂了,其它的Master接管的时候继续操作这个文件。
-
WAL记录所有的Hbase数据改变,如果一个RegionServer在MemStore进行FLush的时候挂掉了,WAL可以保证数据的改变被应用到。如果写WAL失败了,那么修改数据的完整操作就是失败的。
- 通常情况,每个RegionServer只有一个WAL实例。在2.0之前,WAL的实现叫做HLog
- WAL位于*/hbase/WALs/*目录下
- MultiWAL: 如果每个RegionServer只有一个WAL,由于HDFS必须是连续的,导致必须写WAL连续的,然后出现性能问题。MultiWAL可以让RegionServer同时写多个WAL并行的,通过HDFS底层的多管道,最终提升总的吞吐量,但是不会提升单个Region的吞吐量。
-
WAL的配置:
// 启用multiwal <property> <name>hbase.wal.provider</name> <value>multiwal</value> </property>
HFile
HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。索引的大小(keys的大小,数据量的大小)影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
探讨数据库的数据存储方式,其实就是探讨数据如何在磁盘上进行有效的组织。因为我们通常以如何高效读取和消费数据为目的,而不是数据存储本身。
Hfile生成方式
起初,HFile中并没有任何Block,数据还存在于MemStore中。
Flush发生时,创建HFile Writer,第一个空的Data Block出现,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。
而后,位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中:
注:如果配置了Data Block Encoding,则会在Append KeyValue的时候进行同步编码,编码后的数据不再是单纯的KeyValue模式。Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制。