spark集群组成及执行流程
一. spark集群组成
Spark集群由集群管理器(Cluster Manager)、工作节点(Worker)、执行器(Executor)、驱动器(Driver)、应用程序(Application)等部分组成。
1、Driver:该进程执行Spark程序的 main 方法, 负责实际代码的执行工作。
1)启动 SparkContext或SparkSession,将用户程序转化为作业(Job);
2)在 Executor 之间调度任务(Task);
3)跟踪 Executor 的执行情况;
4)通过 UI 展示查询运行情况;
2、Cluster Manager:该进程负责对整个集群资源的分配与管理,不负责对 Executor 的资源的分配.
1)常见的集群管理工具有Yarn、Mesos、Kubernetes、Standalone
2)在YARN部署模式下为ResourceManager
3、Worker: 负责启动和管理 Executor,在YARN部署模式下为NodeManager
4、Executor:负责执行具体的任务,Executor运行在Executor Backend容器中,一个Executor Backend有且仅有一个 Executor对象。
1)向Driver认领属于自己的任务,接收任务后负责运行Spark Task,并将结果返回给Driver
2)通过自身的Block Manager为用户程序中要求缓存的 RDD 提供内存式存储。
二、Spark整体执行流程:
DAGScheduler:用来把一个 Job 根据RDD之间的依赖关系划分为多个Stage,在划分stage时,最后一个Stage是ResultStage,前面所有的stage被称为ShuffleMapStage,ShuffleMapStage的结束,伴随着shuffle文件的写磁盘
TaskScheduler:将TaskSet提交给Worker运行,每个Executor运行什么Task就是在此处分配的。
1、整体执行流程
1)用户将spark程序提交给Driver,Driver负责运行spark程序的main方法,创建SparkContext,SparkContext根据RDD的依赖关系生成逻辑执行图
2)当执行到action算子会请求DAGScheduler,DAGScheduler会先创建一个Job ,然后对job进行切分,根据RDD的依赖关系划分为多个Stage(每个Stage对应一个Taskset,TaskSet中Task的个数由 Stage中的最大分区数决定)
3)DAGScheduler请求TaskScheduler调度这些Taskset,TaskScheduler先去询问集群中有多少资源,资源通过SchedulerBackend返回
4)TaskScheduler 会通过 ClusterManager 将 Task 调度到 Executor 上执行,先调度ShuffleMapTasks,再去调度ResultTasks。
5)ResultTasks执行结束,将执行结果汇报给Driver。
2、逻辑执行图
逻辑执行图描述一组RDD及依赖关系,也就是数据如何流动,如何计算(数据处理和存储的过程表达)
查看:RDD.toDebugString
1)RDD逻辑图边界:从第一个RDD的创建开始到Action算子执行之前结束
2)RDD如何生成:继承RDD实现RDD的五大属性来提供自己的特有功能
- HadoopRDD:重写分区列表(HadoopRDD对应HDFS文件block),重写计算函数(通过计算函数读取block)
- MapPartitionRDD:重写计算函数(处理整个RDD的数据)
3)RDD依赖关系的判断依据
- 如果分区间一对一是窄依赖,
- 如果分区间是多对一,要看是否有数据分发,也就是看是否有shuffle
4)窄依赖(NarrowDependency)的类别
- OneToOneDependency
- RangeDependency: union算子
多对一窄依赖:重分区算子coalesce
宽窄依赖的核心区别是: 窄依赖的RDD可以放在一个 Task 中运行
3、物理执行图
物理执行图描述的是RDD流程生成以后, 如何计算和运行的问题,也就是如何把RDD放在集群中执行的问题
- 从最后一个
RDD
, 也就是逻辑图中最右边的RDD
开始, 向前滑动Stage
的范围, 为Stage0
- 遇到
ShuffleDependency
断开Stage
, 从下一个RDD
开始创建新的Stage
, 为Stage1
- 新的
Stage
按照同样的规则继续滑动, 直到包裹所有的RDD
4
、如何运行
1)job和Stage的关系:
一个Job有多个stage,Stage之间是串行的,Stage
之间的边界由 Shuffle
操作来确定
Stage
内的RDD
之间都是窄依赖, 可以放在一个管道中执行- 而
Shuffle
后的Stage
需要等待前面Stage
的执行
Stage
有两种
ShuffMapStage
, 其中存放窄依赖的RDD
ResultStage
, 每个Job
只有一个, 负责计算结果, 一个ResultStage
执行完成标志着整个Job
执行完毕
2)Stage
和Task
的关系
- 一个
Stage
就是一组并行的Task
集合 - Task 是 Spark 中最小的独立执行单元, 其作用是处理一个 RDD 分区
- 一个 Task 只可能存在于一个 Stage 中, 并且只能计算一个 RDD 的分区
3)TaskSet
- 一个
Stage
有一个TaskSet
TaskSet
中Task
的个数由Stage
中的最大分区数决定
总结:Job > Stage > Task
,Job 中包含 Stage 中包含 Task