对于简单的O(n)复杂性查询,有没有比Hadoop更好的解决方案



我需要创建一个系统,需要获取TB级的数值数据并回答三个问题:1.最小值,2.最大值,3.总数

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

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

谢谢!

Hadoop不会改变任何东西的渐近复杂性。它只是关于减少大O忽略的常数因子。

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

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

我不知道这是否使它成为O(n(,因为内部还有很多其他的事情在进行,比如合并。

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

当然,我可能不会建议你为这种工作构建自定义的MapReduce作业。这是Hive可以为你回答的那种事情,尽管它只是委托给MapReduce作业,并且会比你一开始考虑的简单MapReduce慢。

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

最新更新