Spark | 调度器&调度池&调度策略

Spark在提交应用程序执行时会根据RDD依赖关系生成DAG图,然后交给DAGScheduler进行划分作业和调度阶段。而对于多个作业之间的调度,Spark提供两种调度策略:FIFO模式(默认模式) & FAIR模式。

其中调度策略执行过程如下:

创建调度池:在TaskSchedulerImpl.initialize()中先创建根调度池rootPool对象,然后根据系统配置的调度模式创建调度器,对调度策略实例化FIFOSchedulableBuilder或FairSchedulableBuilder,最终用调度创建器的buildPools方法在根调度池rootPool下创建调度池。

往调度池加入调度内容:在TaskSchedulerImpl.submitTasks()中先把调度阶段拆分为任务集即TaskSet,然后把TaskSet交给管理器TaskSetManager,最后把TaskSet的TaskSetManager加入到调度池中,等待分配执行。

注意:在FIFO中农由于创建器的buildPools为空,则根调度池rootPool并没有下级调度池,而是直接包含了一组TaskSetManager;而FAIR中根调度池rootPool中包含了下级调度池,这些下级调度池在包含了一组TaskSetManager。

提供已排序的任务集管理器:在TaskSchedulerImpl.resourceOffers()中进行资源分配时,会从根调度池rootPool获取已经排序好的任务管理器,排序算法基于两种调度策略FIFOSchedulingAlgorithm或FiarSchedulingAlgorithm的comparator提供:

FIFO:由于根调度池rootPook直接包含了多个作业的任务管理器,首先比较作业优先级(作业编号越小则优先级越高),如果是同一作业,则再次比较调度阶段优先级(调度阶段编号越小则优先级越高);

FIAR:包含两层调度,第一层中根调度池rootPool包含了下级调度池Pool,第二层为下级调度池包含了多个TaskSetManager。$SPARK_HOME/conf/fairscheduler.xml为读取配置参数的默认路径,其中两个参数分别是minShare(最小任务数)和weight(任务的权重),这两个参数都用来设置第一层级的调度算法,另一个参数schedulingMode用来设置第二层调度算法。

 

实例学习:

https://blog.csdn.net/weixin_30294709/article/details/98440543

https://www.cnblogs.com/yankang/p/9786251.html

https://www.cnblogs.com/xupccc/p/9544610.html

 

发布了44 篇原创文章 · 获赞 11 · 访问量 5447

猜你喜欢

转载自blog.csdn.net/Sampson_Hugo/article/details/103390339