实时查询/汇总数百万条记录 - hadoop? HBase的?卡桑德拉?

时间:2011-07-26 17:12:32

标签: nosql hadoop cassandra hbase hive

我有一个可以并行化的解决方案,但我(还)没有使用hadoop / nosql的经验,而且我不确定哪种解决方案最适合我的需求。从理论上讲,如果我有无限的CPU,我的结果应该立即返回。所以,任何帮助将不胜感激。谢谢!

这就是我所拥有的:

  • 1000s数据集
  • 数据集键:
    • 所有数据集都具有相同的键
    • 100万把钥匙(后来可能是10或2千万)
  • 数据集列:
    • 每个数据集具有相同的列
    • 10到20列
    • 大多数列是我们需要聚合的数值(avg,stddev,并使用R来计算统计数据)
    • 几列是“type_id”列,因为在特定查询中我们可以 想要只包含某些type_ids
  • 网络应用程序
    • 用户可以选择他们感兴趣的数据集(15到1000之间)
    • 应用程序需要呈现:每列的密钥和聚合结果(avg,stddev)
  • 数据更新:
    • 可以添加,删除或替换/更新整个数据集
    • 能够添加列很酷。但是,如果需要,可以只替换整个数据集。
    • 从不向数据集添加行/键 - 因此不需要具有大量快速写入的系统
  • 基础设施:
    • 目前有两台每台24核的机器
    • 最终,想要能够在亚马逊上运行这个

我无法预先计算我的聚合值,但由于每个键都是独立的,因此应该可以轻松扩展。目前,我将这些数据放在postgres数据库中,其中每个数据集都在自己的分区中。

  • 分区很好,因为可以轻松添加/删除/替换分区
  • 数据库非常适合基于type_id
  • 的过滤
  • 数据库不容易编写并行查询
  • 数据库适用于结构化数据,而我的数据不是结构化的

作为概念证明,我尝试了hadoop:

  • 为特定type_id
  • 的每个数据集创建了一个制表符分隔文件
  • 上传到hdfs
  • map:检索每个键的值/列
  • 减少:计算的平均值和标准差

从我粗略的概念验证中,我可以看到这将很好地扩展,但我可以看到hadoop / hdfs有延迟我已经读过它通常不用于实时查询(即使我很好在5秒内将结果返回给用户)。

有关我应如何处理的任何建议?我当时正考虑尝试HBase以获得感觉。我应该看看Hive吗?卡桑德拉?伏地魔?

谢谢!

5 个答案:

答案 0 :(得分:6)

Hive或Pig似乎不会帮助你。基本上每个都编译为一个或多个map / reduce作业,因此响应不能在5秒内

HBase可能有效,但您的基础设施有点小,无法获得最佳性能。我不明白为什么你不能预先计算每列的摘要统计数据。你应该查看计算运行平均值,这样你就不必减轻重量。

结帐http://en.wikipedia.org/wiki/Standard_deviation

stddev(X)= sqrt(E [X ^ 2] - (E [X])^ 2)

这意味着你可以通过

获得AB的stddev

SQRT(E [AB ^ 2] - (E [AB])^ 2)。 E [AB ^ 2]是(sum(A ^ 2)+ sum(B ^ 2))/(| A | + | B |)

答案 1 :(得分:4)

由于您的数据似乎非常均匀,我肯定会看一下Google BigQuery - 您可以在没有MapReduce步骤(您自己)的情况下摄取和分析数据,RESTful API将帮助您根据您的查询创建Web应用程序。事实上,根据您希望如何设计应用程序,您可以创建一个相当实时的'应用

答案 2 :(得分:2)

在开源领域没有一个好的解决方案是严重的问题。在商业领域,像greenplum / netezza这样的MPP数据库应该这样做。 理想情况下,你需要谷歌的Dremel(BigQuery背后的引擎)。我们正在开发开源克隆,但需要一些时间...... 无论使用何种引擎,我认为解决方案应该包括将整个数据集保存在内存中 - 它应该让您知道所需的群集大小。

答案 3 :(得分:2)

如果我理解正确,您只需要一次汇总一列 您可以不同方式存储数据以获得更好的结果 在HBase看起来像 今天的设置中每个数据列的表和过滤字段的另一个表(type_ids) 今天设置中每个键的行 - 您可能想要考虑如何将过滤器字段合并到密钥中以进行有效过滤 - 否则您必须进行两阶段读取( 今天设置中每个表的列(即几千列) HBase不介意添加新列,并且在不存储不存在的列的数据的意义上是稀疏的。 当你读到一行时,你会得到所有你可以做的相关值。等等很容易

答案 4 :(得分:0)

您可能希望使用普通的旧数据库。听起来你没有交易系统。因此,您可以只使用一个或两个大表。当您需要连接大数据时,SQL会出现问题。但是,由于你的数据集听起来不像你需要加入,你应该没问题。您可以设置索引以查找数据集,也可以使用SQL或app math。