Standalone-Client提交任务方式下-Spark程序运行架构图
Spark程序运行架构图
一个Spark程序的运行由Driver Program、SparkContext对象、WorkNode、Work进程、Executor执行器、Task任务和Cluster Manager集群管理器七个组件协同工作。可以把Cluster Manager看作Master结点
-
Driver Program
用户编写的Spark程序称为Driver Program。每个Driver程序包含一个代表运行环境的SparkContext对象。程序的执行从Driver程序开始,所有操作执行结束后回到Driver程序中。
-
SparkContext对象
①每个Driver Program里都有一个SparkContext对象
SparkContext对象联系 cluster manager(集群管理器),从 cluster manager申请任务执行需要的内存和CPU资源;
②和Executor进程交互,完成任务的启动、分配和监控
-
Worker Node
集群上的计算节点,对应一台物理机器
-
Worker进程
①用于和cluster manager进程交互,向cluster manager注册和汇报自身节点的资源使用情况
②管理和启动Executor进程
-
Executor执行器
一个JVM进程,用于运行和计算Task,并将计算结果回传到Driver中
-
Task任务
执行器上执行的最小单元。比如RDD Transformation操作时对RDD内每个分区的计算都会对应一个Task。它会被SparkContxt送到某个Executor上去执行
-
cluster manager 集群管理器
对应Master进程, 接收Driver的资源申请,从收集的资源池中,寻找满足资源条件的worker结点,并告诉Driver,哪台worker结点可以执行当前任务
程序运行调度图
-
SparkContext的调度
Sc的任务调度主要分为DAGScheduler 和 TaskScheduler
调度过程,如下图:
RDD Objects可以理解为用户实际代码中创建的RDD,这些代码逻辑上组成了一个DAG。
DAGScheduler主要负责分析依赖关系,然后将DAG划分为不同的Stage(阶段),其中每个Stage由可以并发执行的一组Task构成
TaskScheduler从DAGScheduler接收Task任务,向cluster Manager 申请资源。集群管理器收到申请后,在集群中寻找满足资源的Worker Node,并启动专属的Executor;
SchedulerBackend与Executor交互,完成Task任务的分配和资源调度,并将结果回传到Driver
-
Spark任务调度代码实现细节
org.apache.spark.scheduler.DAGScheduler
将一个DAG划分为一个一个的Stage阶段(每个Stage是一组Task的集合)
然后把Task Set 交给TaskScheduler模块。
org.apache.spark.scheduler.TaskScheduler
从DAGScheduler接收不同Stage的任务。向Cluster Manager 申请资源。然后Cluster Manager收到资源请求之后,寻找符合条件的Worker,并在该Worker上启动Executor
org.apache.spark.scheduler.SchedulerBackend
向当前等待分配计算资源的Task分配Executor,并且在分配的Executor上启动Task,完成计算的资源调度
AKKA
一个网络通信框架,类似于Netty,在Spark1.8之后已全部替换成Netty