结论

先说结论,Python 的 map 和 reduce 是Python的内置函数,而 Hadoop 的 MapReduce 是一个计算框架。

两者之间没有直接的关系。但是他们的部分计算操作思想是类似的。

下面分别介绍下这三个内容。


Python的Map

下面是Python中Map类的定义(学过Java的同学不要将两者弄混,在Java中Map是一个存储键值的数据结构,相当于Python中的字典dict)

class map(object):
    """
    map(func, *iterables) --> map object
    
    Make an iterator that computes the function using arguments from
    each of the iterables.  Stops when the shortest iterable is exhausted.
    
	使用参数func(计算函数)对来自参数的迭代器(如list等)中的所有元素进行计算,直到迭代结束,将结果生成一个迭代器并返回。
    """

由定义我们可以知道Map的思想就是 把f(x)作用在list的每一个元素并把结果生成一个新的list 1

下面我们将展示一个map的具体例子:

>>> def f(x):
...     return x + x
...
>>> r = map(f, [1, 2, 3, 4, 5 ])
>>> list(r)
[2, 4, 6, 8, 10]

当然我们可以使用循环来实现上述功能,如下面代码所示

>>> def f(x):
...     return x + x
...
>>> r = []
>> for i in range(1,6):
...     r.append(f(i))
...
>>> r
[2, 4, 6, 8, 10]

但是在需要更加复杂的功能情况下,map往往能够更加简洁,便于理解。


Python的reduce函数

reduce和map类似,都是将某个函数应用到某个可迭代对象上。

但是在具体的计算方法上却有所不同。

reduce的计算过程可以描述为:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,依此类推,最后得到一个结果。2

def reduce(function, sequence, initial=None): # real signature unknown; restored from __doc__
    """
    reduce(function, sequence[, initial]) -> value
    
    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
    of the sequence in the calculation, and serves as a default when the
    sequence is empty.
    """
    pas

从函数定义中我们看到还有一个initial变量,如果传入此变量的话,首次计算就是第 1个元素和initial进行的,而不是第1,2个元素。

下面给出一个使用reduce计算累加的简单例子

>>> from functools import reduce
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

Hadoop 的 MapReduce

介绍完了Python的Map和Reduce,我们再来介绍一下Hadoop 的 MapReduce。

Hadoop 的 MapReduce计算框架的思想源于谷歌这篇著名的论文3MapReduce: Simplified Data Processing on Large Clusters

什么是MapReduce:

MapReduce 是一个基于Java的并行分布式计算框架,使用它来编写的数据处理应用可以运行在大型的商用硬件集群上来处理大型数据库集中的可并行化的问题,数据处理可以发生在存储在文件系统(非结构化)或者数据库(结构化)中的数据上。MapReduce可以利用数据的位置,在存储的位置附近处理数据,以最大限度地减少通信开销。4

MapReduce框架具体计算操作

MapReduce虽然被称为MapReduce,但其却包含三部分操作,即 map、shuffle 以及 reduce 三部分。(有些地方也将shuffle分为shuffle和sort,这里不再具体区分)5

  1. Map:每个工作节点将 map 函数应用于本地数据(这里与Python的map函数思想一致),并将输出写入临时存储。主节点确保仅处理冗余输入数据的一个副本
  2. Shuffle:工作节点根据输出键(由map产生)重新分配数据,对数据映射排序、分组、拷贝。目的是将属于一个键的所有数据都放在同一个工作节点上。
  3. Reduce:工作节点现在并行处理每个键的每组输出数据。

python 调用 hadoop python hadoop mapreduce_python 调用 hadoop


图1、MapReduce 流程图

上面就是MapReduce的基本思想和相关操作。具体Hadoop中的MapReduce怎么使用,读者有兴趣可以自己继续查找资料,我这里就不再具体介绍了。


参考文献:


  1. 廖雪峰. 廖雪峰的Python教程 map/reduce.
    https://www.liaoxuefeng.com/wiki/1016959663602400/1017329367486080 ↩︎
  2. 菜鸟教程. Python reduce() 函数.
    https://www.runoob.com/python/python-func-reduce.html ↩︎
  3. Dean J, Ghemawat S. MapReduce: simplified data processing on large clusters[J]. Communications of the ACM, 2008, 51(1): 107-113. ↩︎
  4. Hadoop文档. Hadoop Map/Reduce教程. https://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html#%E6%A6%82%E8%BF%B0 ↩︎
  5. 掘金. Hadoop 学习系列(四)之 MapReduce 原理讲解. ↩︎