基本概念
hbase使用hdfs存储数据,使用zookeeper进行协调管理
column family(列族)
列族是表的垂直切分
所谓列族就是把列(column)分组,按需查找,为了解决大宽表问题
即不通的列族存储在不同的文件中,可以减少磁盘IO,提高查询效率
列族中的列是动态的,可以随时添加,但是列族是静态的,一旦创建就不能删除
rowKey
rowKey是表的水平切分
每一行有个rowKey,其实就是主键,可以按照rowKey进行分区
即不同的row数据分布在不通的Region
存储结构
上面的基础概念并不很直观,下面通过一个例子来说明hbase的存储结构,为了清晰,会忽略部分细节,并不完全严谨
逻辑结构
假设现在有个用户表,包含两个列族info和address
其中info包含name和age,address包含city和street,此时有三条数据,他们的逻辑结构如下:
rowKey | Column Family: info | Column Family:address |
---|---|---|
1 | name:张三,age:18 | city:北京,street:北京街 |
2 | name:李四,age:19 | city:天津,street:天津街 |
3 | name:王五,age:20 | city:上海,street:上海街 |
物理结构
hbase是KV数据库,一个单元格可以当成一个value,key的组成是rowKey/column family/column/timestamp
timestamp是时间戳,可以用来做版本控制,如果不指定,默认是当前时间戳
继续上一个例子,假设按rowKey按奇偶分区,hbase的物理结构可简单的描述如下:
总结
通过上图可以很直观的看清hbase是如何存储数据的,简单概括如下
- 通过rowKey进行水平分区,将数据存储在不同的Region中
- 在一个Region中,通过column family进行垂直切分,将不同的列族存储在不同的文件中
- 在一个文件中,每个单元格可以看作一行数据,分为key和value,key是单元格的横纵坐标,value是单元格值
第3条实际上是一个单元格的一个版本可以看作一行数据,key除了横纵坐标还有时间戳,所以一个单元格可以有多个版本
事务
hbase是强一致性的
hbase支持事务有限,只支持行级事务,不支持跨行事务
hbase可以使用check and set 进行单行原子操作,即CAS操作
集群
Master节点
负责管理Region服务器(RegionServer), 包括Region的分配、负载均衡等。
不参与具体的读写操作,主要负责元数据管理和集群监控。
支持主备切换(通过Zookeeper实现高可用)。
RegionServer节点
负责实际的数据存储和读写操作。
每个RegionServer管理多个Region,每个Region是一个表的一部分。
RegionServer会定期向Master汇报状态。
Zookeeper
提供分布式协调服务,用于管理集群的状态信息。
存储HBase的元数据(如表结构、Region分布等)。
实现Master的高可用性和Region的动态分配。
HDFS
HBase将数据存储在HDFS中,以保证数据的可靠性和高可用性。
数据以文件的形式存储在HDFS上,每个Region对应一个或多个HDFS文件。
分析
- hbase首先是一个大数据数据库,所以分布式存储,并且支持水平扩展,这些就不用多说了
- hbase是一个KV数据库,所以擅长随机读写,但是不支持复杂查询
- hbase是一个列族数据库,所以擅长大宽表
- hbase是一个强一致性数据库,并支持行级事务
- hbase不需要提前定义列,所以支持动态列,适合存储稀疏数据