概述
本文主要从一次完整的Map-Reduce作业提交运行入手分析这个过程中涉及到的Hadoop源码架构,此外本文基于的Hadoop版本是2.6.4
总体流程
上图给出了Hadoop在运行一次Map-Reduce作业过程中涉及到的组件交互,其中涉及到的6个进程间交互接口的作用如下:
接口 | 作用 |
---|---|
ApplicationClientProtocol | client向ResourceManager提交/丢弃作业 |
MRClientProtocol | Client向MRAppMaster查询作业执行情况 |
ContainerManagementProtocol | ResourceManager通过其和NodeManager通信,控制其启动/停止Container |
ResourceTracker | NodeManager向ResourceManager注册心跳 |
ApplicationMasterProtocol | MRAppMaster向ResourceManager注册心跳,以及向ResourceManager请求资源 |
TaskUmnilicallProtol | Map/Reduce Task向MRAppMaster报告Task执行进度 |
作业提交运行的过程大致分为以下步骤:
- client 通过 ApplicationClientProtocol 向 ResourceManager 提交作业
- ResourceManager 通过 ContainerManagementProtocol 通知NodeManager启动 MRAppMaster(运行在Container中)
- MRAppMaster通过 ApplicationMasterProtocol 向 ResourceManager 获取资源(在心跳报告中包含allocate请求)
- MRAppMaster通过 ContainerManagementProtocol 向 NodeManager 启动 Container运行Map/Reduce Task
- Map/Reduce Task通过 TaskUmbilicalProtocol 向 MRAppMaster报告进度
- client 通过 MRClientProtocol 向MRAppMaster获取 作业的执行进度等信息
关键组件分析
看Hadoop源码中感觉事件触发模式和状态机贯穿始终,原理图如下:
ResourceManager
ResourceManager 通过 ContainerManagementProtocol 通知NodeManager启动 MRAppMaster的详细流程如下图所示:
这其中的事件处理和状态转化的部分可以直观的表示为下图:
大致过程为:
1. 客户端提交作业后,初始化相关的 RMAppImpl、RMAppAttemptImpl 后直接提交到 Scheduler 组件中(1,2,3,4,5,6,7,8)
2. NM 产生心跳,ResourceTrackerService 处理后,到调度器选择出 job,最后到 ApplicationMasterLauncher 调用 NM,启动 MRAppMaster(10,11,12,13)
3. MRAppMaster随后就向 RM 注册且向 ApplicationMasterService 申请资源(14,15,16)
MRAppMaster
MRAppMaster通过 ContainerManagementProtocol 向 NodeManager 启动 Container运行Map/Reduce Task并接受Task进度报告过程中的事件流如下图:
大致过程为:
1. MRAppMaster 启动最后一步会发送启动 JobImpl 的事件,后初始化 TaskImpl 及 TaskAttemptImpl(1,2,3,4,5,6)
2. TaskAttemptImpl发送CONTAINER_REQ事件给RMContainerAllocator,请求Container资源(7)
3. RMContainerAllocator将接受到资源请求入队,并通过心跳报告,定期向ResourceManager请求资源,当获取到资源后再通知TaskAttemptImpl(8,9,10)
4. TaskAttemptImpl 发送CONTAINER_REMOTE_LAUNCH事件给 ContainerLauncherImpl,请求启动Container。ContainerLauncher 通过 NodeManager 启动 Container后,再发送TA_CONTAINER_LAUNCHED确认消息给 TaskAttemptImpl(11,12)
5. TaskAttemptImpl发送ATTEMPT_LAUNCHED事件给TaskImpl启动Map/Reduce作业线程MRYarnChild(13)
6. MRYarnChild定期调用TaskUmnilicallProtol相应接口(commitPending, sendDone等)汇报Task执行情况(14)