【Spark工作原理】Spark任务调度理解

Spark内部有若干术语(Executor、JobStage、Task、Driver、DAG等),需要理解并搞清其内部关系,因为这是性能调优的基石。

 

节点类型有:

1. Master 节点: 常驻master进程,负责管理全部worker节点。

2. Worker 节点: 常驻worker进程,负责管理executor 并与master节点通信。

Dirvier:官方解释为: The process running the main() function of the application and creating the SparkContext。即理解为用户自己编写的应用程序

Executor:执行器:

  在每个Worker节点上为某应用启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上,每个job都有各自独立的Executor

  Executor是一个执行Task的容器。它的主要职责是:

  1、初始化程序要执行的上下文SparkEnv,解决应用程序需要运行时的jar包的依赖,加载类。

  2、同时还有一个ExecutorBackend向cluster manager汇报当前的任务状态,有点类似hadoop的tasktracker和task。

  也就是说,Executor是一个应用程序运行的监控和执行容器。Executor的数目可以在submit时,由 --num-executors (on yarn)指定.

Job:  

  包含很多task的并行计算,可以认为是Spark RDD 里面的action,每个action算子的执行会生成一个job。

  用户提交的Job会提交给DAGScheduler,Job会被分解成Stage和Task。

Stage:  

  一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage

  Stage的划分简单来说是以shuffle和result这两种类型来划分。

  在Spark中有两类task,一类是shuffleMapTask,一类是resultTask。第一类task的输出是shuffle所需数据,第二类task的输出是result,stage的划分也以此为依据:shuffle之前的所有变换是一个stage,shuffle之后的操作是另一个stage。例如:

  1) rdd.parallize(1 to 10).foreach(println) 这个操作没有shuffle,直接就输出了,那么只有它的task是resultTask,stage也只有一个;

  2) 如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 这个job因为有reduce,所以有一个shuffle过程,那么reduceByKey之前的是一个stage,执行shuffleMapTask,输出shuffle所需的数据,reduceByKey到最后是一个stage,直接就输出结果了。

  如果job中有多次shuffle,那么每个shuffle之前都是一个stage。

  spark中会引起shuffle的算子有:

  去重distinct、聚合reduceByKey/groupByKey/xxByKey、排序sortByKey、表关联join、重分区Repartition/Coalesce(shuffle=true)等。

Task:

  stage 下的单个任务执行单元。

  一个rdd有多少个partition,就会有多少个task,因为每一个 task 只是处理一个partition上的数据。所以有时为提高执行并行度,使用Repartition或Coalesce(shuffle=true),增多partition数量,从而增多task数量

原文地址:https://www.cnblogs.com/wwcom123/p/10480010.html