7

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

这是我所拥有的:

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

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

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

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

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

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

关于我应该如何处理这个问题的任何建议?我正在考虑接下来尝试 HBase 来感受一下。我应该看看 Hive 吗?卡桑德拉?伏地魔?

谢谢!

4

5 回答 5

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|)

于 2011-07-26T22:10:01.117 回答
4

由于您的数据似乎非常同质,我肯定会看看Google BigQuery - 您可以在没有 MapReduce 步骤(您自己)的情况下摄取和分析数据,RESTful API 将帮助您创建一个基于您的查询。事实上,根据您想要设计应用程序的方式,您可以创建一个相当“实时”的应用程序。

于 2012-01-27T04:55:46.483 回答
2

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

于 2011-07-28T19:36:10.817 回答
2

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

于 2011-11-15T22:12:12.557 回答
0

您可能希望为此使用普通的旧数据库。听起来您没有交易系统。因此,您可能只能使用一两张大桌子。当您需要连接大数据时,SQL 会出现问题。但是由于您的数据集听起来不需要加入,所以应该没问题。您可以设置索引以查找数据集,并在 SQL 或应用程序数学中执行。

于 2012-03-15T13:33:46.597 回答