【问题标题】:Hbase schema design suggestionHbase 架构设计建议
【发布时间】:2012-02-14 05:05:13
【问题描述】:

来自 RDBMS 背景,我需要很少的帮助/建议来为以下用例设计 Hbase 架构。

它是一个使用 hadoop 生成报告的应用程序。现在,我们需要根据特定用户的电子邮件 ID 跟踪所有以前的报告生成历史。因此,需要持久化的数据是电子邮件 ID、报告名称、开始日期、结束日期、状态。我打算将电子邮件 ID 保留为行键,将其他实体保留为列, emailId(row key) - (columns) appName:reportName, appName:startDate, appName:endDate, appName:status

但问题是,同一用户可以针对不同的日期范围运行相同的报告。因此它将覆盖 appName:reportName 和 appName:status 列。由于我是 NoSQL 世界的新手,我不确定如何解决这个问题。 有人可以建议我为这个要求设计架构的理想方法吗?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 对于 HBase,您计划用于查询数据的模式通常比存储的特定数据更重要。您是否打算按用户 ID 查询?通过报告 ID?两个都?此外,您似乎需要存储用户运行报告时的时间戳,对吧?
  • 我打算按用户ID查询。会正确吗?或者哪一个是最好的方法?我愿意接受任何建议。是的,我还需要存储时间戳。谢谢。

标签: nosql schema hbase


【解决方案1】:

根据您预期的查询模式,以下是我的建议:

RowKey                                 | Column Family (appName)                   |
userid@domain.com-YYYY-MM-DD HH:MM:SSS | reportName | status | startDate | endDate |

这种设计为您提供了一些优势。首先,您可以快速查询(使用扫描)特定用户在特定日期范围内的所有行。其次,您可以通过在行键中的时间戳前面加上用户 ID 来避免写入热点。

您可以在每次用户触发生成报告时向此架构写入一行,并且您无需担心会覆盖列(除非用户在相同的 1/10 秒内生成两个报告)。

【讨论】: