1 . 请说明application与job之间的关系?
一个Application和一个SparkContext相关联,每个Application中可以有一个或多个Job,可以并行或者串行运行Job。
Spark中的一个Action可以触发一个Job的运行。在Job里面又包含了多个Stage,Stage是以Shuffle进行划分的。在Stage中又包含了多个Task,多个Task构成了Task Set。
帮助参考:http://www.iteblog.com/archives/1183
2 . 在什么情况下会出现新的Stage?
newStage操作对应会生成新的result stage或者shuffle stage:内部有一个isShuffleMap变量来标识该stage是shuffle or result
Spark对stage的划分是按照宽依赖来进行区分的:根据RDD的依赖关系,如果遇到宽依赖则创建ShuffleStage;
(Stage的划分是以ShuffleDependency为依据的,也就是说当某个RDD的运算需要将数据进行Shuffle时,这个包含了Shuffle依赖关系的RDD将被用来作为输入信息,构建一个新的Stage,由此为依据划分Stage,可以确保有依赖关系的数据能够按照正确的顺序得到处理和运算。)
帮助参考:http://www.cnblogs.com/luogankun/p/3826245.html
3 . 简述DAGScheduler的作用?
在Spark中作业调度的相关类最重要的就是DAGScheduler,DAGScheduler顾名思义就是基于DAG图的Scheduler
TaskScheduler负责实际每个具体任务的物理调度,DAGScheduler负责将作业拆分成不同阶段的具有依赖关系的多批任务,可以理解为DAGScheduler负责任务的逻辑调度。
1、接收用户提交的job;
2、将job根据类型划分为不同的stage,记录哪些RDD、Stage被物化,并在每一个stage内产生一系列的task,并封装成TaskSet;
DAGScheduler内部维护了各种 task / stage / job之间的映射关系表。
3、决定每个Task的最佳位置(任务在数据所在的节点上运行),并结合当前的缓存情况;将TaskSet提交给TaskScheduler;
4、重新提交Shuffle输出丢失的Stage给TaskScheduler;
注:一个Stage内部的错误不是由shuffle输出丢失造成的,DAGScheduler是不管的,由TaskScheduler负责尝试重新提交task执行;
5、DAGScheduler最重要的任务之一就是计算作业和任务的依赖关系,制定调度逻辑
帮助参考:http://www.cnblogs.com/luogankun/p/3826245.html
帮助参考:http://blog.csdn.net/colorant/article/details/24010035
基本概念
Task任务 :单个分区数据集上的最小处理流程单元
TaskSet任务集:一组关联的,但是互相之间没有Shuffle依赖关系的任务所组成的任务集
Stage调度阶段:一个任务集所对应的调度阶段
Job作业:一次RDD Action生成的一个或多个Stage所组成的一次计算作业
4 . 简述TaskScheduler的作用?
SparkContext创建过程中会调用createTaskScheduler函数来启动TaskScheduler任务调度器,TaskScheduler会根据部署方式而选择不同的SchedulerBackend来处理,
TaskScheduler类负责任务调度资源的分配,SchedulerBackend负责与Master、Worker通信收集Worker上分配给该应用使用的资源情况。
TaskScheduler是在Application执行过程中,为它进行任务调度的,是属于Driver侧的。对应于一个Application就会
有一个TaskScheduler,TaskScheduler和Application是一一对应的。TaskScheduler对资源的控制也比较鲁棒(所以会取名CoarseGrainedSchedulerBackend),一个Application申请Worker的计算资源,只要Application不结束就会一直被占有。
帮助参考:http://www.aboutyun.com/thread-9392-1-1.html
5 . reduce任务过多或者过少各自会有什么问题?
数量太大,造成很多小任务,增加启动任务的开销;数目太少,任务运行缓慢。
需根据实际情况调节默认配置,调整方式是修改参数spark.default.parallelism(控制Spark中的分布式shuffle过程默认使用的task数量,默认为8个)。通常,reduce数目设置为core数目的2到3倍。