【问题标题】:HBase schema/key for real-time analytics solution用于实时分析解决方案的 HBase 模式/键
【发布时间】:2012-05-29 21:27:19
【问题描述】:

我们正在考虑使用 HBase 进行实时分析。

在 HBase 之前,我们将在我们的日志文件上运行 Hadoop Map Reduce 作业并聚合数据,并将细粒度的聚合结果存储在 HBase 中,以便对聚合数据进行实时分析和查询。因此,HBase 表将具有预先聚合的数据(按日​​期)。

我的问题是:如何最好地设计 HBase 数据库的架构和主键设计,以实现快速但灵活的查询。

例如,假设我们在数据库中存储以下行:

timestamp, client_ip, url, referrer, useragent

假设我们的 map-reduce 作业产生三个不同的输出字段,我们希望将每个输出字段存储在一个单独的“表”(HBase 列族)中:

  • 日期、操作系统、浏览器
  • 日期、网址、推荐人
  • 日期、网址、国家/地区

(我们的 map-reduce 作业从用户代理和 client_ip 数据中获取操作系统、浏览器和国家/地区字段。)

我的问题是:我们如何构建 HBase 架构以允许对这些字段中的任何一个或组合进行快速、近实时和灵活的查找?例如,用户必须能够指定:

  • operating_system by date(“此日期范围内有多少 iPad 用户?”)
  • 按国家和日期列出的网址(“上个月有多少用户从该国家/地区访问此网址?”)

基本上还有其他自定义查询?

我们应该使用这样的键吗:

  • date_os_browser
  • date_url_referrer
  • date_url_country

如果是这样,我们可以完成上面指定的查询吗?

【问题讨论】:

    标签: hadoop primary-key analytics hbase schema-design


    【解决方案1】:

    你已经掌握了它的要点,是的。您的两个示例查询都按日期过滤,这是该域中自然的“主要”维度(事件报告)。

    关于以日期开头的密钥的一个常见注意事项是,它会导致“热点”问题;该问题的本质是,时间上连续的日期范围也将是连续的服务器,因此如果您总是插入和查询“现在”(或“最近”)发生的数据,一台服务器将获得所有负载而其他人则无所事事。这听起来不像是插入的大问题,因为您将专门进行批量加载,但读取时可能会出现问题;如果您的所有查询都发送到您的 20 台服务器中的一台,那么您的容量实际上将达到 5%。

    OpenTSDB 通过在日期前添加一个 3 字节的“metric id”来解决这个问题,这可以很好地在整个集群中喷射更新。如果你有类似的东西,并且你知道你总是(或通常)在大多数查询中包含一个过滤器,你可以使用它。或者,您可以在日期的某个高阶部分(例如“月份”)前面加上哈希,然后至少您的读取会更加分散。

    【讨论】:

    • 非常感谢您的回答。我将如何进行诸如“此日期范围内有多少 iPad 用户”之类的查询 - 我是否需要进行范围扫描和应用程序级聚合?
    猜你喜欢
    • 2011-06-23
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多