为了测试MapReduce提交的详细流程。需要在提交这一步打上断点:

  F7进入方法:

  进入submit方法:

  注意这个connect方法,它在连接谁呢?我们知道,Driver是作为客户端存在的,那么客户端连接的应该就是Yarn集群,但是在这个简单的WordCount案例中,并没有将任务提交到Yarn集群,而是在本机中执行的。座椅这里连接的自然就是本机。

  进入这个connect方法,然后在里面的Cluster方法上打上断点:

  很明显,这是一个构造器,他把集群抽象成了一个对象。进入此方法:

  初始化了一个客户端协议,进入这个create方法,看看他是如何初始化客户端协议的:

  注意这个mapreduce.framework.name,他就是mapred-site.xml文件中的mapreduce.framework.name项的值,由于我并没有提交到集群上,而是在本机,所以他会加载本机的mapred-site.xml文件,但是我本机下的该文件并没有像集群上那样配置了mapred-site.xml文件,只有一份mapred-site.xml.template文件,更没有mapreduce.framework.name这一项,所以上面代码中的值就默认为local了。

  本机上的配置:

  集群上的配置:

  create方法最终反回了一个LocalJobRunner对象,如果上面的值是yarn,返回的则是YarnJobRunner。继续往下:

  会发现这个LocalJobRunner就是客户端。然后一直往下,直到完成connect方法,会发现整个过程中在connect方法中创建了一个Cluster对象,然后在Cluster对象里面获取到了客户端。

  紧接着,由于connect方法初始化了cluster对象,所以接下来创建了submitter对象,用于提交任务。进入submitJobInternal方法打上断点

  这个checkSpecs方法就是用来检查路径的,当输入路径不存在或输出路径已存在时会报错。进入此方法后再进入内部方法就一目了然了:

  继续往下执行,完成checkSpecs方法后完初始化一个路径:

  打开此路径,此时还是空的文件夹:

  继续往下,随后做了一些获取IP和往配置文件中设置IP和hostname的操作:

  继续往下,随后又在上面的路径下随机创建了一个目录:

  继续往下,见到copyAndConfigureFiles时,进入此方法,然后在进入内部方法uploadFiles():

  在uploadFiles方法中有,执行后的效果:

  这个文件夹暂时不知道干嘛的,只知道copyAndConfigureFiles方法创建了这个路径。此方法执行完后,执行到writeSplits进入此方法:

这个方法是重点:切片是怎么切的呢?

maps是int型,这表示这启动的maptask的数量也该和切片的数量保持一致。而具体切成多少片呢?

上面的方法多态调用到子类的方法writeNewSplits,然后调用getSplits方法:

getSplits方法中有这样一段:

也就是说:当剩余长度比切片尺寸大于1.1时,就会产生新的切片,比如说文件65m,splitSize为32m,第一片切到32m,剩余33m,由于33/32<1.1,所以就不再切片,65m被切成两片,0~32、32~65,而不是0~32 、 32~64 、 64~65三片。

  当执行完writeSplits方法后,会在上面创建的目录下生成几个文件:

上面生成的文件中保存了“切片的规划信息”。继续往下,当执行到writeConf方法后,会继续在上面的目录下生成与此Job相关的配置文件:

  继续执行,当执行完submitJob方法后,job本身(即WordCount程序本身会被打成jar包被提交)就被提交了:

  但是由于我是直接在本地执行的,直接从main方法进来执行的,没必要再打成jar包再从main方法进入,所以并不用提交,但是如果是是在yarn 上执行的时候,会把程序打成jar包放在上面的目录下。

  当任务执行完毕后,上面的目录会被清空:

  至此,整个任务的提交执行完成,试想一下,如果这个任务在Yarn上执行是什么样子呢?期待吗逻辑不会变:

  首先,还是执行connect方法,初始化到Cluster对象,然后创建JobRunner,不过在Yarn上执行的JobRunner就不是LocalJobRunner了,而是YarnJobRunner。执行完connect方法后会在HDFS文件系统创建一个路径,其作用与上面创建的路径相同,用于保存切片方案信息和配置文件信息,同时会将任务本身的jar包放入其中,最后任务执行完,这些内容又将被销毁。

