【问题标题】:How does HBase internally manages versions?HBase 内部如何管理版本?
【发布时间】:2024-12-11 05:10:02
【问题描述】:

假设一个值发生了更新,它属于

RowKey 1288,
ColunumFamily cf1
Qualifier  Q1

现在其中一个值已更改,HBase 如何跟踪此更改?

  1. 是否通过更新移动到另一个 HFile,从所有可能的 HFile 中获取 1288 -> Cf1 -> Q1 的所有值和时间戳并响应最新消息。

  2. 更新仅保存在内存存储中?在 Major Compaction 期间,HFile 会使用 mem 存储中的更新日志进行更新?

  3. 还有其他机制吗?

【问题讨论】:

标签: hadoop hbase


【解决方案1】:

在您的示例中,当第一次插入值时,HBase 将存储 。如果将 v1 更新到 v2,HBase 将追加一条新记录 。它在内存商店中。如果 memstore 已满,则会刷新到 HFile。

当你要访问使用时,HBase会通过扫描HFiles来读取所有的版本(准确的说,HFile中的row key range、timestamp、bloomfilter会帮助HBase快速判断是否有一行密钥在某些 HFile 中)。最后,默认情况下,它会返回最新的值给你。此外,您可以要求 HBase 返回更多版本。

如果你想了解HBase中的机制,我建议你阅读关于bigtable的论文。之后可以阅读HBase: The Definitive Guide CHAPTER 8 架构和The Apache HBase™ Reference Guide 第 9 章架构

【讨论】:

  • 所以您的意思是说它的选项 2,更新仅保存在 ** 内存存储中,** 并且在 Major Compaction 期间,HFiles 更新 更新日志内存存储。
  • 一开始会在memstore中。但是当 memstore 满时,它会被刷新到 HFile。 Major Compaction 仅用于将一些小的 HFile 压缩成一个大的 HFile。
  • "但是当memstore满了,它会被刷新到HFile",所以它会被刷新成更小的HFiles ?之后哪个会在 MajorCompaction 期间变大?
  • 是的,它被刷新到一个只包含 memstore 中数据的小 HFile 中。您可以强制 HBase 执行主要压缩以将所有小 HFile 合并为一个大 HFile。在某个时期之后,有一个小的压缩将几个 HFile 组合成一个更大的 HFile。主要压缩和次要压缩之间的另一个区别是主要压缩将删除已经删除的行。
最近更新 更多