Nosql 实时查询/聚合数百万条记录-hadoop?hbase?卡桑德拉?

Nosql 实时查询/聚合数百万条记录-hadoop?hbase?卡桑德拉?,nosql,hadoop,cassandra,hbase,hive,Nosql,Hadoop,Cassandra,Hbase,Hive,我有一个可以并行化的解决方案,但我(还)没有hadoop/nosql的经验,我不确定哪种解决方案最适合我的需要。理论上,如果我有无限的CPU,我的结果应该立即返回。因此,任何帮助都将不胜感激。谢谢 以下是我所拥有的: 1000个数据集 数据集键: 所有数据集都有相同的键 100万把钥匙(以后可能是1000万或2000万把) 数据集列: 每个数据集都有相同的列 10至20列 大多数列都是我们需要对其进行聚合的数值(avg、stddev,并使用R计算统计数据) 一些列是“type_id”列,

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

以下是我所拥有的:

  • 1000个数据集
  • 数据集键:
    • 所有数据集都有相同的键
    • 100万把钥匙(以后可能是1000万或2000万把)
  • 数据集列:
    • 每个数据集都有相同的列
    • 10至20列
    • 大多数列都是我们需要对其进行聚合的数值(avg、stddev,并使用R计算统计数据)
    • 一些列是“type_id”列,因为在特定查询中我们可能 只想包括某些类型的ID
  • web应用程序
    • 用户可以选择他们感兴趣的数据集(15到1000)
    • 应用程序需要显示:键和每个列的聚合结果(平均值、stddev)
  • 数据更新:
    • 可以添加、删除或替换/更新整个数据集
    • 能够添加列会很酷。但是,如果需要,可以替换整个数据集
    • 永远不要向数据集添加行/键-因此不需要具有大量快速写入的系统
  • 基础设施:
    • 目前有两台机器,每台24芯
    • 最终,我们希望能够在amazon上运行此功能
我无法预计算聚合值,但由于每个键都是独立的,因此应该很容易扩展。目前,我在postgres数据库中拥有这些数据,其中每个数据集都位于自己的分区中

  • 分区很好,因为可以轻松地添加/删除/替换分区
  • 数据库很适合基于类型\ id进行过滤
  • 数据库不容易编写并行查询
  • 数据库适用于结构化数据,而我的数据不是结构化的
作为概念证明,我试用了hadoop:

  • 为特定类型的id为每个数据集创建了一个选项卡分隔的文件
  • 上传至hdfs
  • 映射:检索每个键的值/列
  • 减少:计算的平均值和标准偏差
从我粗略的概念证明中,我可以看到这将很好地扩展,但我可以看到hadoop/hdfs有延迟,我已经读到它通常不用于实时查询(尽管我可以在5秒钟内将结果返回给用户)

有没有关于我应该如何处理这个问题的建议?我正在考虑下一步尝试HBase来了解这一点。我应该看看蜂巢吗?卡桑德拉?伏地魔


谢谢

蜂巢或猪似乎不会帮你。基本上,它们中的每一个都编译成一个或多个map/reduce作业,因此响应不能在5秒内完成

HBase可能会工作,尽管您的基础架构对于最佳性能来说有点小。我不明白为什么你不能预先计算每一列的汇总统计数据。你应该查一下计算跑步平均值,这样你就不必做大量的减肥了

退房

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

这意味着您可以通过


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

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

如果我理解正确,您一次只需要在单个列上进行聚合 您可以以不同的方式存储数据以获得更好的结果 在HBase中,它看起来像 在今天的设置中,每个数据列有一个表,另一个表用于筛选字段(键入\u id) 在今天的设置中,每个键对应一行-您可能需要考虑如何将筛选字段合并到键中以实现高效筛选-否则您必须进行两阶段读取( 当前设置中每个表的列(即数千列) HBase不介意您添加新列,而且它是稀疏的,因为它不存储不存在的列的数据。
当你读一行的时候,你会得到所有相关的值,你可以很容易地做平均值等等。因为你的数据似乎是非常同质的,我肯定会看一看-你可以摄取和分析数据,而不需要MapReduce步骤(就你而言),RESTful API将帮助您根据查询创建web应用程序。事实上,根据您希望如何设计应用程序,您可以创建一个相当“实时”的应用程序。

您可能希望使用一个普通的旧数据库来实现此目的。听起来您没有事务系统。因此,您可能只需要使用一个或两个大表。当您需要连接大数据时,SQL会出现问题。但是,由于您的数据集听起来不需要连接,您应该会很好。您可以设置索引来查找数据集,并在SQL或应用程序数学中查找。谢谢您的帮助。我可能不清楚为什么不能进行预计算。我很抱歉king表示一组数据集上特定键和特定列的平均值。例如,一个用户可以选择500个数据集,但不同的用户可以选择不同的500个数据集。即使我们正在计算所有相同键和所有相同列的统计数据,数据集(hadoop中的文件,或我数据库中的分区)就是varries。谢谢。@anish的stddev和您可以预先计算的平均值