Spark 运行架构
2024-06-06 10:27:10 2 举报
Spark 运行架构
作者其他创作
大纲/内容
5. 计算 Job 需要的资源并向 ResourceManager 申请资源
Container
spark-submit --master yarn-clusterspark-submit --master yarn --deploy-mode cluster
Master
反向注册
Executor
NodeManager
Spark YARN Client
Task
4. 注册 Application
创建 TaskSet
Worker
ApplicationMasterExecutorLauncher
找到内部资源至少可以启动一个 Executor 的所有 Worker在这些 Worker 之间分配 Executor
申请资源 Executor
Worker启动 Executor
心跳
7. 反向注册
spark-submit --master spark://node01:7077 --deploy-mode client在 Standalone Client 模式下,如果在 Master 上提交应用,那么 Driver 就在 Master;如果在 Worker 上提交应用,那么 Driver 就在 Worker
3. 与 ApplicationMaster 建立通讯
ApplicationMaster 是 YARN 中的核心概念,任何要在 YARN 上启动的作业类型(包括 MR 和 Spark)都必须有一个 ApplicationMaster。每种计算框架如果想要在 YARN 上执行自己的计算应用,那么就必须自己实现和提供一个 ApplicationMaster ,相当于自己实现 YARN 提供的接口去实现。
Spark Standalone Cluster
启动 Driver
注册 Application
资源满足后
1. 申请启动ApplicationMaster
2. 选择一台 NodeManager 分配一个 Container,在 Container 中开启 ApplicationMaster 进程
- 启动集群后,Worker 节点会向 Master 节点心跳汇报资源(CPU Core 和 Memory)情况;- Client 提交 Application,根据不同的运行模式在不同的位置创建 Driver 进程;- SparkContext 连接到 Master,向 Master 注册应用并申请资源(Executor 的 CPU Core 和 Memory);- Master 根据 SparkContext 的资源申请并根据 Worker 心跳周期内报告的信息决定在哪个 Worker 上分配资源,也就是 Executor;- Worker 节点创建 Executor 进程,Executor 向 Driver 进行反向注册;- 资源满足后(Executor 注册完毕),SparkContext 解析 Applicaiton 代码,创建 RDD,构建 DAG,并提交给 DAGScheduler 分解成 Stage(当碰到 Action 算子时,就会催生 Job,每个 Job 中含有 1 个或多个 Stage),然后将 Stage(或者称为 TaskSet)提交给 TaskScheduler,TaskScheduler 负责将 Task 分配到相应的 Worker,最后提交给 Executor 执行(发送到 Executor 的线程池中);- 每个 Executor 会持有一个线程池,Executor 通过启动多个线程(Task)来执行对 RDD 的 Partition 进行并行计算,并向 SparkContext 报告,直至 Task 完成。- 所有 Task 完成后,SparkContext 向 Master 注销,释放资源。
ResourceManager
spark-submit 脚本yarn-cluster 模式
spark-submit --master yarn-clientspark-submit --master yarn --deploy-mode client
spark-submit 脚本yarn-client 模式
资源满足后(Executor 注册完毕),SparkContext 解析 Applicaiton 代码,创建 RDD,构建 DAG,并提交给 DAGScheduler 分解成 Stage(当碰到 Action 算子时,就会催生 Job,每个 Job 中含有 1 个或多个 Stage),然后将 Stage(或者称为 TaskSet)提交给 TaskScheduler,TaskScheduler 负责将 Task 分配到相应的 Worker,最后提交给 Executor 执行(发送到 Executor 的线程池中);
分配资源
Driver
SparkContext
spark-submit --master spark://node01:7077 --deploy-mode cluster
Client提交 Application
执行到 Action 算子
任务失败的处理情况如下:- Task 在 Executor 线程池中的运行情况会向 TaskScheduler 反馈,当 Task 执行失败时,会由 TaskScheduler 负责重试,将 Task 重新发送给 Executor 去执行,默认重试 3 次。如果重试 3 次依然失败,那么这个 Task 所在的 Stage 就失败了。- Stage 失败了会由 DAGScheduler 来负责重试,会重新发送 TaskSet 到 TaskScheduler,Stage 默认重试 4 次。如果重试 4 次以后依然失败,那么这个 Job 就失败了。Job 失败则 Application 提交失败。- TaskScheduler 不仅能重试失败的 Task,还会重试 Straggling(落后,缓慢)的 Task(也就是执行速度比其他 Task 慢太多的 Task)。如果有运行缓慢的 Task 那么 TaskScheduler 会启动一个新的 Task 来与这个运行缓慢的 Task 执行相同的处理逻辑。两个 Task 哪个先执行完,就以哪个 Task 的执行结果为准。这就是 Spark 的推测执行机制。在 Spark 中推测执行默认是关闭的。推测执行可以通过spark.speculation 属性来配置。
提交 Application
Executor 向 Driver 进行反向注册
6. ResourceManager 通过资源调度器给 Job 分配一些 Container,用来启动 Executor
ApplicationMasterDriver
将 Task 分发到各个 Executor 上执行
找到一个 Worker 启动 Driver 进程
spark-submit 脚本client 模式
Spark YARN Cluster
Spark 通用运行流程
执行 main 函数
2. 选择一台 NodeManager 分配一个 Container,在 Container 中开启 ApplicationMaster 进程,在 ApplicationMaster 中初始化 SparkContext
Stage 划分
触发 Job
Spark Standalone Client
懒执行
Client
0 条评论
下一页