【赵渝强老师】HBase的物理存储结构

简介: 本文介绍了HBase的存储结构,包括逻辑与物理存储结构。物理存储主要涉及StoreFile、HFile和HLog日志。HFile是HBase数据存储的核心格式,包含Data块、Meta块、File Info块等六部分,支持压缩以优化存储。HLog(预写日志)记录数据变更,确保数据可靠性,并在Region Server故障时用于恢复。最后,文章详细描述了HBase的写数据流程:先写入WAL日志,再写入MemStore,最终通过Flush操作将数据持久化到HFile中。

副本_副本_副本_副本_副本_副本_副本_副本_副本_副本_副本_副本_Oracle-课程封面__2025-05-29+20_25_27.png

HBase的存储结构分为逻辑存储结构与物理存储结构,并且HBase通过逻辑存储结构来管理物理存储结构。而最终物理存储对应的文件又是存储在HDFS之上。而HBase的物理存储结构主要包括StoreFile、HFile和HLog日志。视频讲解如下:


一、 数据文件HFile


HBase会定时刷新MemStore中的数据从而生成StoreFile。Store File底层又是以HFile的格式保存在HDFS上。因此从根本上说,HBase的物理存储结构指的是HFile。视频讲解如下:


通过下面的方式可以查看员工表emp所对应的HFile。


(1)执行HDFS命令查看表emp对应的HDFS目录。

hdfs dfs -lsr /hbase/data/default/emp
# 输出的信息如下:
/hbase/data/default/emp/.tabledesc
/hbase/data/default/emp/.tabledesc/.tableinfo.0000000001
/hbase/data/default/emp/.tmp
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/.regioninfo
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/info
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/info/da157b802d4f41849363fda1956926bd
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/money
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/money/ba4e83b1887144d588f71cfec7a437c3


(2)可以emp表上info列族的数据信息。

hbase hfile -p -f \
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/info/da157b802d4f41849363fda1956926bd
# 输出的信息如下:
K: 7369/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 20
K: 7369/info:ename/1649559894497/Put/vlen=5/seqid=4 V: SMITH
K: 7369/info:hiredate/1649559894497/Put/vlen=10/seqid=4 V: 1980/12/17
K: 7369/info:job/1649559894497/Put/vlen=5/seqid=4 V: CLERK
K: 7369/info:mgr/1649559894497/Put/vlen=4/seqid=4 V: 7902
K: 7499/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 30
K: 7499/info:ename/1649559894497/Put/vlen=5/seqid=4 V: ALLEN
K: 7499/info:hiredate/1649559894497/Put/vlen=9/seqid=4 V: 1981/2/20
K: 7499/info:job/1649559894497/Put/vlen=8/seqid=4 V: SALESMAN
K: 7499/info:mgr/1649559894497/Put/vlen=4/seqid=4 V: 7698
K: 7521/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 30
K: 7521/info:ename/1649559894497/Put/vlen=4/seqid=4 V: WARD
K: 7521/info:hiredate/1649559894497/Put/vlen=9/seqid=4 V: 1981/2/22
K: 7521/info:job/1649559894497/Put/vlen=8/seqid=4 V: SALESMAN
K: 7521/info:mgr/1649559894497/Put/vlen=4/seqid=4 V: 7698
K: 7566/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 20
K: 7566/info:ename/1649559894497/Put/vlen=5/seqid=4 V: JONES
K: 7566/info:hiredate/1649559894497/Put/vlen=8/seqid=4 V: 1981/4/2
......


从上面输出的信息可以看出,HFile是一个Key-Value格式的数据存储文件,并最终以二进制的形式存储在了HDFS上。一个Store File对应着一个HFile。HFile的格式如下图所示。

image.png


