Yarn源码分析之事件异步分发器AsyncDispatcher

8 篇文章 0 订阅

事件异步分发器AsyncDispatcher

处理流程

  • service初始化时new一个dispatcher用于事件分发
  • dispatcher内部有一个queue用于接收和异步处理事件
  • dispatcher register各种事件类型及事件处理类,事件处理类中有handle方法用于处理时间
  • *

AsyncDispatcher

EventType and Handler

ResourceManager.javaHandle Class
NodesListManagerEventType.classNodesListManager
SchedulerEventType.classSchedulerEventDispatcher
RMAppEventType.classApplicationEventDispatcher
RMAppAttemptEventType.classApplicationAttemptEventDispatcher
RMNodeEventType.classNodeEventDispatcher
RMAppManagerEventType.classRMAppManager
AMLauncherEventType.classApplicationMasterLauncher
ContainerPreemptEventType.classRMContainerPreemptEventDispatcher
RMFatalEventType.classResourceManager.RMFatalEventDispatcher
RMStateStore.javaHandle Class
RMStateStoreEventType.classForwardingEventHandler
ContainerManagerImpl.javaHandle Class
ContainerEventType.classContainerEventDispatcher
ApplicationEventType.classApplicationEventDispatcher
LocalizationEventType.classResourceLocalizationService
AuxServicesEventType.classAuxServices
ContainersMonitorEventType.classContainersMonitor
ContainersLauncherEventType.classContainersLauncher
LogHandlerEventType.classLogHandler
NodeManager.javaHandle Class
ContainerManagerEventType.classContainerManagerImpl
NodeManagerEventType.classNodeManager(this)
ResourceLocalizationService.javaHandle Class
LocalizerEventType.classResourceLocalizationService.LocalizerTracker
MRAppMaster.javaHandle Class
JobEventType.classNoopEventHandler
org.apache.hadoop.mapreduce.jobhistory.EventType.classEventHandler historyService
EventHandler
NoopEventHandler
ContainerAllocator.EventType.classContainerAllocator
JobEventType.classJobEventDispatcher
TaskEventType.classTaskEventDispatcher
TaskAttemptEventType.classTaskAttemptEventDispatcher
CommitterEventType.classEventHandler
Speculator.EventType.classSpeculatorEventDispatcher
ContainerAllocator.EventType.classContainerAllocator
ContainerLauncher.EventType.classContainerLauncher
JobFinishEvent.Type.classEventHandler


MRAppMaster.javaHandle Class
RMStateStoreEvent.classRMStateStore

没有通过异步事件处理器处理的事件

RMContainerImpl.javaHandle Class
RMContainerEventTypeRMContainerImpl

相关资料

StateMachineFactory状态机

概念

状态机由一组状态组成,这些状态大体分为三类,分别为初始状态、中间状态和最终状态。状态机首先由初始状态A开始运行,经过一系列的中间状态后到达最终状态,并在最终状态退出,从而形成一个有向无环图。其状态处理的逻辑是收到一个事件,触发状态A到状态B的转换,而转换操作是由事件对应的hook完成的。

处理流程

  • 状态机初始化
    • 指定状态机初始状态
    • addTransition,transition包括(STATE preState, STATE postState, EVENTTYPE eventType, xxArcTransition hook)
    • 实例化状态机 stateMachine = stateMachineFactory.make(this);
    • 通过上面的异步事件分发器,通过独立的线程获取事件并调应对应处理类的handle方法进行处理。处理过程为根据当前事件类型(type),事件(event),执行对应的hook,并从当前状态(oldState)转换到另一种状态(newState)。

NMClientAsync

  • 作用
    负责和NodeManagers通信,并对NM的response做异步更新

  • 主要功能:

    • startContainer
    • getContainerStatus
    • stopContainer
  • 实现流程
    实现流程

  • 相关代码说明

    • NMClientImpl :new的单例,包含 cmProxy 和startedContainers
    • ContainerManagementProtocolProxy cmProxy : 负责管理所有的NM 连接proxy
    • ContainerManagementProtocolProxy proxy = cmProxy.getProxy() : 根据container的地址,创建和管理RPC proxy:ContainerManagementProtocolProxyData
    • proxy.getContainerManagementProtocol().startContainers(allRequests); rpc启动container
  • 客户端生命周期管理

NMClientAsync asyncClient = 
      NMClientAsync.createNMClientAsync(new MyCallbackhandler());  // 注册消息CallbackHandler() 用于异步处理消息
  asyncClient.init(conf);
  asyncClient.start();
  asyncClient.startContainer(container, containerLaunchContext);
  [... wait for container being started]
  asyncClient.getContainerStatus(container.getId(), container.getNodeId(),
      container.getContainerToken());
  [... handle the status in the callback instance]
  asyncClient.stopContainer(container.getId(), container.getNodeId(),
      container.getContainerToken());
  [... wait for container being stopped]
  asyncClient.stop();
  • AM 启动Container执行堆栈
// AM 执行,主要是通过NMClientAsync.startContainer()来异步启动container

ApplicationMaster::run()
nmClientAsyncImpl::startContainerAsync(container, ctx);  // ctx 包含启动脚本
NMClientAsyncImpl::events.put(new StartContainerEvent(container, containerLaunchContext));
NMClientAsyncImpl::StartContainerTransition::container.nmClientAsync.getClient().startContainer(scEvent.getContainer(), scEvent.getContainerLaunchContext());
NMClientImpl::startContainer()
NMClientImpl::proxy = new ContainerManagementProtocolProxyData(rpc, containerManagerBindAddr,containerId, nmTokenCache.getToken(containerManagerBindAddr));
NMClientImpl::StartContainersResponse response = proxy.getContainerManagementProtocol().startContainers(allRequests);
...

// NodeManager 接收RPC请求,并启动container

ContainerManagementImpl::startContainers(StartContainersRequest requests)
ContainerManagementImpl::startContainerInternal(nmTokenIdentifier, containerTokenIdentifier,request);
ContainerManagementImpl::dispatcher.getEventHandler().handle(new ApplicationContainerInitEvent(container));
ApplicationImpl::InitContainerTransition::app.dispatcher.getEventHandler().handle(new ContainerInitEvent(container.getContainerId()));
...
ContainerImpl::handle(ContainerEvent event)
ContainerImpl::sendLaunchEvent();
ContainerImpl::dispatcher.getEventHandler().handle(new ContainersLauncherEvent(this, launcherEvent));
ContainerLauncher::handle(ContainersLauncherEvent event)
ContainerLauncher::ContainerLaunch launch = new ContainerLaunch(context, getConfig(), dispatcher, exec, app, event.getContainer(), dirsHandler, containerManager);
ContainerLaunch::call()
DefaultContainerExecutor::launchContainer()
Shell::execute() -> run() -> runCommand() // 启动子进程执行任务

相关资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值