HBase不睡觉读书笔记----HBase内部解析(数据模型,如何存储)

本文详细介绍了HBase的数据模型,包括namespace、table、row、column family和cell,以及timestamp。同时,阐述了HBase的存储机制,如region、WAL、Memstore和HFile的角色。HBase的增删改查实际上是通过新增操作实现,删除数据通过墓碑标记并在合并过程中清除。读取数据时,首先查找BlockCache,然后是Memstore和HFile。整个过程涉及到ZooKeeper和hbase:meta表的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,数据模型

  • namespace:多表分到一个组里管理的时候用到。数据库中表 很多的时候才用到
  • Table:由多个列族组成,有数据属性,eg:超时时间TTL,压缩算法(conpression),都在列族中定义,
  • Row:多列组成,by列族分类。
  • Culumn Family:列族是多个列的集合,HBase会把一个列族的列放到同一个服务器上,提高存取性能。
  • 批量管理一堆列,建表定义列族而非列。
  • Cell:列中的每个数据叫做cell,多版本。
  • TimeStamp:版本号

rowkey严格按照字典排序。

表命名空间:

作用:把多个属性相同的业务领域的表分成一个组,一个表可以自由选择是否有命名空间(create 'mynamespace:mytable')

二,HBase是怎么存储数据的?

既然是数据库,肯定某种形式存储在应硬盘上。

2.1宏观架构

hbase集群有一个Master(HA:多个master),多个region server组成,

Master:负责启动时非陪region到regionserver,之心个管理操作,数据的读取写入和它没关系。也不能宕机久,建表,修改列配置,分割合并需要它。

regionserver:上有多个region,读写的数据就在region上,如果基于hdfs,region所有读写操作都调用hdfs的客户端接口。

Region:表的一部分接口,HBase会自动分片的数据库,一个region相当于关系型数据库中分区表的一个分区。

ZK:第三方基础组件,功能:1管理小部分数据2监听功能。ZK作用对于hbase很大。读取数据的元数据表(hbase:meta)的位置就存放在ZK上。

由图我们可以看到RegionServer内部:

  • WAL:预写日志,Write-Ahead Log。即操作region先把操作写到WAL中,hbase会先把数据放到基于内存实现的Memstore,达到一定数量才会刷写(flush)到最终存储的HFile。宕机断电时,WAL就是保险机制,恢复的时候从WAL中恢复数据。
  • 多个Region:region相当于数据分片,存储row某个范围。有其实rowkey和endrowkey

单个region:

  • 多个store:每个store对应一个列族的数据。两个列族的话对应两个store。单个store中又有Memstore和HFile组成。

2.2 预写日志是个啥?

解决断电宕机恢复的,数据到达region先写进wal,在加载到 memstore的,wal时存在hdfs里的。

我们看看store的内部:

 

很显然,有两个重要部分组成:

  • MemStore:内存存储对象,数据写入wal就会放入这里,满了就刷写到HFile

  • HFile:Menstore满了就在hdfs生成新的HFile,数据写里面,这才是数据最终存储的实体啊!

来个小结:WAL是存储在HDFS上的,Memstore是存储在内存中的,HFile又是存储在HDFS上。

数据是先写入WAL,再被放入Memstore,最后被持久化到HFile 中。

数据在写入HFile前都已经存储到HDFS中一次了,为啥还在放入memstore中???

这说明memstore肯定有他很重要的总用!hdfs可不能修改数据啊,按数据存放数据对数据库很重要,这决定了它的性能。所以我们想要存储的数据整理成一定的顺序存放.Memstore存在的意义是维持数据按照rowkey顺序排列,而不是做一个缓 存。

2.3 增删改查的真面目

hbase时最忌读写的,hdfs只能增删不可修改,hbase到底是怎么样进行CRUD的呢??

答案:都是在做新增操作!!!

  • 新增cell时:在hdfs上新增一条数据,这个很好理解。
  • 修改cell:哈哈,它还是新增一天数据,只不过版本号更新。
  • 删除单元格:你没猜错!还是增加一条数据,只不过没有value,类型时delete,这个数据叫:墓碑标记!

那到底啥时候真正去删除呢??

合并(Compaction):多个HFile合并成一个HFile,检测到被标记墓碑的数据忽略,新HFile就没有这条数据了。

数据单元层次图:

  • 一个RegionServer包含多个Region,划分依据:一段rowkey,如果一行数据量超级大,会把这个region根据列族切分到不同机器上。

  • 一个Region包含多个Store,划分:一个列族一个store

  • 一个Store里面有一个memstore多个HFile

三,一个KeyValue的历程

3.1写入

3.2 读出

实际的读取顺序是先从BlockCache中找数据,找不到了再去 Memstore和HFile中查询数据。

二层查询数据流程:

(1)客户端先通过ZooKeeper的/hbase/meta-region-server节点 查询到哪台RegionServer上有hbase:meta表。

(2)客户端连接含有hbase:meta表的RegionServer。hbase:meta 表存储了所有Region的行键范围信息,通过这个表就可以查询出你要取的rowkey属于哪个Region的范围里面,以及这个Region又是属于哪个 RegionServer。

(3)获取这些信息后,客户端就可以直连其中一台拥有你要存取 的rowkey的RegionServer,并直接对其操作。

(4)客户端会把meta信息缓存起来,下次操作就不需要进行以上 加载hbase:meta的步骤了。

 

 

注:以上内容全部来自---《HBase不睡觉书》想了解HBase的其他内容的可以去购买此书,很不错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值