深入理解 Spark(二)SparkApplication 提交和运行源码分析

spark 核心流程

在这里插入图片描述

yarn-client在这里插入图片描述

yarn-cluster

在这里插入图片描述

spark 任务调度

spark stage 级别调度

在这里插入图片描述

spark task 级别调度

失败重试和白名单

对于运行失败的 Task,TaskSetManager 会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调度的 Task 池子中等待重新执行,当重试次数过允许的最大次数,整个 Application失败。在记录 Task 失败次数过程中,TaskSetManager 还会记录它上一次失败所在的 ExecutorId 和 Host,这样下次再调度这个 Task 时,会使用黑名单机制,避免它被调度到上一次失败的节点上,起到一定的容错作用。

spark 的任务提交源码剖析

spark 中 DAG 引擎的设计

在这里插入图片描述

spark 的 runtime 运行环境

在这里插入图片描述

面向 DAG 调度的 DAGScheduler

1、主要作用:维护 waiting jobs 和 active jobs 两个队列,维护 waiting stages、active stages 和 failed stages,以及与 jobs 的映射关系。
2、工作机制:DAGScheduler 拿到一个 JOB, 会切分成多个 Stage,从 job 的后面往前寻找 shuffle 算子。如果找到一个 shuffle 算子,就切开,已经找到的 RDD 的执行链就自成一个 Stage,放入到一个栈中。将来 DAGScheduler 要把这个栈中的每个 stage 拿出来,提交给 TaskScheduler。
3、核心描述

  • 一个 Application = 多个 job
  • 一个 job = 多个 stage,也可以说一个 application = 多个 stage
  • 一个 Stage = 多个同种 task 并行运行
  • Task 分为 ShuffleMapTask 和 ResultTask
  • Dependency 分为 ShuffleDependency 宽依赖 和 NarrowDependency 窄依赖
  • 面向 stage 的切分,切分依据为宽依赖

面向 Task 调度的 TaskScheduler

TaskScheduler:DAGScheduler 把 Stage 变成 TaskSet,然后交由 TaskScheduler 执行任务分发
1、TaskScheduler 本身是个接口,Spark 里只实现了一个 TaskSchedulerImpl,理论上任务调度可以定制。
2、维护 task 和 executor 对应关系,executor 和物理资源对应关系,在排队的 task 和正在跑的 task。
3、维护内部一个任务队列,根据 FIFO 或 Fair 策略,调度任务。
4、TaskScheduler 有两个重要的成员变量:
(1)DAGScheduler:负责 job 中的 stage 切分,
(2)SchedulerBackend:执行 Task 的分发

SparkContext / SparkSession

无所不包容的一个容器,spark App 在运行过程中的,各种信息都存储在 SparkContext 中。SparkContext / SparkSession 是 Spark Application 运行时上下文对象,包含了很多其他功能组件。
1、SparkContext 是用户通往 Spark 集群的唯一入口,可以用来在 Spark 集群中创建 RDD、累加器 Accumulator 和广播变量 Braodcast Variable,但是你想要的功能,你问他就行。
2、SparkContext 也是整个 Spark 应用程序中至关重要的一个对象,可以说是整个应用程序运行调度的核心(不是指资源调度)
3、SparkContext 在实例化的过程中会初始化 DAGScheduler、TaskScheduler 和 SchedulerBackend
4、SparkContext 会调用 DAGScheduler 将整个 Job 划分成几个小的阶段(Stage),TaskScheduler 会调度每个 Stage 的任务 (Task) 应该如何处理。另外,SchedulerBackend 管理整个集群中为这个当前的应用分配的计算资源 (Executor)

SparkConf + SparkEnv

SparkConf 是 Spark 中用来管理配置一个的管理类,类似于 Hadoop 中的 Configuration。
SparkEnv 是 Spark Application 在运行的时候,所需要的各种功能组件的一个整合体,类似于 Hadoop 中的 Context。
在这里插入图片描述

Spark Runtime 组件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spark Application 应用程序编写规范

1、重点:获取程序编写入口 SparkContext:new SparkContext(sparkConf)(新版本: SparkSession.getOrCreate();)
2、通过 SparkContext 来加载数据源得到数据抽象对象:RDD
3、针对数据抽象对象 RDD 调用各种算子执行各种逻辑计算:lazy,延迟到 action 的内部来执行
4、重点:调用 action 算子触发任务的提交执行:sparkContext.runJob()
5、处理结果并且关闭资源

Spark Application 应用程序执行流程详解

Spark Application 提交执行过程中的消息交互,大致如下:在通过 spark-submit 提交一个 App 运行的时候,其实是执行 SparkSubmit 这个类,启动 Client,在它的内部,启动一个 RPC 客户端。
最容易造成误解的两个概念:

  • Worker Server Node 一台硬件服务器
  • Worker JVM Process 一个 Spark 集群的 从节点 JVM 守护进程

