前言
1.此博客是自学源码,主要通过时序图来展示,这样看起来流程更加直观
2. hadoop版本:3.1.1
3.我文字表达能力不强,所以才画图的。画图不易请多多支持
正文
1.从main函数开始
MapReduce的 AM启动的主类是MRAppMaster。main流程完全画起来比较复杂,都是部分流程的见图。以下图省略AM的个子服务。可以看到main方法主要逻辑很简单,就是serviceinit和serviceStart。
2.serviceinit方法MRAppMaster子服务的流程
MRAppMaster方法serviceinit中会调用 CompositeService(此为MRAppMaster 父类) 中的serviceinit。serviceinit方法会让所有子服务serviceinit。同样在子服务的serviceinit中也会调用 super.serviceInit,这样相当于一个递归。让所有服务以及子服务,子服务的子服务都初始化。建议放大屏幕看。
3.serviceStart方法MRAppMaster子服务调用的流程
MRAppMaster方法serviceStart与serviceInit类似。一个递归,让所有服务,子服务以及子服务的子服务都start。图上有一定解释,可以看到大部分都会走异步处理。把消息存储到eventQueue。然后会异步线程循环消费eventQueue
以上序列图仅仅是把方法调用流程罗列一遍,其实以上没累出AM启动的主要时间驱动。没法看到AM的完成流程。接下来慢慢给大家展示
4.main 方法启动五个主要的事件
main线程会产生五个事件:AM_STARTED,JOB_INIT,JOB_CREATE,JOB_QUEUE_CHANGED,JOB_START。以下有两张序列图第一张主要描述事件如何产生的。第二张图主要突出事件如何处理的,并且包含部分事件推进。详细请点开大图看
5.对AM_STARTED事件处理
对AM_STARTED事件处理如下流程。主要处理业务在JobHistoryEventHandler类中。JobHistoryEventHandler主要是处理历史日志相关操作。此外处理很多其他事件例如JOB_INIT 同步转换事件为JOB_SUBMITTED ,而JOB_SUBMITTED 事件相关业务也在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事件
9.对T_SCHEDULE事件处理
对T_SCHEDULE事件处理如下流程。主要处理业务在TaskImpl的内部类中类中,一个事件对应一个内部类。下图罗列两种事件T_SCHEDULE和T_RECOVER。像T_SCHEDULE会生成TA_SCHEDULE 事件,T_RECOVER会生成TA_RECOVER事件。
10. 对TA_SCHEDULE 事件处理
对TA_SCHEDULE 事件处理如下流程。主要处理业务在TaskAttemptImpl的内部类中类中,一个事件对应一个内部类。像TA_SCHEDULE会生成CONTAINER_REQ事件
11. 对CONTAINER_REQ事件处理
对CONTAINER_REQ事件处理如下流程。主要处理业务在RMContainerAllocator匿名类处理类处理,RMContainerAllocator主要处理Container 相关事件。CONTAINER_REQ事件会把相关分配请求存储到Ask。
12.MapReduce AM 向RM的心跳
心跳把Ask,黑名单提交到RM。处理心跳返回结果,例如NM及节点变更,处理完成测container,处理reduce,MA任务是立即执行的,而reduce任务是MR运行完成或者一定比例完成才运行的,需要调度一下。心跳会生成很多事件,其中包含TA_ASSIGNED。
13.对TA_ASSIGNED事件处理
有第10步对TA_SCHEDULE 事件处理中的序列图可知,TA_ASSIGNED事件会生成CONTAINER_REMOTE_LAUNCH事件
14.对CONTAINER_REMOTE_LAUNCH事件处理 -向NM启动容器
对CONTAINER_REMOTE_LAUNCH事件处理如下流程。主要处理业务在EventProcessor类处理,此类主要是与NM上容器相关,例如启动,关闭,清理等。
总结:
通过以上14个步骤已经把AM的启动流程讲完,主要是通过事件推动进行的,其中包括MRAppMaster和其子服务如何初始化和启动,如何通过状态演进实现申请资源,启动容器,如何调度map和reduce任务等功能。虽然没有讲到服务,容器如何关闭,但是功能都很相似,而且时序图都包含大概内容。
原创不易,特别是画序列图很麻烦,需要耗费大量时间和精力。希望大家能喜欢,如果有问题可以留言评论