码迷,mamicode.com
首页 > 其他好文 > 详细

spark内核揭秘-06-TaskSceduler启动源码解析初体验

时间:2015-01-19 19:06:45      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:taskscheduler   coarsegrainedschedul   coarsegrainedexecuto   lanuchtasks   makeoffers   

TaskScheduler实例对象启动源代码如下所示:

技术分享

从上面代码可以看出来,taskScheduler的启动是在SparkContext

技术分享

找到TaskSchedulerImpl实现类中的start方法实现:

技术分享

1、从上代码看到,先启动CoarseGrainedSchedulerBackend,

技术分享

从上面CoarseGrainedSchedulerBackend类的代码,可以看出spark启动了DriverActor,名称为CoarseGrainedScheduler,这是一个akka消息通信类,会先运行preStart()方法

技术分享

从上面代码可以看到,初始化了akka客户端监听,还有最重要的是调用了系统的scheduler调度,参数函数是立即执行调度,间隔1000毫秒,运行ReviveOffers方法

技术分享

进入makeOffers()方法:

技术分享

运行launchTask方法:

技术分享

技术分享

这段代码是spark序列号任务大小超过akkaFrameSize - AkkaUtils.reservedSizeBytes大小,那就报错为”Serialized task %s:%d was %d bytes, which exceeds max allowed: " +
                "spark.akka.frameSize (%d bytes) - reserved (%d bytes). Consider increasing " +
                "spark.akka.frameSize or using broadcast variables for large values.
“ ,此刻会将该任务终止,并将任务从任务列表中移除,这样推荐使用broadcast广播方式

否则,将获取执行任务数据,并减少空闲cpu数,发送消息执行 LaunchTask(new SerializableBuffer(serializedTask))方法,即CoarsedGrainedExecutorBackend类的LaunchTask方法:

技术分享

上面代码 会运行executor 的launchTask方法:

技术分享

TaskRunner就是一个多线程:

技术分享

技术分享

技术分享

代码太多,我就不截图了,其实实际就是根据机器状况,运行task任务

2、然后我们回到TaskSchedulerImpl实现类中的start方法

技术分享

如果isLocal=false and spark.speculation=true,不是local模式,那就要dispatcher分发任务了,默认是100毫秒后立即启动,并间隔100毫秒循环运行,

技术分享

CoarseGrainedSchedulerBackend的reviveOffers:

技术分享


spark内核揭秘-06-TaskSceduler启动源码解析初体验

标签:taskscheduler   coarsegrainedschedul   coarsegrainedexecuto   lanuchtasks   makeoffers   

原文地址:http://blog.csdn.net/stark_summer/article/details/42874467

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!