map reduce分析
参考文章
- Hadoop-2.4.1源码分析--MapReduce作业(job)提交源码跟踪
- Hadoop-2.4.1源码分析--MapReduce作业切片(Split)过程
- hadoop源码解析
- Hadoop中Map端源码解析
- Reduce Shuffle过程分析
流程
- job.waitForCompletion提交并监控作业
- job.submit中调用connet,跟集群建立连接并初始化。最后调用JobSubmitter.submitJobInternal来提交作业。
- JobSubmitter.submitJobInternal中,首先检查输出目录是否存在,如果存在将抛出异常,然后配置各种信息,获取文件,并调用writeSplites进行分片。最终以RecordReader<KEYIN, VALUEIN> reader的形式传到mapper中。
- 在mapper类中,启动了线程,监听context.nextKeyValue(),将输入的值传入map方法并调用。追踪可发现TaskInputOutputContext的实现类MapContextImpl的构造方法传入了RecordReader。
- map后,默认的情况下,Partitioner将对结果按照key进行分区、排序、溢写磁盘。有相同key的键/值对会送到同一个Reducer,一个分区由一个reduce来处理,如果reduce数不够时,分区将等待前置reduce处理完后再提交到reduce。分区调用是在NewOutputCollector.write中。自定义分区方法
- map阶段,分片、map初始化、分区等都是由MapTask.runNewMapper来实现的。
- Shuffle过程是Reduce阶段的初始操作阶段,过程简单的理解就是"远程数据拷贝"的过程。将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序。具体实现查看Shuffle.run()。
-
reduce阶段,将取出key相同的group调用定义的reduce方法,最后将结果写到设定的目录下。
MapReduce中,分片、分区、排序和分组(Group)的关系图:
yarn 分析
yarn是通过ResourceManager来管理和分配集群的资源
- ResourceManager,负责集群中所有资源的统一管理和分配。ResourceManager主要包含Scheduler和ApplicationManager两部分。Scheduler负责这个集群资源的分配和调度,ApplicationManager负责接收作业的提交,从Scheduler中获取资源并分配给应用,监控作业进度,对失败的作业进行重启。Scheduler有三种调度方式:
1.1 FIFO Scheduler,先进先出,以作业提交的先后顺序进行调度。
1.2 Capacity Scheduler,根据应用自身的的逻辑分配资源。
1.3 Fair Scheduler,公平调度,尽可能让各个作业得到的资源平均。
- NodeManager,管理着单个计算节点,负责跟resourcemanager保持通讯,启动关闭节点,监控节点的资源使用情况(CPU、内存、磁盘、网络等),监控节点的健康情况。