spark源码解析4-任务提交流程

  1. 在任务启动时,sparksubmit已经通过反射的方式调用了用户提交任务的主类中的main方法,所以,本节以wordcount为例讲解
  2. 在wordcount中主要由以下几步:
    1. 创建SparkConf,设置名字
    2. 创建SparkContent,书写程序
    3. 程序逻辑,启动任务
    4. 停止任务
  3. 所以最重要的源码分析应该在new SparkContent()这个步骤里
    1. 在281行定义了createSparkEnv()方法,用来创建sparkEnv,但是还没
    2. 在526行定义了createTaskScheduler()方法,创建了taskscheduler
      1. 匹配master的模式,SPARK_REGEX(sparkUrl)为standalone模式
      2. 创建TaskSchedulerImpl 
        1. 定义initialize()方法,接受参数为SchedulerBackend;逻辑中定义调度器类型(默认是FIFO),在创建rootPool等
        2. 定义start()方法,创建executor的通信actor
      3. 创建SparkDeploySchedulerBackend()
      4. 执行TaskSchedulerImpl 的initialize方法,将SparkDeploySchedulerBackend最为参数传入
      5. 返回SparkDeploySchedulerBackend和TaskSchedulerImpl 
    3. 在529行new DAGScheduler(this),创建了DAGScheduler
      1. new DAGSchedulerEventProcessLoop()
        1. 定义inRecive()方法,调用doOnRecive()方法
        2. 定义doOnRecive()方法中匹配任务方式
          1. 匹配JobSubmit,调用dagScheduler.handleJobSubmitted()
      2. new DAGScheduler()最后一行,1473行调用eventProcessLoop.start()
        1. 调用父类EventLoop的start()方法
          1. 在父类的start()方法中,调用onStart()方法
          2. 然后调用线程eventThread()的start()方法
          3. 启动线程的run()方法
            1. 从队列中获取事件
            2. 回调DAGSchedulerEventProcessLoop的onRecive()方法处理事件
    4. 调用TaskSchedulerImpl 的start()方法
    1. 调用子类SparkDeploySchedulerBackend的start方法,因为在init方法中已经传入了子类
    2. SparkDeploySchedulerBackend的start方法中:
      1. 调用父类CoarseGrainedSchedulerBackend的start方法
        1. 注册driverEndPoint
        2. new DriverEndPoint()
          1. 执行onstart()
            1. 定期接收任务,向自己发送ReviveOffers的case object
            2. 调用makeOffers()方法
            3. 在makeOffers()方法中,调用launchTask()
            4. 在launchTask()中,判断集群是否有资源,决定是否发送任务
            5. 发送任务到CoarseGrainedExecutorBackend
            6. 在 CoarseGrainedExecutorBackend中提交任务
    1. 创建AppClient()
      1. 创建ClientEndPoint,用于和master通信
    2. 调用AppClient的start()方法,创建AppClient的endpoint
posted @ 2016-12-20 11:23  花心土豆  阅读(261)  评论(0编辑  收藏  举报