16、接着上篇文章LocalizationEventType.INIT_CONTAINER_RESOURCES事件被触发,对应ResourceLocalizationService.handle()被执行,分别会创建public、private、application三种资源对应的LocalResourcesTrackerImpl服务,接着LocalResourcesTrackerImpl.handle()被执行
17、然后对应LocalizedResource.handle(ResourceRequestEvent.REQUEST)会被调度执行,用来完成ResourceState状态的转换;
18、进而触发LocalizerTracker.handle()执行,这里会直接触发public和private属性的resource下载,具体就是从hdfs上下载job.xml/job.jar等运行时需要的文件;这里对于所有public资源下载,所有container的资源下载都是由同一个LocalResourcesTracker处理,而私有资源的下载是由一个map维护,key为username,value为对应LocalResourcesTracker,从而实现公有资源所有用户共享,而私有资源是本人可用,不管公有资源还是私有资源下载到本地后,在Nodemanager启动、ResourceLocalizationService初始化时都会将其删除;
优化点:增加mapreduce jar包缓存功能,修改job提交客户端,增加指定jar包属性为public的选项,并支持更新jar包,ResourceLocalizationService下载时先判断本地是否已经有匹配版本的jar包,可以通过项目自带的crc校验来完成,本地已有就直接读取无需下载,没有则从hdfs指定的目录下载到本地公共缓存目录,并且修改ResourceLocalizationService初始化逻辑,让其不要删除本地public jar包,然后在Nodemanager启动时删除本地时间比较长的(比如最近2周没有访问)public jar包,同时在historyserver启用定时任务删除hdfs指定目录中时间长(比如最近2周没有访问)的public jar包
19、当某个container中的某个资源被下载完成后会触发ResourceLocalizedEvent.LOCALIZED事件,从而触发ContainerImpl.handle(ContainerResourceLocalizedEvent.RESOURCE_LOCALIZED)被执行,而该方法会判断该资源所属的container是否下载完成了所有资源(内部维护了一个pending队列表示待下载的资源列表),如果没有全部完成则等待其它资源下载完成,如果已完成则执行ContainersLauncher.handle(ContainersLauncherEvent.LAUNCH_CONTAINER)方法;
20、ContainerLaunch线程被线程池调度执行,最终调用ContainerLaunch.call方法来运行container,同时会初始化LogDirsHandlerService服务,用来分配本地container日志的写入路径,在container运行时在本地写入container-log,当application运行完成时恢复触发相应的applog事件删除本地log,至此整个job运行流程已经完成;
整体流程如下图所示: