1、MR任务提交流程图
2、流程分析
-
1、首先在提交job之前,FileInputFormat调用getsplits();获得分片信息,并且序列化为一个job.split文件。接着再讲job的配置信息转变成一个xml文件。 =>所以总共有job.jar、job.split、job.xml三个文件
-
2、第一步准备好后,向resourceManager请求提供机器运行程序。
-
3、resourceManager向客户端返回一个job文件上传的路径XXX/staging和一个jobID。
-
4、Client往这个路径上传已经准备好的那三个文件。接这个告诉resourceManager已经上传完成,并且告知需要的资源。
-
5、resourceManager生成一个资源任务放入resourceManager的任务队列中,这个资源任务描述了:作业存放的路径、需要的运行资源等。
-
6、由NodeManager轮询任务列表,获得这个任务,根据资源任务信息创建一个容器,并且将job作业信息下载下来,接着通知resourceManager已经下载完成。
-
7、resourceManager通知Client,资源准备好了,处理这个任务的NameManager的iP和端口是多少。
-
8、Client向这个NodeManager发送启动MRAppMaster的命令脚本,启动Mrappmaster。
-
9、MrAppMaster启动后,读取job.xml,job.split文件,知道需要多少mapTask和reduceTask进程。而且每个Task的资源需求,接着向ResourceManager请求这些资源。
-
10、ResourceManager同样创建一些资源任务,放入任务队列中。等待NodeManager轮询处理。
-
11、NanoManager拿到这个MapTask任务后,创建一个容器并且下载job.jar、job.split、job.xml文件,后向resourceManager返回确认。resourceManager最后想MrappMaster返回准备完成的信息。
-
12、MrAppMaster向NanoManager发送启动MapTask的命令脚本启动MapTask。
-
13、重复MapTask过程的资源请求步骤,请求ReduceTask。
3、总结
job运行有两种方式:
-
1、(开发debug模拟阶段)直接在idea中运行,(不需要打包) 利用hadoop 的client jar包,其中有一个localRunner.jar来模拟。但是这种方式必须在电脑上安装hadoop,并且必须在安装目录下bin文件夹中加入如下两个文件
下载地址:https://download.csdn.net/download/luoyepiaoxin/8860033
引入maven依赖
-- 必须引入依赖 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>2.6.4</version> </dependency> -- 如果想直接读取的是HDFS上的文件,则需要引入依赖 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.6.4</version> </dependency> -- 并且在代码中指定HDFS //指定HDFS的实现方式设置默认文件系统为HDFS,同时伪装自己的身份为root conf.set("fs.hdfs.impl",org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()); conf.set("fs.default.name", "hdfs://cmAgent2:8022"); System.setProperty("HADOOP_USER_NAME", "root");
-
2、(生产部署阶段)在idea中打包好,然后提交到集群中,最后使用hadoop jar XXXX。直接在集群中启动。
注意:在打包的时候需要将上面的那几行代码注释
总体依赖如下 <dependencies> <!--这个是必须的,common里面提供了rpc等功能--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.4</version> </dependency> <!--这个也是必须的--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.6.4</version> </dependency> <!--这个是本地debug运行才需要的--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>2.6.4</version> </dependency> <!--这个是本地debug的时候,需要读取HDFS上的文件才需要,如果是读取本地文件则不需要--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.6.4</version> </dependency> </dependencies>