hbase存储结构(HBase存储架构)

本文目录
HBase存储架构
上图是HBase的存储架构图。
由上图可以知道,客户端是通过Zookeeper找到HMaster,然后再与具体的Hregionserver进行沟通读写数据的。
具体到物理实现,细节包括以下这些:
***隐藏网址***
1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之后,会将 HFile 移到.archive 目录中,然后将之前的 hfile 删除掉,该目录由 HMaster 上的一个定时任务定期去清理。
2、 /hbase/.corrupt
存储HBase损坏的日志文件,一般都是为空的。
3、 /hbase/.hbck
HBase 运维过程中偶尔会遇到元数据不一致的情况,这时候会用到提供的 hbck 工具去修复,修复过程中会使用该目录作为临时过度缓冲。
4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 会在第一次启动之初会给每一台 RegionServer 在.log 下创建一个目录,若客户端如果开启WAL 模式,会先将数据写入一份到.log 下,当 RegionServer crash 或者目录达到一定大小,会开启 replay 模式,类似 MySQL 的 binlog。
5、 /hbase/oldlogs
当.logs 文件夹中的 HLog 没用之后会 move 到.oldlogs 中,HMaster 会定期去清理。
6、 /hbase/.snapshot
hbase若开启了 snapshot 功能之后,对某一个用户表建立一个 snapshot 之后,snapshot 都存储在该目录下,如对表test 做了一个 名为sp_test 的snapshot,就会在/hbase/.snapshot/目录下创建一个sp_test 文件夹,snapshot 之后的所有写入都是记录在这个 snapshot 之上。
7、 /hbase/.tmp
当对表做创建或者删除操作的时候,会将表move 到该 tmp 目录下,然后再去做处理操作。
8、 /hbase/hbase.id
它是一个文件,存储集群唯一的 cluster id 号,是一个 uuid。
9、 /hbase/hbase.version
同样也是一个文件,存储集群的版本号,貌似是加密的,看不到,只能通过web-ui 才能正确显示出来
10、 -ROOT-
该表是一张的HBase表,只是它存储的是.META.表的信息。通过HFile文件的解析脚本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存储的内容,如下所示:
以上可以看出,-ROOT-表记录的.META.表的所在机器是dchbase2,与web界面看到的一致:
11、 .META.
通过以上表能找到.META.表的信息,该表也是一张hbase表,通过以上命令,解析其中一个region:
以上可以看出,adt_app_channel表的数据记录在dchbase3这台reginserver上,也与界面一致,如果有多个region,则会在表名后面加上rowkey的范围:
通过以上描述,只要找到-ROOT-表的信息,就能根据rowkey找到对应的数据,那-ROOT-在哪里找呢?从本文一开始的图中可以知道,就是在zookeeper中找的。进入zookeeper命令行界面:
可以看出-ROOT-表存储在 dchbase3 机器中,对应界面如下:
以上就是HBase客户端根据指定的rowkey从zookeeper开始找到对应的数据的过程。
那在Region下HBase是如何存储数据的呢?
以下就具体操作一张表,查询对应的HFile文件,看HBase的数据存储过程。
在HBase创建一张表 test7,并插入一些数据,如下命令:
查看wal日志,通过 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --dump -p 命令可以解析HLog文件,内容如下:
查看HFile文件,内容如下:
由此可见,HFile文件就是存储HBase的KV对,其中Key的各个字段包含了的信息如下:
由于hbase把cf和column都存储在HFile中,所以在设计的时候,这两个字段应该尽量短,以减少存储空间。
但删除一条记录的时候,HBase会怎么操作呢?执行以下命令:
删除了rowkey为200的记录,查看hdfs,原来的HFile并没有改变,而是生成了一个新的HFile,内容如下:
所以在HBase中,删除一条记录并不是修改HFile里面的内容,而是写新的文件,待HBase做合并的时候,把这些文件合并成一个HFile,用时间比较新的文件覆盖旧的文件。HBase这样做的根本原因是,HDFS不支持修改文件。
hbase定义了以下哪个列系列
一、HBase定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSql数据库
二、HBase数据模型
逻辑上,HBase的数据模型和关系型数据库类似,数据存储在一张表中,有行有列,但HBase的底层物流存储结构(k-v)来看,更像是一个多维度Map。
1、HBase逻辑结构
列族:相当于文件夹,图中name\ctiy\phone表示同一类信息。类似于mysql中宽表的切分
RowKey:行键,
Region:一张表的横向切片,把一张表进行数据切分。类似于mysql中高表的切分。
store: 存储
2、HBase 物理存储
HBase的存储:
表中的每一列的值
hbase中每个store保存的数据属于一个
你问的是hbase中每个store保存的数据属于一个什么吗?这种情况保存的数据属于一个列簇。
根据博客园网资料,hbase底层存储依赖于hdfs,hbase中table在行的方向上分割为多个region,但是region不是hbase物理存储的最小单元,它由一个或者多个store组成,每个store保存一个columnfamily,即列族。
列簇在hbase中是表的一部分,用于组织数据,类似于关系数据库中的表结构。列簇既可以在创建表时指定,也可以在表已经存在时动态添加,在hbase中,列簇的设计对数据的存储和检索效率有很大影响,良好的列簇设计可以提高系统的性能和可靠性。
hbase的三层结构中三层指的是哪三层
hbase的三层结构中三层指的是:
1、第一层为rowKey。
2、第二层为列名,包括列族和列后缀。
3、第三层就是版本也就是时间戳,不仅支持分布式存储,还支持高效随机读写。
hbase的核心数据结构是什么
hbase的核心数据结构为LSM树。
LSM树分为内存部分和磁盘部分。
内存部分是一个维护有序数据集合的数据结构。一般来讲,内存数据结构可以选择平衡二叉树、红黑树、跳跃表(SkipList)等维护有序集的数据结构,由于考虑并发性能,HBase选择了表现更优秀的跳跃表。
磁盘部分是由一个个独立的文件组成,每一个文件又是由一个个数据块组成。对于数据存储在磁盘上的数据库系统来说,磁盘寻道以及数据读取都是非常耗时的操作(简称IO耗时)。为了避免不必要的IO耗时,可以在磁盘中存储一些额外的二进制数据,这些数据用来判断对于给定的key是否有可能存储在这个数据块中,这个数据结构称为布隆过滤器(BloomFilter)。
LSM树介绍:
LSM树是一种磁盘数据的索引结构。LSM树的索引对写入请求更友好。因为无论是何种写入请求,LSM树都会将写入操作处理为一次顺序写,而HDFS擅长的正是顺序写(且HDFS不支持随机写)。
一个LSM树的索引内存部分是一个ConcurrentSkipListMap,Key是rowkey、column family、qualifier、type以及timestamp, Value是字节数组。随着数据不断写入MemStore,一旦内存超过阈值会将数据flush到磁盘,生产HFile;多个小HFile文件会compact成一个大HFile。
为什么hbase当中不要索引
实际上,HBase中也有索引机制,比如可以通过建立二级索引来提高数据的查询效率。但是,HBase中的索引机制与传统的关系型数据库的索引机制有所不同。
传统的关系型数据库索引机制通常使用B树等数据结构来实现,这种索引机制的优点是查询效率较高,缺点是索引数据量大时,维护索引的开销也会随之增加。而HBase中的数据存储是基于列族(column family)和行键(row key)的,HBase的数据存储结构是按行键排序的有序映射表,可以通过行键的前缀匹配来检索数据。因此,在HBase中,使用行键来查询数据的效率很高,而使用列来查询数据的效率相对较低。因此,为了提高查询效率,通常需要在设计HBase数据模型时,合理设置行键和列族,而不是使用传统关系型数据库中常用的各种索引。
另外,如果在HBase中使用过多的索引,会增加存储和维护的成本,可能会对HBase的性能和可伸缩性产生负面影响。因此,在使用HBase时,需要根据实际情况合理使用索引,权衡索引的优劣和使用成本。

更多文章:
孙侨潞电视剧(“小魔仙”孙侨潞猝死后,其邻居同学都爆了哪些料)
2026年10月11日 12:00
form表单制作(为什么制作的form表单会在网页显示中多出一行)
2026年10月11日 09:10
teammate(teammate,company,partner)
2026年10月11日 06:10
javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)
2026年10月11日 04:00
text函数公式(excel中round和text函数的区别是什么)
2026年10月11日 03:50
google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)
2026年10月11日 02:00
websocket整合springboot(Springboot整合Websocket遇到的坑)
2026年10月11日 01:40



