大数据学习(二):Hadoop源码分析

概述

本文主要从一次完整的Map-Reduce作业提交运行入手分析这个过程中涉及到的Hadoop源码架构,此外本文基于的Hadoop版本是2.6.4

总体流程

大数据学习(二):Hadoop源码分析_第1张图片
上图给出了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执行进度

作业提交运行的过程大致分为以下步骤:

  1. client 通过 ApplicationClientProtocol 向 ResourceManager 提交作业
  2. ResourceManager 通过 ContainerManagementProtocol 通知NodeManager启动 MRAppMaster(运行在Container中)
  3. MRAppMaster通过 ApplicationMasterProtocol 向 ResourceManager 获取资源(在心跳报告中包含allocate请求)
  4. MRAppMaster通过 ContainerManagementProtocol 向 NodeManager 启动 Container运行Map/Reduce Task
  5. Map/Reduce Task通过 TaskUmbilicalProtocol 向 MRAppMaster报告进度
  6. client 通过 MRClientProtocol 向MRAppMaster获取 作业的执行进度等信息

关键组件分析

看Hadoop源码中感觉事件触发模式和状态机贯穿始终,原理图如下:
大数据学习(二):Hadoop源码分析_第2张图片

ResourceManager

ResourceManager 通过 ContainerManagementProtocol 通知NodeManager启动 MRAppMaster的详细流程如下图所示:
大数据学习(二):Hadoop源码分析_第3张图片
这其中的事件处理和状态转化的部分可以直观的表示为下图:
大数据学习(二):Hadoop源码分析_第4张图片
大致过程为:
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进度报告过程中的事件流如下图:
大数据学习(二):Hadoop源码分析_第5张图片
大致过程为:
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)

你可能感兴趣的:(大数据)