MapReduce中的map,shuffle、partition和combiner,reduce的含义及作用

Hadoop的计算框架主要是两个过程分别是map和reduce,但是还有好几个过程跟性能调优有关。如:shuffle、partition和combiner。

shuffle:数据从map端传输到reduce端的过程。据说是可以期待奇迹发生的环节。

计算框架总体的过程如下:

MapReduce中的map,shuffle、partition和combiner,reduce的含义及作用

map阶段:从磁盘读入数据 --> map函数 --> combine结果(非必需的过程)--> 结果写回磁盘。

map阶段中,当输出数据达到一定的值(阈值)时,会从内存写到磁盘;若小于阈值,则会缓存起来,可以减小磁盘IO开销。所以,可以通过设置适当的阈值大小,来优化性能。

reduce阶段:从map的输出中读入数据 --> sort(根据key值) --> reduce函数--> 结果到HDFS。

reduce阶段中,会从map端拉数据过来,可能会跨节点,应该尽量减少这种网络开销,使数据“本地化”。

partition:将map的结果发送到相应的reduce。

这就对partition有两个要求:

1)负载均衡。尽量将工作分配给不同的reduce。

2)效率。分配速度要快。

combiner:相当于本地化的reduce。

特点:map端的输出作为其输入;其输出作为reduce的输入。这就要求combiner要保持输入和输出类型的一致性,也就不适用求平均数、权益这样的运算。

总结

Map->combine->partition->shuffle->reduce,五个步骤的作用

combine和partition都是函数,中间的步骤应该只有shuffle!
combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义的。
combine函数把一个map函数产生的<key,value>对(多个key,value)合并成一个新的<key2,value2>.将新的<key2,value2>作为输入到reduce函数中
这个value2亦可称之为values,因为有多个。这个合并的目的是为了减少网络传输。

combine求和的时候是针对针对一个map结果求的和,求和的结果会汇入reduce中,key和value没有特殊的要求

partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。这里其实可以理解归类。

我们对于错综复杂的数据归类。

partition的作用就是把这些数据归类。只不过在写程序的时候,mapreduce使用哈希HashPartitioner帮我们归类了。这个我们也可以自定义。

shuffle就是map和reduce之间的过程,包含了两端的combine和partition。

Shuffle的正常意思是洗牌或弄乱,Shuffle描述着数据从map task输出到reduce task输入的这段过程。partition,是划分,分区,归类,是shuffle的一部分。

Map的结果,会通过partition分发到Reducer上,Reducer做完Reduce操作后,通过OutputFormat,进行输出
shuffle阶段的主要函数是fetchOutputs(),这个函数的功能就是将map阶段的输出,copy到reduce 节点本地。