MapReduce程序从提交到执行是一个很复杂的过程,以下将分别讨论MapReduce1.0和Yarn环境下的任务提交和执行过程。
以Hadoop Shell方式为例,提交MapReduce命令如下:
$HADOOP_HOME/bin/hadoopappname.jar
-D mapred.job.name=” testappname”
-D mapred. reduce.tasks=6
-files=blacklist.txt,whiltelist.txt
-libjars=third-party.jar
-archives=dictionary.zip
-input/test/input
-output/test/output
其中,以参数mapred.job.name指定了程序的名字,以参数mapred. reduce.tasks设置reduce任务的个数。
后续参数分别对应程序运行需要的文件,需要的第三方依赖包,程序的输入路径和输出路径。
图2-1MapReduce1.0任务提交流程
在讨论详细过程之前,先要熟悉两个概念,大数据组件的角色和守护进程。在谈到HDFS时,有两个角色,一个是NameNode,另一个是DataNode;在提及MapReduce时,也有两个角色,分别是JobTracker和TaskTracker。
每个角色的功能都由一个java程序实现并且常驻内存,而这个程序就是大数据组件的守护进程。守护进程所运行的计算机节点也可以理解为角色对应的节点。
1、HDFS是一个分布式文件系统,分NameNode和DataNode两个角色。为MapReduce程序等应用提供了全局统一的存储命名空间。集群中任何一个节点、进程或线程都可以看到相同的目录树和文件,是数据并行处理的基础。
2、客户端,用于提交MapReduce程序。
3、JobTracker,是一个守护进程,用于资源分配和作业调度。
4、TaskTracker,负责运行作业划分以后的任务,启动任务进程。
2.2 主要执行步骤
如图2-1所示,MapReduce程序执行的主要步骤如下:
1、在客户端节点执行Hadoop Shell命令以后,会产生一个JobClient实例。
2、JobClient向JobTracker请求一个新的作业ID。检查作业的输出目录,计算作业的分片,如果有错误,则返回给MapReduce程序。
3、将运行作业需要的资源,包括JAR文件、配置文件、splits分片信息、和第三方依赖包等上传到HDFS共享文件系统,并且保存在以作业ID命名的文件夹下。
4、JobClient通知JobTracker准备执行作业。
5、JobTracker接收到通知以后,将作业放入内部队列中,由作业调度器(job scheduler)进行调度。初始化时包括创建一个正在运行作业的对象,封装任务和记录信息,以便跟踪任务的状态和进度。
6、作业调度器(job scheduler)在HDFS共享文件系统中获取第3步中的splits分片信息。然后为每个分片创建一个map任务。map任务的数量由splits个数决定,reduce任务的数量由参数mapred. reduce.tasks决定。
7、在TaskTracker与JobTracker周期性心跳过程中附带交互信息,如果TaskTracker表明已经准备好可以执行任务,JobTracker会为它分配一个任务。
8、TaskTracker从HDFS获取作业的JAR包和作业运行的依赖文件,保存到本地文件系统并创建一个本地工作目录。TaskTracker启动一个TaskRunner实例来运行该任务。
9、TaskRunner启动一个新的java虚拟机(名字为childJVM,可在TaskTracker节点上执行jps命令查看)
10、在childJVM中运行map或reducetask,任务在独立的JVM中运行,与TaskTracker不在同一个进程,出现异常也不会影响TaskTracker的正常运行。
三、MapReduce2.0任务执行过程
图2-2 Yarn环境下MapReduce程序提交流程
3.1 涉及的角色
此处HDFS功能2.1中已经进行了详细描述,不再具体讨论。
与MapReduce1.0相比,MapReduce2.0引入了独立的集群资源管理组件Yarn。将JobTracker的资源分配和任务调度功能分离开,由Yarn负责资源分配,MapReduce程序的Application Master承担任务调度的功能。两者的详细对比请参考前文<>。
1、客户端,用于提交MapReduce程序
2、ResourceManager,Yarn集群资源管理器,负责协调整个集群上所有资源(CPU、内存、网络和磁盘)的分配。
3、NodeManager,Yarn节点管理器,负责启动和监视位于本节点的计算容器(container)。
4、 MapReduce程序的Application Master, 负责协调运行MapReduce任务的作业。和map、reduce任务一样运行在容器(container)中。
3.2 主要执行步骤
此处主要描述与MapReduce1.0有差异的地方:
1、集群启动Yarn组件且无任务提交,存在ResourceManager和NodeManager两个守护进程,集群中没有Application Master,或任何计算任务。
2、客户端提交任务以后,ResourceManager选择某个NodeManager启动一个计算容器(container)来运行该MapReduce程序的Application Master
3、Application Master根据分片信息,对任务进行封装。
4、由Application Master向ResourceManager申请一组容器,容器分散在多个NodeManager中
5、Application Master确定MapReduce任务该如何执行,根据底层数据块的局部性,通知NodeManger启动容器并运行map和reduce任务
6、Application Master负责监控任务的执行过程
备注:
1、Application Master不会运行在特定的节点中,而是和map、reduce任务运行一样运行在NodeManager的容器中。但是比map、reduce任务先启动。
2、任务调度方式比较复杂,要考虑虚拟机或容器复用的问题。如果MapReduce程序很小,例如10个map以内且只有一个reduce任务。任务执行时间很短,甚至短于启动一个虚拟机的时间。那么没有必要启动多个虚拟机,可以直接在一个虚拟机或容器中执行多个任务。
[1] Tom White著,王海,华东,刘喻,吕粤海 译, Hadoop权威指南:大数据的存储与分析(第4版). 清华大学出版社. 2017
[2] 董西成,Hadoop技术内幕:深入解析MapReduce架构设计与实现原理,机械工业出版社. 2013
[3] Tom White著,周敏奇,王晓玲,金澈清,钱卫宁 译, Hadoop权威指南 (第2版). 清华大学出版社. 2011