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