用于实时分析解决方案的HBase架构/密钥

时间:2012-05-29 21:27:20

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

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

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

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

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

timestamp, client_ip, url, referrer, useragent

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

  • date,operating_system,browser
  • date,url,referrer
  • 日期,网址,国家/地区

(我们的map-reduce作业从用户代理和client_ip数据中获取operating_system,browser和country字段。)

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

  • 按日期操作系统(“此日期范围内有多少iPad用户?”)
  • 按国家/地区和日期列出的网址(“上个月来自此国家/地区的网址数量是多少?”)

和基本上任何其他自定义查询?

我们应该使用这样的键:

  • date_os_browser
  • date_url_referrer
  • date_url_country

如果是的话,我们可以完成上面指定的那种查询吗?

1 个答案:

答案 0 :(得分:7)

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

关于使用日期启动密钥,您会得到的一个常见说明是,它会导致“热点”问题;这个问题的本质是,时间连续的日期范围也将是连续的服务器,因此如果你总是插入和查询“现在”(或“最近”)发生的数据,一台服务器将获得所有负载而其他人则闲着。这听起来不像是插入时的一个大问题,因为你将专门批量加载,但它可能是一个读取问题;如果您的所有查询都发送到您的20台服务器之一,那么您的有效容量将达到5%。

OpenTSDB通过在日期之前添加一个3字节的“度量标识”来解决这个问题,并且适用于在整个集群中喷洒更新。如果你有类似的东西,并且你知道你总是(或通常)在大多数查询中包含一个过滤器,你可以使用它。或者你可以在日期的某些高阶部分(比如“月”)之前添加哈希值,然后至少你的读数会更加分散。