【问题标题】:Is there a better solution than Hadoop for simple O(n) complexity queries?对于简单的 O(n) 复杂度查询,是否有比 Hadoop 更好的解决方案?
【发布时间】:2013-10-04 21:46:15
【问题描述】:

我需要创建一个系统,需要获取 TB 级的数值数据并回答三个问题:1. Min, 2. Max, 3. Total count

一位朋友建议 Hadoop 使用 map-reduce,reduce 步骤总是对数据进行排序。这会导致 O(nlogn) 的复杂性,即使对于 O(n) 查询,例如 min、max 和总计数。

我一直在网上搜索;但是,我一直无法找到答案。有人可以帮忙吗?我是这个领域的新手,所以请原谅我缺乏知识。

谢谢!

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    Hadoop 不会改变任何事物的渐近复杂性。它只是关于减少 big-O 忽略的常数因素。

    将分布式计算的结果放在一起总是有一些开销。但是,对于您的三个问题,使用组合器会将最终排序减少到 O(1)。我不知道当只有一个键时,每个地图主机上发生的本地排序的复杂性是什么,以便为组合器分组。在这种情况下,它可能比 O(n lg n) 更好。

    【讨论】:

    • 正如您所说:“Hadoop 不会改变任何事物的渐近复杂性。”可以肯定的是,即使对于复杂度为 O(n) 的问题也是如此?
    • 为了实现,比如说,max,你的映射器在清理调用期间只能输出一条记录。然后每个地图任务将是 O(n),然后找到局部最大值的最大值将是 O(n) 或更好。
    【解决方案2】:

    我在实践中没有尝试过,但我相信您可以通过为您的工作定义自定义排序和分组比较器来有效地禁用排序。您想使用一个排序比较器,它表示所有键都相等以用于排序目的。我相信这将使所有类型至少做尽可能少的工作——一次通过。不过,您希望保留默认的分区器和分组比较器,因此工作仍然以相同的方式分配,并且相同的值使用相同的键。

    我不知道这是否会导致 O(n),因为内部还有很多其他事情在进行,比如合并。

    而且,big-O 是一种非常粗略的速度度​​量。诸如高效可写和组合器之类的东西将比这些问题产生更大的影响。

    当然,我可能不建议您为此类工作构建自定义 MapReduce 作业。这是 Hive 可以为您解决的问题,尽管它只是委托给 MapReduce 作业,并且会比您一开始考虑的简单 MapReduce 慢。

    有像 Impala 这样的实时工具可以更快地回答这些类型的查询。他们不使用 MapReduce,但在 Hadoop 上运行。如果您真的想这样做,我强烈建议您朝那个方向看。

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2017-11-19
      • 2022-08-19
      • 1970-01-01
      • 2016-07-19
      • 2020-07-20
      相关资源
      最近更新 更多