Spark运行架构:
Spark运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行进程(Executor)
与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点:
- 是利用多线程来执行具体的任务(Hadoop MapReduce采用的是进程模型),减少任务的启动开销;
- 是Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,当需要多轮迭代计算时,可以将中间结果存储到这个存储模块里,下次需要时,就可以直接读该存储模块里的数据,而不需要读写到HDFS等文件系统里,因而有效减少了IO开销;或者在交互式查询场景下,预先将表缓存到该存储系统上,从而可以提高读写IO性能。
各部分介绍
-
Application = a driver program + executors on the cluster
应用程序:他包含一个driver和多个executor -
Application jar = a jar containing the user’s Spark application.
-
driver program = The process running the main() function of the application and create SparkContext()
驱动是运行应用程序的main()并创建SparkContext的进程;如果驱动器程序终
止,那么 Spark 应用也就结束了。主要负责:
1)把用户程序转为任务
2)跟踪 Executor 的运行状况
3)为执行器节点调度任务
4) UI 展示应用运行状况 -
cluster manager is an external service for acquiring resources on the cluster
集群管理器 通过cluster manager 去standalone/Mesos/Yarn/K8S/…上申请资源 -
Deploy Mode 主要区别在于,Driver 程序的运行节点
client:Diver run local Driver ;
程序运行在客户端, 适用于交互、调试,希望立即看到 app 的输出
cluster:Driver run Cluster;
Driver 程序运行在由ResourceManager启动的APPMaster,适用于生产环境 -
Executor 相当于 container 容器
A process launched for an application on a worker node,
that runs tasks and keeps data in memory or disk storage across them.
Each application has its own executors.
一个 Executor 可以运行一个Application的多个task;
Spark Executor 是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。
Spark 应用启动时, Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃, Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。主要负责:
1)负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
2)通过自身的块管理器( Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。 RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。 -
Task
A unit of work that will be sent to one executor
1. Task 是最小的工作单元,跑在 Executor 上;
2. 一个partition 就是一个 Task -
job
1. 在Spark上,只要运行一个action 就是一个job
2. job是一个并行的计算,包含多个task -
Stage
1. shuffle会产生stage
2. job stages tasks task是最小的运行单元
3. stage相关是有依赖关系的,如果有依赖关系,stage执行是有先后顺序
4. stage名字是以最后一个算子命名的
Spark 运行注意点
- Each application gets its own executor processes,
it means that data cannot be shared across different Spark applications - Spark is agnostic to the underlying cluster manager.
Spark是不关注底层是运行在哪里的,只要获取了对应的excutor processes,
他们之间就可以通信。这种模式使得一个Cluster Manager 可以对应多个Application - The driver program must listen for and accept incoming connections from its executors
Driver Program 必须和 Executor 网络是通的。一般是将他们放在一个内网里 - driver should be run close to the worker nodes
Driver要尽可能地靠近workernodes