最后更新于
最后更新于
从全局的框架角度来看, spark的位置如下:
spark的上方是向用户开放的各种接口API, 下方是分布式运行的框架, 可以运行在spark本身提供的分布式运行框架上, 即以独立运行模式(Standalone)工作, 也可以借助其他的分布式框架运行, 如常见的YARN架构. 除此之外, spark也需要运行在分布式存储架构上, 如HDFS等.
先从spark结构的基础概念入手.
Client: 用户使用的机器环境
Master
Worker
Driver: 创建SparkContext, 运行Application中用户编写的main函数. SparkContext为spark应用程序的运行准备了环境, 同时负责与ClusterManager进行通信, 进行资源的申请, 任务的分配和监控等. 通常SparkContext就代表着Driver.
ClusterManager: 本质是外部服务, 作用是获取集群中的资源. 因此可以直观地理解YARN中的ResourceManager可以承担此角色. Spark在不同的模式下运行时, 不同的组间承担此角色:
Standalone: spark原生的资源管理, 由Master负责资源的分配
YARN: Yarn中的ResourceManager
WorkerNode: 集群中任何可以运行Application代码的节点.
Standalone: 通过slave文件配置的Worker节点
YARN: NoteManager结点
Appliction: 指用户编写的Spark应用程序, 包含:
Driver功能的代码
分布在集群中多个节点上运行的Executor代码
Job: 由Spark中的Action动作触发生成一个Job, 因此一个Application中往往会产生多个Job. 每个Job包含多个Task组成的并行计算.
Stage: 每个Job会被拆分成多组Task, 成为一个TaskSet, 称为一个Stage.
Stage的划分和调度是由DAGScheduler来负责的
Stage分为Shuffle Map Stage和Result Stage两种, Stage的边界就是发生shuffle的地方
Task: 被送到某个Executor上的工作单元, 是运行Application的基本单位. 多个Task组成一个Stage.
Task的调度和管理等是由TaskScheduler负责
SparkContext的整体架构和作用如下图所示:
DAG Graph: 首先将用户编写的spark代码中包含的RDD对象的关系, 翻译成DAG Graph
DAGScheduler: DAGScheduler根据Job, 将原有的DAG图划分为多个Stage, 构成基于Stage的DAG, 并提交Stage给TASkScheduler.
划分Stage的依据是: RDD之间的依赖的关系找出开销最小的调度方法
当碰到Action操作时, 就会催生Job; 每个Job中含有1个或多个Stage, Stage一般在获取外部数据和shuffle之前产生
TaskScheduler: 将TaskSet交给WorkerNode运行, WorkerNode中的每个Executor运行什么Task就是在此处分配的. TaskScheduler还维护着所有Task的运行标签, 重试失败的Task.
当Executor向Driver发生心跳时, TaskScheduler会根据资源剩余情况分配相应的Task
Spark框架的组成图如下:
整个执行流程图如下图: