首页 文章

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

提问于
浏览
8

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

Data from a single column family for a single row need not be stored in the same HFile. 那个's why the row could be too width and it doesn'适合一个HFile?

The only requirement is that within an HFile, data for a row’s column family is stored together. 这对我来说似乎有些矛盾 .

注意:我一直在阅读有关该主题的一些内容 . HBase使用LSM树 . 我有一个rowkey和一个HFile中的所有数据 . 后来,我可以添加一些新数据,它们将存储在内存中,当内存已满时,HBase会将这些数据存储在 new HFile中 . 所以,我可以在两个HFile中为一个rowkey设置限定符 . 如果我想对该rowkey进行get或scan操作,我将创建一个仅加入旧两个HFile的HFile并在压缩后删除它们 . 所以,如果我想查找该rowkey,我只需要一次搜索 . 我对吗??我没有做过小的和重大的压缩,因为他们似乎做了同样的事情 .

3 回答

  • 0

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

    • / table / region-id / column-family1 / [HFiles列表]

    • / table / region-id / column-family2 / [HFiles列表]

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

    Data from a single column family for a single row need not be stored in the same HFile. 所以,这是真的 .

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

  • 10

    是的,这是对的 . 差异是:

    次要压缩旨在最大限度地损害HBase性能,因此所涉及的HF数量存在上限 . 这些是相对轻量级的并且更频繁地发生 . 主要的压缩是HBase清除已删除记录的唯一机会 . 解决删除操作需要删除已删除的记录和删除标记 . 无法保证记录和标记都在同一个HFile中 .

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

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

  • 1

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

相关问题