Spark层级结构关系
1. 一个Spark环境可以运行多个Application
- Spark环境(集群)支持多个并行运行的应用程序,每个应用程序是一个独立的Spark实例。每个应用有自己的Driver进程和一组分配的Executor。
2. 一个代码运行起来,会成为一个Application
- 当用户提交一段Spark代码时,这段代码在集群中启动,成为一个Application。
SparkContext
会被创建,负责与集群管理器交互,调度资源并控制任务执行。
3. Application内部可以有多个Job
- Application 中会包含多个Job,每当用户在代码中调用一个Action(如
collect()
、count()
等)时,就会生成一个Job。
- 每个Job代表一个具体的计算任务,通常是由一连串RDD的转换操作触发的。
4. 每个Job由一个Action产生,并且每个Job有自己的DAG执行图
- 当某个Action操作被触发时,Spark会生成一个作业(Job),并构建一个**DAG(有向无环图)**来表示RDD之间的依赖关系。每个Job都有自己独立的DAG图,它描述了从数据读取到最终输出的所有计算步骤。
5. 一个Job的DAG图会基于宽依赖和窄依赖划分成不同的阶段(Stage)
- DAG图中的依赖关系可以分为两类:窄依赖和宽依赖。
- 窄依赖:数据的传递只涉及当前节点的少量数据,不需要跨节点进行传输。
- 宽依赖:需要跨节点进行数据交换(如
shuffle
操作)。这种操作会将Job划分为多个Stage。
- 一个Job的DAG会根据这些依赖关系划分成多个阶段,每个阶段代表可以并行执行的一组任务。
6. 不同阶段内基于分区数量,形成多个并行的执行管道
- 在每个Stage中,RDD的数据会按分区(Partition)进行处理。每个Stage的任务会按RDD的分区数生成多个并行的执行管道。
- 每个分区对应一个独立的Task,这些Task在集群的不同Executor上并行执行,处理不同的数据分片。
7. 每一个执行管道形成一个Task
- 一个Stage中的每个RDD分区都会被进一步分割为多个Task。Task是Spark中最小的执行单元,负责对分区中的数据执行具体的操作。
- 任务调度系统(TaskScheduler)负责将这些Task分配到集群中的各个Executor上执行。
8. DAG调度器划分Job为TaskSet
- DAG调度器(DAGScheduler)在划分Job时,会将其划分为多个Stage。每个Stage内部的多个Task形成一个TaskSet。TaskSet是一个逻辑上的任务集合,包含一个Stage中所有的Task。
- TaskSet中的所有Task可以并行执行,TaskScheduler会监控并调度TaskSet中的任务。
层级结构总结:
- Spark集群可以运行多个Application。
- Application是用户提交的Spark作业。
- Application内部可以有多个Job,每个Action会产生一个Job。
- Job生成一个DAG执行图,表示RDD的依赖关系。
- Job的DAG图会根据依赖关系被划分成多个Stage。
- 每个Stage基于分区划分成多个并行的执行管道。
- 每个分区形成一个Task,是并行执行的最小单位。
- DAG调度器会将一个Job划分为多个TaskSet,其中每个TaskSet包含一个Stage内的多个Task,最终由TaskScheduler进行调度执行。