【问题标题】:Hadoop Hbase: Spreading column families across tables or notHadoop Hbase:是否跨表传播列族
【发布时间】:2010-10-15 09:57:41
【问题描述】:

Hbase 文档明确指出您应该将相似的列分组到列族中,因为物理存储是由列族完成的。

但是,将两个列族放入同一个表中,而不是每个列组有单独的表,这意味着什么?是否存在以这种方式“分区”表更有意义的特定情况,以及一个“宽”表效果更好的情况?

单独的表应该产生单独的“行区域”,当某些列族(作为一个整体)非常稀疏时,这可能是有益的。相反,什么时候将列族聚集在一起更有优势?

【问题讨论】:

    标签: database-design hadoop hbase


    【解决方案1】:

    您已经对列族有了正确的想法:基本上,它只是提示 HBase 将这些项目存储和复制在一起以便更快地访问。

    如果您将两个列族放在同一个表中,并且始终使用不同的键来访问它们,那么这实际上与将它们放在两个单独的表中是一回事。只有在同一个表中拥有两个通过相同键访问的列族才能获得收益。

    例如:如果我有给定网站的总浏览量、同一网站的唯一浏览量、用户用于查看该网站的浏览器以及他们的互联网连接的列,我可以决定我希望前两个成为列族,后两个成为另一个列族。在这里,所有四个都通过相同的键访问,即所讨论的网站,所以我通过将它们放在同一个表中获得了收益。

    如果它们位于不同的表中,我最终将不得不对这两个表执行类似连接的操作。我真的不知道这些数字,所以我不能真正告诉你类似连接的操作有多慢(因为我不记得 HBase 有一个连接,因为它是非关系的),以及分裂的临界点是什么将它们放在单独的表中比将它们放在同一个表中(反之亦然)更重要。

    当然,这完全取决于您要存储的数据,因此,如果您永远不需要跨表连接,您可能希望将它们保存在单独的表中,因为您可能会争辩说它们没有那么相关一开始就互相认识。

    【讨论】:

    • 你说“加入很贵”。这似乎意味着同一个表中的列组之间的“连接”比跨表的列组连接更便宜。是这样吗?我认为 HBase 文档并没有说清楚。
    • 我认为在同一个表中的列之间进行“连接”要便宜得多,因为它只是一个“获取”操作,命名了两个列并且是查询语言中的原语。然而,'Join' 不是一个原语,您需要自己实现它(这需要更多操作)。
    【解决方案2】:

    列族是面向行访问与面向列访问之间的折衷方案。为了扩展 Chris 的网页示例,行访问将获取单个网站的所有数据(列)。一个面向列的操作的例子是对所有网站的页面浏览量求和。

    后一种操作不需要浏览器和连接详细信息,这些详细信息远大于查看次数的数值,会显着影响查询性能。因此,HBase 提供了列族作为支持列操作的优化。

    至于这些列是否应该在同一个表中...如果它们是同一实体的属性,我将遵循正常的数据建模准则并将所有列放在同一个表中。列族是关于性能而不是架构。

    【讨论】:

    • “列族是关于性能而不是模式。”直到你刚刚说出来,我才明白这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2017-06-12
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多