HBase数据的物理存储

本文探讨了HBase如何在HDFS上存储数据,重点介绍了HBase的Key-Value结构、MemStore与StoreFile的有序性,以及如何通过行操作、B+树、Bloom Filter和索引来优化数据存取效率。通过对HBase存储机制的理解,有助于提升数据库产品的设计能力。

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

HBase的数据存储方式对于实现自己的数据库产品有借鉴和指导意义,因此总结一下,以作备忘。

HBase在文件系统中存储数据,而为了使系统具备良好的扩展性和可用性,一般使用HDFS作为该文件系统。

HBase的基本存储单元是Key-Value对,其中Key由行键(Row Key)、列族名称、列修饰符、版本号构成。整个HBase存储系统可以认为是维护了一个大型的Key-Value对集合。理所当然地,我们认为HBase中的基本操作是针对Key-Value对的PUT、GET、DELETE操作。HBase确实支持这些基本操作。但是,在实际的应用中,使用这些基本操作通常不是频繁用例,而更多的用例是以行(Row)为单位进行的PUT、GET、DELETE、SCAN操作。为此,HBase自动完成将一行拆分成多个Key-Value对或将属于同一行的各个Key-Value对封装成一行的工作。

HBase维护的各个Key-Value对的集合总是按Key有序的,这种集合包括磁盘上的StoreFile和内存中的MemStore。MemStore存在于内存,且其中的Key-Value对是动态插入。通过实施按序插入可以保证MemStore总是有序。StoreFile虽然存在于磁盘,但是它们是只读的,在某次需要将MemStore写到磁盘时被创建,以最优B+树(由于数据是现成的,因此可以做到最优)的数据组织方式存储了写到磁盘的MemStore,因此也总是有序的。

对HBase状态的更新总是通过向MemStore中添加新的Key-Value对进行,当然在MemStore满或其他Flush事件出现时,需要将MemStore写到磁盘上的StoreFile中。若是PUT一个Key-Value对,可以将该Key-Value对直接插入MemStore;若是DELETE一个Key-Value对,需要首先为该Key-Value对添加一个指明用于删除的标记,然后将其插入MemStore。由于MemStore是有序的,所有具有相同Key的Key-Value对在MemStore中聚集到一起,因此能够顺序读取。当需要GET具有指定Key的Key-Value对时,所有具有这一指定Key的Key-Value对被读取出来,这不仅需要读取MemStore,在存在StoreFile时可能还需要读取各个StoreFile,然后从读取结果中剔除被删除的版本和GET操作不需要的版本,将剩余的Key-Value对返回。

某个Region的某个列族可能有许多StoreFile,通过在每个StoreFile的头信息中指明在本StoreFile中存储的Key-Value对的最小Key和最大Key,使得对于那些Key值不在最小Key和最大Key范围内的GET操作,可以直接跳过该StoreFile。

HBase还使用了一种称为Bloom Filter的StoreFile过滤技术。如果某个Region的某个列族开启了Bloom Filter,HBase为存储在StoreFile中的每个Key-Value对的Key使用散列函数生成一个散列码,将所有散列码去重后存储在StoreFile中。对于某个GET操作,首先检查其Key的散列码是否在StoreFile中出现,若没有出现,则可以确定在StoreFile中不存在要GET的Key,因此直接跳过StoreFile,否则,在StoreFile中可能存在也可能不存在要GET的Key,需要扫描StoreFile。由于Key-Value对的Key位数较多,而散列码的位数可以选取得很少(例如8位),因此存储散列码比存储Key更节省存储空间,在检索时更高效。

每个StoreFile包含多个数据块,每个数据块存储多个Key-Value对。对于那些Key值在StoreFile的最小Key和最大Key范围内的GET操作,HBase在StoreFile内使用索引块指明在每个数据块中存储的Key-Value对的最小Key和最大Key,使得GET操作可以直接定位要扫描的数据块。而每个数据块是有序的,在扫描数据块时可以执行二分查找算法。

### HBase物理存储单元结构 HBase物理存储单元主要依赖于HDFS(Hadoop Distributed File System)。它的核心设计目标是为了支持大规模数据集的高效读写操作。以下是关于HBase物理存储单元的具体描述: #### 1. **Region** Region 是 HBase 数据分片的基本单位,负责管理一定范围内的 RowKey 数据集合。每个 Region 被分配到一个 RegionServer 上进行管理和维护。当某个 Region 的大小超过预设阈值时,它会被自动拆分为更小的子 Region[^1]。 #### 2. **Store** 每个 Region 包含多个 Store,而每个 Store 对应一个 Column Family。因此,不同的 Column Family 存储在独立的 Store 中,这种分离机制有助于提高性能并优化磁盘 I/O 操作[^4]。 #### 3. **MemStore** MemStore 是内存中的临时存储区域,用于缓存尚未持久化的数据更新操作(Put 或 Delete)。当 MemStore 达到一定的容量上限时,其内容会被刷新到硬盘上形成一个新的 HFile 文件[^3]。 #### 4. **WAL (Write-Ahead Log)** 为了保障数据可靠性,在每次修改请求到达时,先将其记录至 WAL 日志文件中再执行实际变更动作。如果系统发生崩溃或其他异常情况,可以通过重放这些日志恢复丢失的信息[^4]。 #### 5. **HFile** 最终所有的数据都会以 HFile 形式保存在 HDFS 上面。这是一种特定格式二进制大对象文件,内部包含了多层索引以及压缩后的 KeyValue 记录列表。每当 MemStore 刷新或者 Compact 过程完成后就会生成新的 HFile 实例[^3]。 ```python # 示例代码展示如何创建一张简单的HBase表 from happybase import Connection connection = Connection('localhost') tables = connection.tables() if b'test_table' not in tables: families = { 'personal_info': dict(max_versions=1), 'office_info': dict(max_versions=1) } connection.create_table( 'test_table', families, ) ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值