Spark有多种运行模式,如单机(Local)模式、Standalone模式、YARN模式、Mesos模式。
Spark应用程序之间的调度一个Executor在一个时间段内只能给一个应用使用。 # 作业调度 不同线程提交的作业Job可以并行运行。一个作业分为多个Stage。整个RDD DAG为一个Job。action算子中的本质是调用Spark上下文(SparkContext)中的runJob提交了Job。 作业的调度主要有FIFO和FAIR两种模式。
- FIFO模式:先进先出
- fair模式:在fair共享模式调度下,多个作业以轮询(round robin)方式分配资源。考虑到长任务和短任务问题,这样长任务在前,短任务在后,短任务也可以获得不错的响应时间。
# 阶段(Stage)调度 Action算子触发作业的提交,并形成RDD DAG。DAG Scheduler(调度器)负责将RDD DAG转化为Stage(阶段)DAG。Stage的DAG通过最后执行的Stage为根进行广度优先遍历,遍历到最开始执行的Stage并执行,如果提交的Stage仍有未完成的父母Stage,则Stage需要等待其父Stage执行完才能执行。 waitingStages中记录仍有未执行的父母Stage,防止过早执行。runningStages中保存正在执行的Stage,防止重复执行。failedStages中保存执行失败的Stage,需要重新执行,这里的设计是出于容错的考虑。
# 任务(Task)调度 一个应用只有一个任务调度器(TaskScheduler)。所有TaskSetManager都是由这个TaskScheduler调度。一个Stage对也只有一个TaskSetManager。TaskSetManager通过一定次序放入调度池pool中。在调度池中,这些TaskSetMananger又会根据Job ID排序,先提交的Job的TaskSetManager优先调度,然后一个Job内的TaskSetManager ID小的先调度。 在执行任务时,任务分配规则: 按照“尽量将任务分配到数据块所存储的位置”原则分配任务。数据块的存储位置请见4.3.3节。 执行地点的选取: 1) 如果是调用过cache()方法的RDD,则读取内存缓存中分区的数据。 2) 如果在磁盘中,通常最开始的RDD会有相应信息,例如,从HDFS上读取的数据,HDFS分区就是最好的执行地点。 3) 如果不是上面两种情况,将遍历RDD DAG获取第一个窄依赖的父亲RDD对应分区的执行地点。