简单版

在这里插入图片描述

详细版

在这里插入图片描述

01、理解业务,了解 Spark 编程,编写业务代码实现
02、将应用程序项打成 jar 包
03、通过 spark-submit 脚本来提交,在提交的时候,可以指定资源系统类型
04、执行 SparkSubmit 类的 main ()
05、在标准的 Spark Standalone 集群中:转交给 ClientApp 的类来执行,如果是 Spark on yarn,则客户端类是:YarnClusterApplication
06、会在 ClientApp 内部初始化 CLientEndponit(存在于client中) 的组件:发送 RequestSubmitDriver 给 Master
07、Master 处理 RequestSubmitDriver 消息: 注册 Driver, 启动 Driver,返回 SubmitDriverResponse 消息给 ClientApp 的 CLientEndponit
08、启动 Driver: java DriverWrapper 这个类,转到: DriverDrapper main() 方法
09、通过反射的方式启动和执行我们自己写的业务代码的 main() 方法: JavaWordCount.main()
10、自己编写的业务代码中的第一句代码: 初始化 SparkSessoin(SparkConf, SparkContext)
11、初始化 SparkContext: TaskScheduler SchedulerBackend(DriverEndpoint CLientEndpoint) DAGScheduler
12、应用注册:ClientEndpoint 发送 RegisterApplication 消息给 Master, 返回 RegisteredApplication
13、Master 发送消息 LaunchExecutor 给 Worker, 启动 Executor(真正启动的是:ExecutorBackend)
14、Executor 启动了,则初始化一个线程池,等待 Driver 分发任务过来,由线程池执行,Executor 启动好了之后,会向 Driver 注册,同时也会向 Master 反馈
15、当一个 Spark job 的 Driver 和 Executor 都启动好了之后,那么意味着 Spark Context 的初始化就搞定了
16、接下来就是 Action 算子执行,触发 job 的提交:sparkContext.runJob();
17、SparkContext 中的 DAGScheduler 对应用代码构建的 DAG 进行 stage 切分
18、SparkContext 中的 TaskScheduler 对当前 Stage 进行提交执行:发送 LaunchTask 消息给 Executor,在 Executor 中的一个线程中启动一个 Task

spark-submit 脚本分析

在这里插入图片描述

DAGScheduler 异步模型

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker构建MySQL8.0镜像】

Docker构建MySQL8.0镜像 部署流程1. 拉取docker镜像2. 创建数据卷,存放MySQL数据3. 启动MySQL镜像4. 初始化sql放入MySQL镜像5. 执行MySQL脚本6. MySQL镜像打包7. MySQL镜像迁移 部署流程 1. 拉取docker镜像 docker pull mysql:8.0.35拉取成功后就可以看到镜像了&…

NFS(Network File System 网络文件服务)

一,nfs 简介 1,nfs 性质 NFS(Network File System 网络文件服务) 文件系统(软件)文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议 通过使用 NFS 协议,客户机可以像访问本地目录一样…

【NI国产替代】NI-9231,8通道,51.2 kS/s/ch,-5至5 V,C系列声音和振动输入模块

8通道,51.2 kS/s/ch,-5至5 V,C系列声音和振动输入模块 NI-9231是一款高密度声音和振动模块,能够测量来自速度计、转速计和接近式探针等集成电子压电(IEPE)和非IEPE传感器的信号。该模块可以执行现代麦克风和加速计所需的高动态范围…

verilog编程题