MapReduce任务提交源码分析的更多相关文章

  1. Spark技术内幕:Stage划分及提交源码分析

    http://blog.csdn.net/anzhsoft/article/details/39859463 当触发一个RDD的action后,以count为例,调用关系如下: org.apache. ...

  2. mysql复制那点事(2)-binlog组提交源码分析和实现

    mysql复制那点事(2)-binlog组提交源码分析和实现 [TOC] 0. 参考文献 序号 文献 1 MySQL 5.7 MTS源码分析 2 MySQL 组提交 3 MySQL Redo/Binl ...

  3. MapReduce 切片机制源码分析

    总体来说大概有以下2个大的步骤 1.连接集群(yarnrunner或者是localjobrunner) 2.submitter.submitJobInternal()在该方法中会创建提交路径,计算切片 ...

  4. Hadoop-1.2.1学习之Job创建和提交源码分析

    在Hadoop中,MapReduce的Java作业通常由编写Mapper和Reducer開始.接着创建Job对象.然后使用该对象的set方法设置Mapper和Reducer以及诸如输入输出等參数,最后 ...

  5. YARN(MapReduce 2)运行MapReduce的过程-源码分析

    这是我的分析,当然查阅书籍和网络.如有什么不对的,请各位批评指正.以下的类有的并不完全,只列出重要的方法. 如要转载,请注上作者以及出处. 一.源码阅读环境 需要安装jdk1.7.0版本及其以上版本, ...

  6. MapReduce —— MapTask阶段源码分析(Output环节)

    Dream car 镇楼 ~ ! 接上一节Input环节,接下来分析 output环节.代码在runNewMapper()方法中: private <INKEY,INVALUE,OUTKEY,O ...

  7. MapReduce —— MapTask阶段源码分析(Input环节)

    不得不说阅读源码的过程,极其痛苦 .Dream Car 镇楼 ~ ! 虽说整个MapReduce过程也就只有Map阶段和Reduce阶段,但是仔细想想,在Map阶段要做哪些事情?这一阶段具体应该包含数 ...

  8. MapReduce源码分析之新API作业提交(二):连接集群

    MapReduce作业提交时连接集群是通过Job的connect()方法实现的,它实际上是构造集群Cluster实例cluster,代码如下: private synchronized void co ...

  9. MapReduce之提交job源码分析 FileInputFormat源码解析

    MapReduce之提交job源码分析 job 提交流程源码详解 //runner 类中提交job waitForCompletion() submit(); // 1 建立连接 connect(); ...

随机推荐

  1. Java学习之面试题整理

    1,java 基本数据类型有几种?哪几种?(面试题) 8种 byte short int long float double char boolean 2,int类型是几个字节?(面试题) 4字节 3 ...

  2. go-数组-切片-字典

    声明一个数组变量的同时为该变量赋值. ], , } 另一种便捷方法, 类型字面量中省略代表其长度的数字 , , } 对于数组来说,索引值既不能小于0也不能大于或等于数组值的长度. 索引值的最小有效值从 ...

  3. Mac系统 安装Photoshop CC 2018破解版

    应用场景 本人从事前端行业,但是工作中有时也需要会点PS技能,之前一直使用window系统,突然换了Mac其他软件基本都差不多安装完了,就剩下比较难搞的PS.刚开始按照网上乱七八槽的教程下载过好多次都 ...

  4. halcon小结

    持更 应用范围 (罗列自官方帮助文档,以后有空了按照需求展开叙述) 1. 安全系统 2. 表面检测 3. 定位 4. 二维测量比较 5. 二维码识别 6. 二维位置定位 7. 二维物体识别 8. 光学 ...

  5. alinode与node性能测试方法与分析

    需求和技术指标整理 node服务在引入node性能监控过程中,需要使用alinode,为了对alinode与官方node各项性能指标的差异有进一步的认识,现开展以下调研.测试. 原理性分析 alino ...

  6. java类对象的初始化顺序

    在下面这个例子中,我们分别在父类和子类中测试了静态代码块.普通代码块.静态成员变量.普通成员变量.构造器.静态内部类. 一:代码块及变量测试 class Field{ public static St ...

  7. 在.net core3.0中使用SignalR实现实时通信

    最近用.net core3.0重构网站,老大想做个站内信功能,就是有些耗时的后台任务的结果需要推送给用户.一开始我想简单点,客户端每隔1分钟调用一下我的接口,看看是不是有新消息,有的话就告诉用户有新推 ...

  8. Eureka -- 浅谈Eureka

    目录: 一:Eureka介绍 二:Eureka架构图 三:Eureka组件 四:Eureka作用 五:Eureka和Zookeeper对比 什么是Eureka 引入SpringCloud中文文档介绍 ...

  9. Git 项目提交新仓库

    提示:进入项目文件操作 步骤: 1.git init   ----------初始化git仓库 2.git remote add origin 你的项目地址  ------------------如: ...

  10. linux 下ln命令--笔记

    linux 下ln命令 ln命令用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.注意:符号链接文件不是一个独立 ...