Blog
spark-04 运行架构
Spark运行架构
运行架构
- Driver表示master负责管理整个集群中作业任务调度
- 图形中的Executor则是slave,负责实际执行任务
Driver
spark驱动器节点,用于执行spark任务中的main方法,负责实际代码的执行工作
- 将用户程序转换为作业job
- 在executor之间调度任务task
- 跟踪executor的执行情况
- 通过UI展示查询运行情况
所谓的Driver就是驱使整个应用运行起来的程序,也称之为Driver类
Executor
executor是集群中工作节点worker中的一个JVM进程,负责在spark作业中运行具体任务task,任务彼此之间相互独立,spark应用启动时,executor节点被同时启动,并始终伴随整个spark应用的生命周期存在
核心功能:
- 负责运行组成spark应用的任务,并将结果返回给驱动器进程
- 通过自身的块管理器(Block Manger)为用户程序中要求缓存的RDD提供内存式存储
- RDD是直接混存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算
Master 和 Worker
对比yarn类似
- master -> resourceManager
- worker -> nodeManager
ApplicationMaster
计算组件Driver executor
资源组件Master Worker
Hadoop用户向Yarn集群提交应用程序时,提交程序中应该包含ApplicationMaster用于向资源调度器申请执行任务的资源容器Container,运行用户自己的程序任务job,监控整个任务的执行,跟踪任务的状态处理任务失败等异常情况
核心概念
Executor和Core
在提交应用中可以提供参数指定计算节点的个数,以及对应的资源
这里的资源一般指的是工作节点Executor的内存大小和使用虚拟CPU核(Core)数量
应用程序相关启动参数如下:
名称 | 说明 |
--num-executors | 配置Executor的数量 |
--executor-memory | 配置每个Executor的内存大小 |
--executor-cores | 配置每个Executor的虚拟CPU的core数量 |
如果只有一核模拟多核则实际使用的是多线程
并行度
多个任务分布在不同节点同时进行计算实现并行执行,将整个集群并行执行任务的数量称之为并行度
- 并发
并行
提交流程
Spark应用程序提交到Yarn环境中执行的时候,一般会有两种部署执行的方式:Cluster和Client
两种模式主要区别在于:Driver程序的运行节点位置。
Yarn Client模式
Client模式将用于监控和调度的Driver模块在客户端执行,而不是yarn中,一般用于测试
- Driver在任务提交的本地机器上运行
- Driver启动后会和ResourceManager通讯申请启动ApplicationMaster
- ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,AM向ResourceManager申请Executor内存
- ResourceManager接到ApplicationMaster的资源申请后会分配container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程
- Executor进程启动后会向Driver反向注册,Executor全部注册完成后,Driver开始执行main函数
- 之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分stage,每个stage生成对应的TaskSet,之后将task分发到各个Executor上执行
Yarn Cluster模式
Cluster模式将用于监控和调度的Driver模块启动在Yarn集群资源中执行,一般应用于生产环境
- 在Yarn Cluster模式下,任务提交后会和ResourceManager通讯申请启动ApplicationMaster
- 随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时ApplicationMaster就是Driver
- Driver启动后向ResourceManager申请Executor内存,ResourceManager接到ApplicationMaster的资源申请后会分配container,然后在合适的NodeManager上启动Executor进程
- Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数
- 之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的TaskSet,之后将task分发到各个Executor上