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

时间:2014-03-29 14:13:42

标签: hbase

如果你有一个列族,rowkey的所有列都在同一个HFile中?来自rowkey和同一列族的数据可以混合在不同的HFile中吗?这是因为我认为它们已经分类了,但我读了一本书:

单行列的单行数据不需要存储在同一个HFile中。这就是为什么行可能太宽而且不适合单个HFile?

唯一的要求是在HFile中,行列系列的数据存储在一起。这对我来说似乎有些矛盾。

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

3 个答案:

答案 0 :(得分:10)

列族是HFiles的集合。如果查看表的目录结构,它看起来像这样:

  1. / table / region-id / column-family1 / [HFiles列表]
  2. / table / region-id / column-family2 / [HFiles列表]
  3. 这些HFile是不可变的,并且是有序的。在读取时,扫描器(读取数据)确保在读取行键和给定列族的数据时考虑所有HFile。

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

    第二个粗体声明,它可以来自HFile中的数据被排序的事实,因此在给定的HFile中,与行键相关的数据被存储在一起。

答案 1 :(得分:1)

是的,这是对的。区别在于:

轻微压缩旨在最大程度地损害HBase性能, 所以涉及的HF数量有一个上限。这些相对轻量级并且更频繁地发生。 主要的压缩是HBase清除已删除记录的唯一机会。解决删除需要删除 已删除的记录和删除标记。两者都无法保证 记录和标记属于同一个HFile。

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

次要压缩和主要压缩之间存在另一个区别:主要压缩处理删除标记,最大版本等,而轻微压缩则不会。

答案 2 :(得分:0)

列族存储在单独的HFile中。 因此每个列族都有自己独立的HFile。 这也意味着行密钥将在那些不同的HFile中重复,因此正式建议保持尽可能少的cf(每桌<= 3)。