Map和Reduce中间过程描述

        开始转大数据方向已经一年了,期间基于hadoop平台开发了两个项目,总算是沾边了。这段时间不算忙,借了本翟周伟的《Hadoop核心技术》,总算了解了MapReduce的实现原理。(吐槽下,这本书15年出版,讲的却还是hadoop 1.x版。此外,里面不少错误以及逻辑表达问题。推荐看新版hadoop权威指南)

        MapReduce总的过程相对来说简单明了:

       1、用户提交作业:客户端启动JobClient,并向JobTracker请求分配jobId和hdfs存储目录,上传Jar包、依赖库、输入文件分片信息等;

       2、JobTrack作业调度:JobTracker先把作业放入队列,待调度程序调度。当满足调度条件后,调度程序创建若干map任务和reduce任务,均分配给TaskTracker执行。一般map任务个数与输入的分片个数一致(细节可参考Hadoop2.6.0的FileInputFormat的任务切分原理分析),而Reduce任务个数通过配置文件参数设定。

       3、任务执行:当map任务开始执行时,首先会根据为其分配的分片信息读取数据并生成key-value对;Map函数对这些key-value做处理后,输出另一组key-value对作为结果;

中间经过分区、洗牌等操作后,由reduce任务接收多个map任务的结果,洗牌后形成key-valueList对作为Reduce函数的输入,处理后形成最终结果。


        这里,重点介绍的就是Map函数之后,Reduce函数之前的过程:

        Map函数执行之后,生成的结果为一组key-value对,准备交由reduce任务执行。这些key-value对应该传递给哪一个reduce任务,在hadoop中执行是由Partitioner类的partition函数处理,将结果分区,默认是采用hash方法;分区后,会调用sort函数对各分区进行排序。如果Mapper中指定了Combiner,在输出key-value对前,会将同一key对应的value放在列表中,形成key-list对。当列表个数到某个数量后,会调用combine函数合并,然后再输出。这样的好处是可以减少map节点和reduce节点之间的网络传输量。要说明的是,Map函数或combine函数的输出首先是放在缓存中(默认100M),当超过某一阈值(80%)后才写入文件,而sort函数是在溢写操作触发后开始执行。而写入的文件较多时,还可执行Merge操作,对两个文件中的数据执行combine操作,进一步减少传输量。到此为止,map任务才正式结束。

        当reduce任务从JobTracker那获得map任务执行完成的消息后,开始启动reduce任务。在Reduce函数执行之前,首先是洗牌,也就是Shuffle。从映射过来的map任务那获取(复制)已经排序好的输出,由于来自多个map,需要对这些结果混在一起。然后对这些混在一起的数据调用sort函数排序,排序后作为输入传递给Reduce函数。

       

      写到这里,发现还是不够细致,在网上查了资料,找到几个解释的不错的,记下来,以后看源码时可结合着分析。另外,推荐网易公开课里厦门大学林子雨的视频教程大数据技术原理与应用,虽然讲的一般,不过内容还比较细,基本都覆盖了,可以参考。

http://blog.csdn.net/luyee2010/article/details/8624469

http://weixiaolu.iteye.com/blog/1474172

http://blog.csdn.net/lifuxiangcaohui/article/details/22675437

你可能感兴趣的:(hadoop平台)