MapReduce AM 源码流程查看-时序图展示

前言

  1.此博客是自学源码,主要通过时序图来展示,这样看起来流程更加直观

  2. hadoop版本:3.1.1

  3.我文字表达能力不强,所以才画图的。画图不易请多多支持

正文

 1.从main函数开始

MapReduce的 AM启动的主类是MRAppMaster。main流程完全画起来比较复杂,都是部分流程的见图。以下图省略AM的个子服务。可以看到main方法主要逻辑很简单,就是serviceinit和serviceStart。

AM源码流程时序简图1

2.serviceinit方法MRAppMaster子服务的流程

     MRAppMaster方法serviceinit中会调用  CompositeService(此为MRAppMaster 父类) 中的serviceinit。serviceinit方法会让所有子服务serviceinit。同样在子服务的serviceinit中也会调用 super.serviceInit,这样相当于一个递归。让所有服务以及子服务,子服务的子服务都初始化。建议放大屏幕看。

AM子服务在serviceinit方法内调用流程

3.serviceStart方法MRAppMaster子服务调用的流程

      MRAppMaster方法serviceStart与serviceInit类似。一个递归,让所有服务,子服务以及子服务的子服务都start。图上有一定解释,可以看到大部分都会走异步处理。把消息存储到eventQueue。然后会异步线程循环消费eventQueue

AM serviceStart方法个子服务的流程

以上序列图仅仅是把方法调用流程罗列一遍,其实以上没累出AM启动的主要时间驱动。没法看到AM的完成流程。接下来慢慢给大家展示


4.main 方法启动五个主要的事件

main线程会产生五个事件:AM_STARTED,JOB_INIT,JOB_CREATE,JOB_QUEUE_CHANGED,JOB_START。以下有两张序列图第一张主要描述事件如何产生的。第二张图主要突出事件如何处理的,并且包含部分事件推进。详细请点开大图看

AM时序图1-main启动主要5个事件

 

状态处理1

5.对AM_STARTED事件处理

      对AM_STARTED事件处理如下流程。主要处理业务在JobHistoryEventHandler类中。JobHistoryEventHandler主要是处理历史日志相关操作。此外处理很多其他事件例如JOB_INIT 同步转换事件为JOB_SUBMITTED ,而JOB_SUBMITTED 事件相关业务也在JobHistoryEventHandler处理。相当于每一个事件流程,在历史日志就会有对应的操作。祥看序列图

JobHistoryEventHandler

6.对JOB_CREATE事件处理


     JOB_CREATE事件主要还是在推测执行上。请看第四步序列图。推测执行略以后会单独叙述,

7.对JOB_START事件处理

     JOB_CREATE事件处理又会重新生成JOB_INITED,JOB_INFO_CHANGED,JOB_SETUP 三个事件,请看第四步序列图

 

main 方法启动五个主要的事件已经叙述完,其中AM_STARTED,JOB_INIT,JOB_QUEUE_CHANGED由JobHistoryEventHandler处理。JOB_CREATE主要是推测执行,JOB_START接下来会继续跟踪。


8.对JOB_SETUP 事件处理

       对JOB_SETUP 事件处理如下流程。主要处理业务在EventProcessor类中。主要是处理job相关事件。例如JOB_COMMIT,JOB_ABORT,TASK_ABORT。JOB_SETUP事件会生成T_SCHEDULE和T_RECOVER事件

CommitterEventHandler匿名线程

9.对T_SCHEDULE事件处理

    对T_SCHEDULE事件处理如下流程。主要处理业务在TaskImpl的内部类中类中,一个事件对应一个内部类。下图罗列两种事件T_SCHEDULE和T_RECOVER。像T_SCHEDULE会生成TA_SCHEDULE 事件,T_RECOVER会生成TA_RECOVER事件。

TaskImpl-内部类事件处理

10. 对TA_SCHEDULE 事件处理

对TA_SCHEDULE 事件处理如下流程。主要处理业务在TaskAttemptImpl的内部类中类中,一个事件对应一个内部类。像TA_SCHEDULE会生成CONTAINER_REQ事件

TaskAttemptImpl-内部类事件处理

11. 对CONTAINER_REQ事件处理 

      对CONTAINER_REQ事件处理如下流程。主要处理业务在RMContainerAllocator匿名类处理类处理,RMContainerAllocator主要处理Container 相关事件。CONTAINER_REQ事件会把相关分配请求存储到Ask。

RMContainerAllocator匿名类处理状态

12.MapReduce AM 向RM的心跳

       心跳把Ask,黑名单提交到RM。处理心跳返回结果,例如NM及节点变更,处理完成测container,处理reduce,MA任务是立即执行的,而reduce任务是MR运行完成或者一定比例完成才运行的,需要调度一下。心跳会生成很多事件,其中包含TA_ASSIGNED。

RMCommunicator-AllocatorRunnable-心跳

13.对TA_ASSIGNED事件处理 

      有第10步对TA_SCHEDULE 事件处理中的序列图可知,TA_ASSIGNED事件会生成CONTAINER_REMOTE_LAUNCH事件

14.对CONTAINER_REMOTE_LAUNCH事件处理 -向NM启动容器

        对CONTAINER_REMOTE_LAUNCH事件处理如下流程。主要处理业务在EventProcessor类处理,此类主要是与NM上容器相关,例如启动,关闭,清理等。

ContainerLauncherImpl

总结:

      通过以上14个步骤已经把AM的启动流程讲完,主要是通过事件推动进行的,其中包括MRAppMaster和其子服务如何初始化和启动,如何通过状态演进实现申请资源,启动容器,如何调度map和reduce任务等功能。虽然没有讲到服务,容器如何关闭,但是功能都很相似,而且时序图都包含大概内容。

 

原创不易,特别是画序列图很麻烦,需要耗费大量时间和精力。希望大家能喜欢,如果有问题可以留言评论

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值