Hbase和HFiles。它如何存储columns族?

Hbase和HFiles。它如何存储columns族?,hbase,Hbase,如果您有一个列族,那么rowkey的所有列都在同一个HFile中?来自行键和同一列族的数据是否可以混合在不同的HFiles中?。这是因为我认为它们是分类的,但我在一本书中读到: 单行的单列族数据不需要存储在同一个HFile中。这就是为什么该行可能太宽,而不能存储在单个HFile中的原因 唯一的要求是在HFile中,行的列族的数据存储在一起。我觉得这有点矛盾 注: 我一直在读一些关于这个话题的书。HBase使用LSM树。 我有一个rowkey,所有数据都在一个HFile中。稍后,我可以添加一些新数

如果您有一个列族,那么rowkey的所有列都在同一个HFile中?来自行键和同一列族的数据是否可以混合在不同的HFiles中?。这是因为我认为它们是分类的,但我在一本书中读到:

单行的单列族数据不需要存储在同一个HFile中。这就是为什么该行可能太宽,而不能存储在单个HFile中的原因

唯一的要求是在HFile中,行的列族的数据存储在一起。我觉得这有点矛盾

注: 我一直在读一些关于这个话题的书。HBase使用LSM树。 我有一个rowkey,所有数据都在一个HFile中。稍后,我可以添加一些新数据,它们将存储在内存中,当内存已满时,HBase将这些数据存储在newHFile中。因此,我可以在两个HFile中为一个rowkey设置限定符。如果我想对该行键执行获取或扫描操作,我必须在两个文件中查找。
随着时间的推移,HBase将执行一次主要的压缩,它将创建一个连接旧的两个HFile的唯一HFile,并在压缩后删除它们。因此,如果我想查找该行键,我只需要一次搜索。我说的对吗??我不明白为什么会有次要压缩和主要压缩,因为它们似乎都是这样做的。

列族是HFiles的集合。如果查看表的目录结构,它如下所示:

  • /表/区域id/列-family1/[文件列表]
  • /表/区域id/列-family2/[文件列表]
  • 这些文件是不可变的,并且经过排序。读取时,扫描仪(读取数据)确保在读取行键和给定列族的数据时考虑所有HFiles

    单行的单列族数据无需存储在同一个HFile中。 所以,这是真的


    第二个粗体语句是,它可能源于HFile中的数据是经过排序的,因此在给定的HFile中,与行键相关的数据存储在一起。

    是的,这是正确的。不同之处在于:

    较小的压缩旨在将对HBase性能的影响降至最低, 因此,涉及的HFiles数量有一个上限。这些都是相对轻量级的,发生的频率更高。 大型压缩是HBase清理已删除记录的唯一机会。解析删除需要删除 删除的记录和删除标记。不能保证两个 记录和标记在同一个文件中

    此外,每次刷新memstore时都会触发较小的压缩,并合并一些存储文件。 而主要压缩大约每24小时运行一次,并将所有存储文件合并为一个文件。24小时调整为随机余量高达20%,以避免同时发生许多重大压实。还可以通过API或shell手动触发主要压缩


    次要压缩和主要压缩之间还有另一个区别:主要压缩处理删除标记、最大版本等,而次要压缩不处理。列族存储在单独的HFiles中。 因此,每个柱族都有自己单独的HFile。 这也意味着行键将在这些不同的HFile中复制,因此正式建议尽可能减少cf(