python map reduce和cloud-computing map / reduce之间的关系?

时间:2011-11-14 04:58:19

标签: python cloud mapreduce

我是Python的新手,

有人知道Python(和函数式语言)函数map() / reduce()之间的关系以及与分布式计算相关的MapReduce概念吗?

2 个答案:

答案 0 :(得分:8)

map / reduce的云概念非常相似,但改为并行工作。首先,每个数据对象都通过一个函数map传递给一个新对象(通常是某种字典)。然后,在reduce返回的对象对上调用map函数,直到只剩下一个。{1}}函数。这是map / reduce操作的结果。

一个重要的考虑因素是,由于并行化,reduce函数必须能够从map函数以及先前reduce函数中的对象中获取对象。当您考虑并行化的方式时,这会更有意义。许多机器都会将数据减少到单个对象,然后这些对象将减少到最终输出。当然,如果有大量数据,这可能会发生在多个层中。

以下是一个简单的示例,说明如何使用map / reduce框架计算列表中的单词:

list = ['a', 'foo', 'bar', 'foobar', 'foo', 'a', 'bar', 'bar', 'bar', 'bar', 'foo']
list2 = ['b', 'foo', 'foo', 'b', 'a', 'bar']

地图功能如下所示:

def wordToDict(word):
  return {word: 1}

reduce函数看起来像这样:

def countReduce(d1, d2):
  out = d1.copy()
  for key in d2: 
    if key in out:
      out[key] += d2[key]
    else:
      out[key] = d2[key]
  return out 

然后你可以像这样映射/减少:

reduce(countReduce, map(wordToDict, list + list2))

>>> {'a': 3, 'foobar': 1, 'b': 2, 'bar': 6, 'foo': 5}

但你也可以这样做(这就是并行化会做的事情):

reduce(countReduce, [reduce(countReduce, map(wordToDict, list)), reduce(countReduce, map(wordToDict, list2))])

>>> {'a': 3, 'foobar': 1, 'b': 2, 'foo': 5, 'bar': 6}

答案 1 :(得分:2)

实际上这些概念有些不同,而且常见的名称具有误导性。

在函数式编程中(Python借用了这些函数):

  • map将一些函数应用于列表的所有元素并返回一个新列表
  • reduce应用某些函数来聚合某些列表中的所有值以获得单个值。

在分布式计算中MapReduce:

  • 我们一直在使用键值对(好吧,只是成对)
  • mapper 获取对的列表并生成另一个对列表(输入的“键”在此上下文中失去其语义)
  • reducer 获取与此键对应的键和值列表(来自mapper输出),并生成一些键和值列表(单个位置,其中“key”具有键语义为reducer输入/ mapper输出:值在传递给reducer之前按键分组)
  • 您可能还有分区器和组合器:)

请注意,映射器始终不会为每个输入对生成一个输出对,也不会将reducer(键,值列表)精确地减少到一个输出对。 Mapper和reducer可以输出他们想要的任何东西。例如,映射器可用于过滤对 - 在这种情况下,它为某些输入对生成输出对而忽略其他对。对于每个映射器/减速器输入对(或其中一些),产生多于一对的情况并不罕见。

但在大多数情况下,MapReduce可以与reduce(reduce_function, map(map_function, list))类似或几乎相似的方式工作 - 映射器通常对每个输入进行一些计算,而reducer通常以某种方式聚合值列表。对于任何map_functionreduce_function,可以在MapReduce中表达,但反之亦然。

相关问题