原文地址:https://program-park.github.io/2022/02/14/hadoop_46/
部分内容摘自尚硅谷、黑马等等培训资料
首先回顾,提交 MapReduce 程序到 YARN 集群运行机制,如下图所示:
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output
hdfs://…./.staging
以及 application_id,并返回客户端 Client;以入门程序:WordCount 作业为例,执行程序 main 方法,核心代码:
如果提交运行 YARN 集群,则最终调用YARNRunner#submitJob
方法:
MapReduce 程序最后执行job.waitForCompletion
方法时,表示应用提交执行等待完成,提交应用时,方法调用链如下所示:
waitForCompletion -> submit -> submitter.submitJobInternal -> submitJob
submitClient为ClientProtocol
实例对象,有 2 个实现子类:本地模式运行和 YARN 集群运行:
在YARNRunner#submitJob
方法中,应用提交上下文构建完成后,进行应用提交。
ApplicationClientProtocol
类对象,这是一个 RPC 的接口协议,对应的实现类ApplicationClientProtocolPBClientImpl
。ApplicationClientProtocolPBServiceImpl
类属于客户端 Client 实现类,所在包为:org.apache.hadoop.yarn.api.impl.pb.client
。proxy.submitApplication()
对应的 RPC Server 端的方法数为:ApplicationClientProtocolPBServiceImpl#submitApplication()
,是对称的关系,都实现了ApplicationClientProtocalPB
接口。ApplicationClientProtocolPBServiceImpl
类属于服务端 Service 实现类,所在包为:org.apache.hadoop.yarn.api.impl.pb.service
。ApplicationClientProtocolPBServiceImpl
类对象由ClientRMService
构建,属于 RM 端的服务类,专门用于服务 Client,包括 Client 的作业提交,作业查询等服务。ClientRMService.submitApplication()
直接把作业交给RMAppManager
类的对象rmAppManager
进行提交,这也是作业最终上岸了,接下来就是 RM 的事情。客户端 Client 进行作业提交时,分为 Client 端和 Service 服务端 2 个层次:
MapReduce 作业提交已经到达 ResourceManager 端,并且交给 RMAppManager 进行继续运转,将此应用当做任务提交到队列 Queue 中,开始执行MRAppMaster任务,流程图如下。
从 MRAppMaster 类中 main 查看,启动 MRAppMaster 进程流程步骤。
ResourceManager 在启动 AppMaster 之前,先对 AppMaster 服务进行初始化操作。
GenericEventHandler
(通用事件处理器),调用handle
方法启动 Job 作业执行。任何一个应用提交运行至 YARN 集群,首先为应用启动 AppMaster,当启动完成以后,为每个应用启动应用进程,调度任务 Task 执行,其中不同应用对应的应用进程不一样。
针对 MapReduce 应用提交运行 YARN 上来说,当 MRAppMaster 启动以后,计算整个 Job 的 MapTask 和 ReduceTask 数量,然后向 ResourceManager 申请资源,运行 Task 任务。无论运行 MapTask 还是 ReduceTask,都是 YarnChild 中执行 Task,运行流程图:
Task 类 2 个实现子类:MapTask 和 ReduceTask,查看其中 run 方法,如何执行任务。
查看 MapTask 任务中 run 方法,主要判断是否是 MapReduce New API 编写程序,如果是的话直接调用:runNewMapper
方法,运行 MapTask 任务。
在 MapReduce 计算引擎中,先运行 MapTask 处理每个 Split 分片数据,当完成以后告知 MRAppMaster 主节点,接着通知所有 ReduceTask 到 MapTask 输出目录拉取所属自己文件数据。
接下来,查看 ReduceTask 类中 run 方法,核心执行流程。
当 ReduceTask 运行完成后,将数据输出到外部存储引擎(比如 HDFS 文件系统),告知 MRAppMaster。MRAppMaster 等到所有 ReduceTask 任务运行完成后,向 ResourceManager 发送信息,要求 ResourceManager 注销自己,释放资源,以便其他应用运行使用,至此一个 MapReduce 应用程序运行 YARN 集群完成。