yarn 设计之 Dispatcher 

Dispatcher是yarn代码中使用场景比较多的一个类,整体的设计思路是一个生产者和消费者模型,不过支持的多生产者和多消费者的模式。
不同的生产者和消费者之间通过一个Map<Class<? extends Enum>, EventHandler> eventDispatchers 来映射,数据传递通过一个无界的BlockingQueue来持有,消费是启动一个Thread来做处理。Thread是同步的根据注册的类型,切换不同的handler来处理,这个过程是同步的。
所有的handler实现EventHandler接口或者是MultiListenerHandler,MultiListenerHandler的实现是为了满足一个事件有不同的事件通知,其中EventHandler是一对一的消息模型,MultiListenerHandler是一对多的消息模型。
事件继承AbstractEvent类
具体实现上有 MultiThreadedDispatcher、AsyncDispatcher两种
AsyncDispatcher:单线程的事件生产和消费消息
MultiThreadedDispatcher : 持有多个AsyncDispatcher,也就是一个AsyncDispatcher集合,添加事件时候通过轮训的方式添加到对应的AsyncDispatcher中,每个AsyncDispatcher维护自己的异步消费线程。
落地的场景有以下几种:
ResourceManager — AsyncDispatcher
————————————————
注册的事件类型 –> 事件的处理类
RMAppEventType –> ApplicationEventDispatcher
RMAppAttemptEventType –> ApplicationAttemptEventDispatcher
NodesListManagerEventType –> NodesListManager
SchedulerEventType –> SchedulerEventDispatcher
RMNodeEventType –> NodeEventDispatcher
RMAppManagerEventType –> RMAppManager
AMLauncherEventType –> ApplicationMasterLauncher
RMFatalEventType –> ResourceManager.RMFatalEventDispatcher
RMApplicationHistoryWriter — MultiThreadedDispatcher
————————————————
WritingHistoryEventType –> ForwardingEventHandler
dispatcher个数 :yarn.resourcemanager.history-writer.multi-threaded-dispatcher.pool-size=10
SystemMetricsPublisher — MultiThreadedDispatcher
————————————————
SystemMetricsEventType –> ForwardingEventHandler
dispatcher个数 :yarn.resourcemanager.system-metrics-publisher.dispatcher.pool-size=10
CommonNodeLabelsManager — AsyncDispatcher
————————————————
NodeLabelsStoreEventType –> ForwardingEventHandler
NodeManager — AsyncDispatcher
————————————————
ContainerManagerEventType –> ContainerManagerImpl
NodeManagerEventType –> NodeManager
ContainerManagerImpl — AsyncDispatcher
————————————————
ContainerEventType –> ContainerEventDispatcher
ApplicationEventType –> ApplicationEventDispatcher
LocalizationEventType –> ResourceLocalizationService
ContainersMonitorEventType –> ContainersMonitor
ContainersLauncherEventType –> ContainersLauncher
LogHandlerEventType –> LogHandler
SharedCacheUploadEventType –> SharedCacheUploadService
ResourceLocalizationService 复用的是ContainerManagerImpl的AsyncDispatcher
————————————————
LocalizerEventType –> LocalizerTracker
如果发现AsyncDispatcher 异步下发性能不够的话,一般会看到这个日志
Size of event-queue is 1000
Size of event-queue is 2000
说明下游的handler处理性能不行了
原生的日志里面有一个问题,不好的点就是 不知道是哪块的逻辑处理性能不行,日志只到AsyncDispatcher级别,有点烦人

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>