Spark 作业执行过程

1.Spark 运行时架构

在分布式环境下,Spark集群采用的是主从结构。在一个Spark集群中,有一个节点负责中央协调,调度各个分布式工作节点。这个中央协调节点被称为驱动器节点(Driver),与之对应的工作节点被称为执行器节点(Executer)。驱动器节点和所有的执行器节点一起被称为一个Spark应用(Application)

如何执行spark定时任务 spark 指定执行节点_集群管理

Spark应用通过一个**集群管理器(Cluster Manager)**的外部服务在集群中的机器上启动。Spark 自带的集群管理器被称为独立集群管理器。 Spark 也能运行在 Hadoop YARN 和Apache Mesos 这两大开源集群管理器上。

2.驱动器节点(Driver)

Spark驱动器是执行你的程序中的main()方法的进程。

驱动器节点职责:

  1. 把用户程序转为任务
    Spark 驱动器程序负责把用户程序转为多个物理执行的单元,这些单元也被称为任务。从Spark程序中,我们不难看出,Spark程序都是从输入数据创建一系列RDD,再使用转化操作派生出新的RDD,最后使用行动操作收集或存储结果RDD中的数据。Spark程序其实是隐式地创建了一个由操作组成的逻辑上的有向无环图(DAG)。当驱动器程序运行时,它会把这个逻辑图转为物理执行计划。然后Spark就把物理计划转为一系列步骤(Stage),每个步骤包含多个任务。这些任务会被打包发送到集群中。
    这步骤的划分主要是根据**宽依赖(及有一个任务是多个RDD对多个RDD,可理解为Shuffle混洗)**来的,每遇到一个宽依赖划分一个阶段。
  2. 为执行器节点调度任务
    有了物理执行计划之后, Spark 驱动器程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册自己。因此,驱动器进程始终对应用中所有的执行器节点有完整的记录。每个执行器节点代表一个能够处理任务和存储 RDD 数据的进程。
    Spark 驱动器程序会根据当前的执行器节点集合, 尝试把所有任务基于数据所在位置分配给合适的执行器进程。 当任务执行时,执行器进程会把缓存数据存储起来,而驱动器进程同样会跟踪这些缓存数据的位置, 并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输 。

3.执行器节点(Executer)

执行器节点作用:

  1. 它们负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
  2. 它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。 RDD 是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

4.集群管理器

在Spark中集群管理器的作用就是为执行器节点和驱动器节点分配相应的资源并启动执行。

5.运行Spark作业过程

(1) 用户通过 spark-submit 脚本提交应用。

(2) spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法。

(3) 驱动器程序与集群管理器通信,申请资源以启动执行器节点。

(4) 集群管理器为驱动器程序启动执行器节点。

(5) 驱动器进程执行用户应用中的操作。 根据程序中所定义的对 RDD 的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程。

(6) 任务在执行器程序中进行计算并保存结果。

(7) 如果驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。