Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

血缘关系

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

代码实现

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

依赖关系

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

代码实现

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

窄依赖

窄依赖表示每一个父RDD的Partition最多被子RDD的一个Partition使用,窄依赖我们形象的比喻为独生子女。

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

宽依赖

宽依赖表示同一个父RDD的Partition被多个子RDD的Partition依赖,会引起Shuffle,总结:宽依赖我们形象的比喻为超生。

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

依赖小结

具有宽依赖的 transformations 包括: sort, reduceByKey, groupByKey, join, 和调用rePartition函数的任何操作.
宽依赖对 Spark 去评估一个 transformations 有更加重要的影响, 比如对性能的影响.

Job调度

  1. 一个Spark应用包含一个驱动进程(driver process,在这个进程中写Spark的逻辑代码)和多个执行器进程(executor process,跨越集群中的多个节点)。Spark 程序自己是运行在驱动节点, 然后发送指令到执行器节点。
  2. 一个Spark集群可以同时运行多个Spark应用, 这些应用是由集群管理器(cluster manager)来调度。
  3. Spark应用可以并发的运行多个job, job对应着给定的应用内的在RDD上的每个 action操作。每次执行一个行为算子都会触发一个Job

Spark应用

一个Spark应用可以包含多个Spark job, Spark job是在驱动程序中由SparkContext 来定义的。
当启动一个 SparkContext 的时候, 就开启了一个 Spark 应用。 一个驱动程序被启动了, 多个执行器在集群中的多个工作节点(worker nodes)也被启动了。 一个执行器就是一个 JVM, 一个执行器不能跨越多个节点, 但是一个节点可以包括多个执行器。
一个 RDD 会跨多个执行器被并行计算. 每个执行器可以有这个 RDD 的多个分区, 但是一个分区不能跨越多个执行器.

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

Spark Job的划分

由于Spark的懒执行, 在驱动程序调用一个action之前, Spark 应用不会做任何事情,
针对每个action,Spark 调度器就创建一个执行图(execution graph)和启动一个 Spark job。
每个 job 由多个stages 组成, 这些 stages 就是实现最终的 RDD 所需的数据转换的步骤。一个宽依赖划分一个stage。每个 stage 由多个 tasks 来组成, 这些 tasks 就表示每个并行计算, 并且会在多个执行器上执行。

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

Stage任务划分

  1. DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环。原始的RDD通过一系列的转换就形成了DAG,根据RDD之间的依赖关系的不同将DAG划分成不同的Stage,对于窄依赖,partition的转换处理在Stage中完成计算。对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算,因此宽依赖是划分Stage的依据。例如,DAG记录了RDD的转换过程和任务的阶段。

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

  1. RDD任务切分中间分为:Application、Job、Stage和Task
    (1)Application:初始化一个SparkContext即生成一个Application;
    (2)Job:一个Action算子就会生成一个Job;
    (3)Stage:Stage等于宽依赖的个数加1;
    (4)Task:一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。
    注意:Application->Job->Stage->Task每一层都是1对n的关系。

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

查看Job过程

查看http://localhost:4040/jobs/
Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

查看Stage个数

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

查看Task个数

Spark中RDD的血缘关系|依赖关系|窄依赖|Job调度|Stage任务划分|查看job、stage、task个数界面

总结

  1. task: 只有任务提交的时候才会产生task,而task的数量是由这个任务提交的时候最后一个RDD分区个数决定,如果是两个分区,则task数量为2,前面如果有三个分区,那么其中一个task会多处理一个分区,而task还是只有两个。
  2. 如果存在shuffle过程,系统会自动进行缓存,UI界面显示skipped的部分