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

Gui*_*lle 8 hbase

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

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

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

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

小智 10

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

  1. / table/region-id/column-family1/[HFiles列表]
  2. / table/region-id/column-family2/[HFiles列表]

这些HFile是不可变的,并且是有序的.在读取时,扫描器(读取数据)确保在读取行键和给定列族的数据时考虑所有HFile.

来自单个列族的单行数据不需要存储在同一个HFile中. 所以,这是事实.

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