从HFile的格式可以看出,HFile分为了以下六个部分:


  • Data块:该块保存了表中的数据,并且这部分可以被压缩以节约HFile所占用的存储空间。
  • Meta块:该块保存了用户自定义的Key-Value数据。与Data块一样也可以被压缩,但区别是Meta块不是必须存在。
  • File Info块:HBase使用File Info块来存储HFile的元信息,且这一部分的元信息是不能被压缩的。HBase也允许用户利用File Info块来存储自定义的元信息数据。
  • Data Index块:该块包含了Data块的索引信息。Data块中的每一条索引信息都会被记录到Data Index块的Key中。
  • Meta Index块:该块包含了Meta块的索引信息。
  • Trailer块:Trailer块保存了一个块的偏移量的地址,这里的块包括:Data块、Meta块 、File Info块、Data Index块和Meta Index块。读取一个HFile的数据时,HBase会首先读取Trailer中的信息以确定每一个块的位置。


提示:HFile文件是不定长的,其中长度固定的只有其中的两块:Trailer和File Info。其中Trailer中有指针指向其他数据块的起始点;而File Info记录了HFile文件的一些元信息。在Data Index和Meta 块中则记录了每个数据块和元数据块的起始位置。另外,HFile的Data块和Meta块通常采用压缩方式存储,压缩之后可以大大减少网络I/O和磁盘I/O,随之而来的开销则是需要花费CPU进行压缩和解压缩。


二、 预写日志文件HLog


HBase采用预写日志的方式写入数据。预写日志意为Write Ahead Log,简称WAL。它类似Oracle数据库中的Redo log或者MySQL中的Binlog。HBase会将WAL日志保存到HLog日志文件中,Hlog文件将记录数据的所有变更。一旦数据丢失或者损坏,HBase就可以从HLog中进行恢复。视频讲解如下:


提示:HLog与Region Server相对应,即:每个Region Server只维护一个HLog。换句话说,同一个Region Server上的Region会使用同一个HLog。这样不同Region的WAL日志会混在一起。这样做的优点是可以减少磁盘寻址次数,从而可以提高对表的写性能;但是缺点是如果一台Region Server出现故障宕机并下线,为了在其他Region Server上执行恢复则需要要HLog进行拆分,然后分发到其它Region Server上进行恢复,这将增加HBase恢复时的复杂度。


在默认情况下,HLog都被保存到了HDFS的/hbase/WALs/下;而在HDFS的/hbase/oldWALs目录下保存的是已经过期的WAL日志。既然HLog保存了HDFS上,因此可以直接使用相关的命令来查看它。操作命令如下:


(1)使用HDFS命令查看目录/hbase/WALs/。

hdfs dfs -lsr /hbase/WALs/
# 输出的信息如下:
drwxr-xr-x ......
/hbase/WALs/localhost,16020,1649679358560
-rw-r--r-- ......
/hbase/WALs/localhost,16020,1649679358560/localhost%2C16020%2C1649679358560.1649682968518
-rw-r--r-- ......
/hbase/WALs/localhost,16020,1649679358560/localhost%2C16020%2C1649679358560.meta.1649682968557.meta


(2)使用HBase提供的命令查看HLog日志的内容。

hbase wal -j \
/hbase/WALs/localhost,16020,1649679358560/localhost%2C16020%2C1649679358560.1649682968518
# 输出的信息如下:
......
position: 600, {
  "sequence": "4",
  "region": "d6def4cd3110ca597ad6057936e2b898",
  "actions": [{
    "qualifier": "ename",
    "vlen": 4,
    "row": "7839",
    "family": "info",
    "value": "KING",
    "timestamp": "1649684058161",
    "total_size_sum": "88"
  }],
  "table": {
    "name": [101, 109, 112],
    "nameAsString": "emp",
    "namespace": [100, 101, 102, 97, 117, 108, 116],
    "namespaceAsString": "default",
    "qualifier": [101, 109, 112],
    "qualifierAsString": "emp",
    "systemTable": false,
    "hashCode": 100552
  }
}
edit heap size: 128
......

提示:从HLog日志中的action可以看出,客户端往列族info的ename列上插入了一个数据,即:KING。


三、 HBase写数据流程


