Spark:spark在集群中的运行机制
1.Spark运行时架构
Spark可以在各种各样的集群管理器(Hadoop Yarn、Apache Mesos,还有spark自带的独立集群管理器)上运行。Spark集群采用的是主从结构,在一个spark集群中,有一个节点负责*协调,调度各个分布式工作节点。这个*协调节点被称为驱动器节点(driver),与之对应的工作节点被称为执行器节点(executor)。驱动器节点可以和大量的执行器节点进行通信,它们也都作为独立的Java进程进行。驱动器节点和所有的执行器节点一起被称为一个Spark应用,如下图所示:
Spark应用通过一个叫作集群管理器的外部服务在集群中的机器上启动。
2.驱动器节点
Spark驱动器是执行你的程序中的Main()方法的进程,它执行用户编写的用来创建SparkContext、创建RDD,以及进行RDD转换操作和行动操作的代码。
驱动器程序在Spark应用中有以下两个职责。
-
把用户程序转换为任务
Spark驱动器程序负责把用户程序转换为多个物理执行的单元,这些单元也叫作任务,这些任务最终会被打包并送到集群中,由各执行器节点运行。这里再扩充一下spark将程序转换为任务的机制:Spark程序确实隐式的根据你的代码的操作步骤创建出了一个由操作组成的逻辑上的有向无环图(Directed Acyclic Graph,简称DAG),当驱动器程序运行时,它会把这个逻辑图转换为具体的物理执行计划,这些计划经过优化以后转为一系列步骤,而每一个步骤又由多个任务组成,这些任务最重被送到集群 - 为执行器节点调度任务
有了物理执行计划以后,Spark驱动器程序必须在各执行器进程间协调任务的调度。
3.执行器节点
Spark执行器节点是一种工作进程,负责在Spark作业中运行任务,任务间相互独立。Spark应用启动时,执行器节点就被同时启动,并且伴随着整个Spark应用的生命周期。
执行器节点有以下两个作用:
- 负责运行组成Spark应用的任务,并将结果返回给驱动器进程。
- 通过自身的块管理器为用户程序中需要缓存的RDD提供内存式存储。RDD是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
4.集群管理器
这里以yarn集群为例,有两种将Spark应用连接到集群的模式:客户端模式以及集群模式。在客户端模式下驱动器程序运行在提交应用的机器上,而在集群模式下,驱动器程序和执行器进程均运行在Yarn容器内部。你可以通过spark-submit的–deploy-mode参数设置不同的模式。