verilog编程题 文章目录 verilog编程题序列检测电路(状态机实现)分频电路计数器译码器选择器加减器触发器寄存器 序列检测电路(状态机实现) module Detect_101(input clk,input rst_n,input data,o…

力扣每日一练(24-1-15)

重复n次检查&#xff0c;几乎都用双指针。。。 固然双指针就是题解&#xff1a; if len(nums) < 3:return len(nums)p1 2 for p2 in range(2, len(nums)):if nums[p2] ! nums[p1 - 2]:nums[p1] nums[p2]p1 1return p1 可以重复两次&#xff0c;那么隔一个检查就行&#…

vtk9.3 配置 visual studio 2019 运行环境 和运行实例详解

&#xff08;1&#xff09;包含文件配置&#xff1a; 项目--属性--VC目录&#xff0c;在包含目录中把include文件夹的地址加进去&#xff0c;一直要到下一级 vtk-9.3目录下&#xff0c; 小知识&#xff1a; 在Visual Studio 2019中运行项目时&#xff0c;如果项目中使用了第三…

网络安全笔记-SQL注入

文章目录 前言一、数据库1、Information_schema2、相关函数 二、SQL注入分类1、联合查询注入&#xff08;UNION query SQL injection&#xff09;语法 2、报错注入&#xff08;Error-based SQL injection&#xff09;报错注入分类报错函数报错注入原理 3、盲注布尔型盲注&#…

【Java 设计模式】创建型之抽象工厂模式

文章目录 1. 定义2. 应用场景3. 代码实现4. 应用示例结语 在软件开发中&#xff0c;抽象工厂模式是一种常见的创建型设计模式&#xff0c;它提供了一种创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。抽象工厂模式的核心思想是将一组相关的产品组合成…

docker screen 常用基础命令

1.docker基础命令 1.1开启docker systemctl start docker #开启docker service docker restart #重启docker systemctl stop docker #关闭docker 1.2查看命令 docker images #查看docker镜像docker ps #查看正在运行的镜像或者容器docker ps -a #查看所有容器1.3运…

刘知远LLM入门到实战——自然语言基础

文章目录 自然语言处理基础词表示语言模型N-gram ModelNeural Language Model: 为什么NLP等领域的模型越来越大&#xff1f; 大模型会带来哪些新的范式和挑战&#xff1f; 自然语言处理基础 让计算机理解人类语言&#xff0c;图灵测试就是基于对话的方式。 研究历史&#xff…

FlinkAPI开发之处理函数

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 之前所介绍的流处理API&#xff0c;无论是基本的转换、聚合&#xff0c;还是更为复杂的窗口操作&#xff0c…

cron表达式大全

简介 Cron表达式是一种用于指定定时任务的时间表达式&#xff0c;常用来指定任务的执行时间、执行频率和执行间隔。它由6&#xff5e;7个字段组成&#xff0c;分别表示秒、分、时、日期、月份、星期、年份&#xff08;可省略&#xff09;。 Cron表达式基本语法如下&#xff1a;…

人工智能 | ChatGPT 和文心一言哪个更好用?

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 ChatGPT 和文心一言哪个更好用&#xff1f; ChatGPT 和文心一言哪个更好用&#xff1f;方向一&#xff1a;ChatGPT主要优势局限性和挑战如何克服chatGPT的局限性和挑战…

全罐喂养一个月多少钱?适合全罐喂养的猫罐头推荐

不少铲屎官一直没有办法get到猫罐头对猫咪的好处&#xff0c;或者get到了又觉得给猫咪买猫罐头好贵&#xff0c;看到其他铲屎官都开始全罐喂养了&#xff0c;但是自己却迟迟下不了手&#xff0c;犹犹豫豫的不知道全罐喂养一个月多少钱&#xff1f; 今天&#xff0c;铲龄15年的…

Python实现Excel切片删除功能(附源码)

使用Python实现Excel中的“切片删除”功能&#xff08;附源码&#xff09; 先上效果图&#xff01;&#xff01;&#xff01; 如下是需要处理的Excel文件&#xff0c;可以看到在27行和117行处的E列存在数据不一致情况&#xff0c;需进行“切片删除” 运行结果图如下&#xff…

【前端架构】前端通用架构

一个强大的前端通用架构应该具备多种能力&#xff0c;以支持现代化的应用程序开发和提高开发效率。以下是一些前端通用架构应该具备的关键能力&#xff1a; 模块化和组件化&#xff1a;支持模块化开发和组件化架构&#xff0c;能够将应用拆分为独立的模块和组件&#xff0c;以便…

leetcode 2418. 按身高排序

题目 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 解题方法&#xff…

Go新项目-为何选Gin框架?(0)

先说结论&#xff1a;我们选型Gin框架 早在大概在2019年下旬&#xff0c;由于内部一个多线程上传的需求&#xff0c;考虑到Go协程的优势&#xff1b; 内部采用Gin框架编写了内部的数据上传平台BAP&#xff0c;采用GinVue开发&#xff0c;但前期没考虑到工程化思维&#xff0c;导…

Vue3入门

文章目录 一、Vue3介绍二、Vue3项目创建1&#xff09;使用vue-cli创建vue3项目2&#xff09;使用vite创建vue3项目 三、Setup函数vue2的创建vue实例和vue3创建vue实例的区别 四、ref和reactive1&#xff09;ref函数2&#xff09;reactive函数3&#xff09;reactive对比ref4&…

苹果最新系统iOS 17的调试和适配方法 - Xcode 14.3.1 真机调试指南

最近苹果发布了iOS 17作为其最新操作系统版本&#xff0c;作为开发者&#xff0c;你可能需要了解如何在Xcode 14.3.1中进行真机调试和适配。本文将为你详细介绍步骤和注意事项。 I. 检查Xcode版本 在开始之前&#xff0c;确保你已经安装了Xcode 14.3.1或更高版本。你可以在Xco…