在了解到了HBase的数据文件和预写日志文件后,便可以讨论HBase写数据的流程。与Oracle和MySQL类似,HBase在写入数据的时候也是先写入日志。只要预写日志WAL写入成功,客户端写入数据就成功,如下图所示。

image.png


当HBase的客户端发出一个写操作请求时,也就是执行put操作,HBase进行处理的第一步是将数据写入HBase的WAL中。WAL文件是顺序写入的,也就是所有新写入的日志会被写到WAL文件的末尾。当日志被成功写入WAL后,HBase将数据写入MemStore。如果此时MemStore出现了问题,写入的数据是会丢失的。这时候WAL就可以被用来恢复尚未写入HBase中的数据。当MemStore中的数据达到一定的量级后,HBase会执行Flush的操作将内存中的数据一次性地写入HFile中。视频讲解如下:


提示:当HBase执行Flush操作将内存中的数据写入HFile数据文件后,便可以清空WAL的预写日志。但是在生产环境中,一般建议保留所有的WAL日志。这样做的目的就是为了当HFile数据文件丢失或者损坏后,可以使用WAL日志来进行数据的恢复。


相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
存储 缓存 分布式数据库
【赵渝强老师】HBase的体系架构
HBase是一种基于BigTable思想的列式存储NoSQL数据库,适合数据分析与处理。其主从架构包含HBase HMaster、Region Server和ZooKeeper。HMaster负责Region分配及表管理;Region Server执行数据读写操作,并包含WAL预写日志、Block Cache读缓存和MemStore写缓存;ZooKeeper维护集群状态并协调分布式系统工作。通过视频讲解与架构图示,详细解析各组件功能与协作机制。
110 11
|
2月前
|
存储 关系型数据库 分布式数据库
【赵渝强老师】HBase的逻辑存储结构
HBase的逻辑存储结构包括命名空间、表和列族。命名空间类似关系型数据库中的数据库,用于逻辑划分和隔离数据;表以RowKey组织数据并按字典序排列,分为多个Region实现分布式存储;列族包含列且无需预先定义,由MemStore缓存写入数据,定期刷新生成Store File。文章通过视频和代码示例详细讲解了各部分的操作与功能。
|
9月前
|
存储 监控 分布式数据库
百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现
本文介绍了百亿级数据存储架构的设计与实现,重点探讨了ElasticSearch和HBase的结合使用。通过ElasticSearch实现快速检索,HBase实现海量数据存储,解决了大规模数据的高效存储与查询问题。文章详细讲解了数据统一接入、元数据管理、数据一致性及平台监控等关键模块的设计思路和技术细节,帮助读者理解和掌握构建高性能数据存储系统的方法。
百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现
|
8月前
|
存储 缓存 监控
【赵渝强老师】HBase的体系架构
本文介绍了HBase的体系架构,包括HMaster、RegionServer和ZooKeeper的主要功能。HMaster负责Region的分配和管理,RegionServer处理数据的读写操作,ZooKeeper维护集群状态并协调分布式系统的运行。文章还详细解释了Region、WAL预写日志、Block Cache读缓存和MemStore写缓存的作用。
380 0
|
8月前
|
NoSQL 关系型数据库 分布式数据库
【赵渝强老师】HBase的表结构
本文介绍了Google的BigTable思想及其对HBase的影响。BigTable将所有数据存入一张表中以提高查询性能,而HBase作为其具体实现,采用列式存储,适合数据分析和处理。文章通过示例说明了HBase的表结构和数据插入方法,并提供了相关代码和图示。
307 0
|
2月前
|
分布式计算 Ubuntu Hadoop
Ubuntu22.04下搭建Hadoop3.3.6+Hbase2.5.6+Phoenix5.1.3开发环境的指南
呈上,这些步骤如诗如画,但有效且动人。仿佛一个画家在画布上描绘出一幅完美的画面,这就是你的开发环境。接下来,尽情去创造吧,祝编程愉快!
102 19
|
10月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
202 4
|
9月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
176 4
|
9月前
|
SQL 分布式计算 Hadoop
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
95 3
|
9月前
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
128 3