Spark 源码系列 - EventLoop

结论

  1. EventLoop是一个调度,其内部使用LinkedBlockingDeque类型的eventQueue对象,存储待处理的任务。
  2. 死循环调度线程 eventThread 不停的查询 eventQueue 中的新数据。
  3. 通过post方法, 提交任务到队列中。
  4. EventLoop -> onReceive方法回调 内部类的方法 DAGScheduler -> DAGSchedulerEventProcessLoop -> onReceive

EventLoop -> eventQueue 核心对象

private[spark] abstract class EventLoop[E](name: String) extends Logging {
  private val eventQueue: BlockingQueue[E] = new LinkedBlockingDeque[E]()

EventLoop -> eventThread

  private[spark] val eventThread = new Thread(name) {
    setDaemon(true)
    override def run(): Unit = {
      try {
        // 没有外界停止的信号,就不停的从队列中获取数据,回调处理方法。
        while (!stopped.get) {
          val event = eventQueue.take()
          try {
            onReceive(event)
          }
          ...
  }

EventLoop -> start

  def start(): Unit = {
    ...
    // 启动死循环线程
    eventThread.start()
  }

EventLoop -> post

  def post(event: E): Unit = {
    ...
        // 提交任务到队列中
        eventQueue.put(event)
        ...
posted @ 2022-05-29 11:36  608088  阅读(55)  评论(0编辑  收藏  举报