- YARN对不同SparkApplication(SparkContext)的调度
- 同一个SparkAppliction内不同资源池(pool)之间的调度
- 同一个SparkAppliction内同一个资源池(pool)内不同TaskSetManager的调度
- 同一个SparkAppliction内同一个资源池(pool)内同一个TaskSetManager内的Task调度

前置为啥需要资源调度

Spark调度器
Spark调度器是指在同一个SparkApplication内Spark如何对TaskSetManager(图中简写TSM)进行调度,以及同一个TaskSetManager内的Task如何调度。
调度类型
pool之间FIFO/FAIR可以通过spark.scheduler.mode来配置
pool内FIFO/FAIR若spark.scheduler.mode=FIFO,则pool内只能是FIFO,若spark.scheduler.mode=FAIR,pool内可以通过fairscheduler.xml来配置,可以为FIFO或者FAIR
- FIFO
先入先出,后面的TaskSetManager要等比自己先提交的TaskSetManager执行完了才能执行,如果先提交的TaskSetManager要很长很长时间才能执行完,也只能等待。如第一个人提交了一个大SQL,第二个人提交了一个很小的SQL(可能几秒就运行完了),也是需要等待大SQL有资源空出了才能执行。 - FAIR
配置使用流程
- 启动SparkApplication可以执行pool之间的调度策略,通过spark.scheduler.mode来指定(默认FIFO)
- 如果是使用FAIR时,用户启动前还需要提供资源池的配置信息(fairscheduler.xml),
参考如下
<allocations> <pool name="production"> <schedulingMode>FAIR</schedulingMode> <weight>1</weight> <minShare>2</minShare> </pool> <pool name="test"> <schedulingMode>FIFO</schedulingMode> <weight>2</weight> <minShare>3</minShare> </pool></allocations>
- 如果是FAIR,用户提交作业时可指定pool名称,可通过设置spark.scheduler.pool来指定,默认是default
- 如果是FAIR,提交完后Spark会通过FAIR进行pool之间的调度,以及pool内部通过fairscheduler.xml的配置策略调度(如上面xml中test pool内部使用FIFO来调度,而production pool内部使用FAIR来调度)
UI显示


4层调度SparkApplication调度
pool之间的调度
pool内的调度
当spark.scheduler.mode=FAIR,需要用到前面的fairscheduler.xml,通过spark.scheduler.pool来设置提交到哪个pool
TaskSetManager内的Task调度
ROCESS_LOCAL -> NODE_LOCAL -> NO_PREF -> RACK_LOCAL ->ANY的顺序从TaskSetManager中选择Task去这个executor上面执行。
测试测试SQL
大SQL整个SQL执行完耗费时间长
小SQL整个SQL执行完耗费时间短测试环境
测试场景
场景1FIFO无
场景2FAIR大SQL和小SQL分别提交到各自pool
场景3FAIR大SQL和小SQL提交到同一个pool(FIFO/FAIR)
测试结果
- 场景1
小SQL等待大SQL有资源空出(如最后大SQL只剩余几个Task在跑了)才能执行,即需要等待 - 场景2
小SQL不需要等待大SQL空出资源,当大SQL在执行的过程中,小SQL有机会能根据FAIR算法获取到资源执行。 - 场景3
当pool内部调度是FIFO时,小SQL需要等待大SQL资源空出