- MapReduce运行流程:
1) 首先对输入数据源进行切片
2) master 调度 worker 执行 map 任务
3) worker 读取输入源片段
4) worker 执行 map 任务,将任务输出保存在本地
5) master 调度 worker 执行 reduce 任务,reduce worker 读取 map 任务的输出文件
6) 执行 reduce 任务,将任务输出保存到 HDFS
总结:
先将输入文件进行切片,然后通过Map对数据进行处理,处理结果为k/v,并保存到本地,然后通过Reduce对数据进行归约操作,将输出结果保存到HDFS中。
-
运行流程详解
-
以WordCount为例
Map对每一个接收到的切片内容做相同的处理,即记录每个单词的次数,然后进行分区(partition)并按照key进行排序(sort),然后进行本地归约combine阶段(即相当于map端的reduce),各分区按key进行汇总。之后进入shuffle阶段,将相同分区进行合并与排序。最后进入Reduce,每个Reduce从Map的输出中获取数据,然后汇总每个key对应的值,最终多个Reduce的结果再做一次汇总就输出为最终的内容。在整个过程中,只有map操作和reduce操作是用户需要关心的,其他的部分全部交给Hadoop。 -
举例说明:
需要在一堆扑克牌(张数未知)中统计四种花色的牌有多少张,只需要找几个人,每人给一堆,数出来四种花色的张数,然后汇总给另外一个人就可以了。比如两个人每人一堆扑克牌,查出红桃、黑桃、梅花、方片之后四个人,每个人只负责统计一种花色,最终将结果汇报给一个人,这是典型的map-reduce模型。
-
combiner说明:
每一个map可能会产生大量的输出,combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。
combiner最基本是实现本地key的归并,combiner具有类似本地的reduce功能。 如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。注意:Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。
部分引用
原文:http://www.cnblogs.com/ahu-lichang/p/6657572.html
原文:https://blog.csdn.net/afandaafandaafanda/article/details/52828870
版权声明:本文为博主原创文章,转载请附上博文链接!