【问题标题】:Why do we need the "map" part in MapReduce?为什么我们需要 MapReduce 中的“地图”部分?
【发布时间】:2015-11-03 20:39:44
【问题描述】:

编程模型 MapReduce 由 2 个过程组成,map 和 reduce。当我们可以简单地在 reduce 函数中进行映射时,为什么我们需要 map 部分。

考虑以下伪代码:

result = my_list.map(my_mapper).reduce(my_reducer);

这可以缩短为

result = my_list.reduce(lambda x : my_reducer(my_mapper(x)));

第一种方法如何比第二种方法更受青睐,而第一种方法需要再通过一次数据?我的代码示例是否过于简单?

【问题讨论】:

    标签: hadoop mapreduce apache-spark functional-programming


    【解决方案1】:

    好吧,如果您参考 Hadoop 风格的 MapReduce,它实际上是 map-shuffle-reduce,其中 shuffle 是 map 和 reduce 分离的原因。再高一点,您可以考虑数据局部性。通过 map 传递的每个键值对可以生成零个或多个键值对。为了能够减少这些,您必须确保给定键的所有值在单个减少中可用,因此是随机播放。从单个输入对发出的重要对可以由不同的减速器处理。

    可以使用 map 端聚合或组合器等模式,但归根结底,它仍然是 (map)-reduce-shuffle-reduce。

    假设数据局部性不是问题,map 和 reduce 等高阶函数提供了优雅的抽象层。最后,它是一个声明式 API。像xs.map(f1).reduce(f2) 这样的简单表达式仅描述 what 而不是 how。根据语言或上下文,可以急切地或懒惰地评估这些操作,可以压缩操作,在更复杂的场景中以多种不同的方式重新排序和优化。

    关于您的代码。即使签名是正确的,它也不会真正减少您传递数据的次数。此外,如果您将 map 推送到聚合中,则传递给聚合函数的参数不再属于同一类型。这意味着顺序折叠或更复杂的合并逻辑。

    【讨论】:

      【解决方案2】:

      在高层次上,map reduce 是关于并行处理的。尽管 reducer 在 map 输出上工作,但实际上,每个 reducer 只会获得部分数据,而这只有在第一种方法中才有可能。

      在您的第二种方法中,您的 reducer 实际上需要 mapper 的全部输出,这超出了并行性的想法。

      【讨论】:

      • 我的意思是,从你的代码来看,你的 reducer 实际上需要特定的(在你的情况下是整个 map 输出),并且不同的 map 输出不可能去不同的 reducer,以处理并行性
      猜你喜欢
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 2017-12-27
      • 2014-06-18
      相关资源
      最近更新 更多