如果 HDFS 不允许修改文件,那么 HBase 怎么存储和修改数据呢?很难找到这个问题的答案,因为结果大多面向 HBase 物理数据格式。但是我找不到 HBase 如何解决 HHDFS 文件的不变性问题?
2 回答
HBase 以索引形式将数据存储在 HDFS 中。过于简单化了,HDFS 文件的密钥按排序顺序存储,因此查找特定密钥的速度很快。HBase 数据存储在 RegionServers (RS) 中处理。
在 RS 中,密钥首先被写入内存存储(称为 memstore)。memstore 存储新密钥/更新和删除。在一定的阈值之后,这些键作为新的索引文件被推送到 HDFS。更新由时间戳处理 - 假设最新版本是唯一有效的版本。所以如果之前的索引文件有相同的key,就会被忽略。删除与更新相同,唯一的区别是删除有一个特殊的类型字段,其中有一个标记将键标记为已删除。
我做了一些简化:
- 随着时间的推移,索引文件格式发生了很大变化。最初,它是
MapFile
. 较新版本的 HBase 使用一种名为的格式,该格式HFile
具有特定于 HBase 的元数据和优化。 - 在写入内存存储之前,写入会记录在磁盘上的 WAL(预写日志)上。这是为了防止数据丢失。
我还找到了几篇优秀的相关文章,你应该阅读:
HBase 做了一些事情(以下是一个简化,但它解释了一般思想):为了保持一致性,它会在数据到达时将数据写入 WAL 文件 - 所以那里的数据不会发生任何变化。
“问题”在于以有序方式存储数据的 HFiles。HBase 解决这个问题的第一件事是将数据保存在内存中(每个区域的 memstore),并且只有在它们被填满时才将它们刷新到磁盘。这节省了一些重写。
在保存之前等待只能解决一些问题,仍然存在需要重新排列数据的情况——(例如,重复更新同一个键等)所以 HBase 做的第二件事是压缩,它读取多个 HFile 并使用合并数据(并删除旧文件)