宽表数据库之Hbase

基本概念

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的物理结构可简单的描述如下:


image.png

总结

通过上图可以很直观的看清hbase是如何存储数据的,简单概括如下

  1. 通过rowKey进行水平分区,将数据存储在不同的Region中
  2. 在一个Region中,通过column family进行垂直切分,将不同的列族存储在不同的文件中
  3. 在一个文件中,每个单元格可以看作一行数据,分为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文件。

分析

  1. hbase首先是一个大数据数据库,所以分布式存储,并且支持水平扩展,这些就不用多说了
  2. hbase是一个KV数据库,所以擅长随机读写,但是不支持复杂查询
  3. hbase是一个列族数据库,所以擅长大宽表
  4. hbase是一个强一致性数据库,并支持行级事务
  5. hbase不需要提前定义列,所以支持动态列,适合存储稀疏数据
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容