Spark调度底层执行原理详解(第35天)

系列文章目录

一、Spark应用程序启动与资源申请
二、DAG(有向无环图)的构建与划分
三、Task的生成与调度
四、Task的执行与结果返回
五、监控与容错
六、优化策略

文章目录

  • 系列文章目录
  • 前言
  • 一、Spark应用程序启动与资源申请
    • 1. SparkContext的创建
    • 2. 资源申请
  • 二、DAG(有向无环图)的构建与划分
    • 1. DAG的构建
    • 2. DAG的划分
    • 3. DAG的调度执行
    • 4. DAG调度的优化
  • 三、Task的生成与调度
    • 1. Task的生成
    • 2. Task的调度
  • 四、Task的执行与结果返回
    • 1. Task的执行
    • 2. 结果的返回
  • 五、监控与容错
    • 1. 监控
    • 2. 容错
  • 六、优化策略
    • 1. 内存计算
    • 2. 智能Shuffle机制
    • 3. 资源管理与调度


前言

Spark调度底层执行原理是一个复杂而精细的过程,它涉及到多个组件的交互和协同工作,以实现大数据处理的高效性和灵活性。本文主要对Spark调度底层执行原理进行详细解析。

  • Spark调度底层执行原理详解图
    在这里插入图片描述

一、Spark应用程序启动与资源申请

1. SparkContext的创建

当Spark应用程序启动时,首先会创建SparkContext对象。SparkContext是Spark的入口点,负责初始化与资源管理器(如YARN、Mesos等)的连接,注册应用,并请求分配Executor资源。

2. 资源申请

SparkContext向资源管理器注册并向其申请运行Executor。资源管理器分配Executor资源后,启动Executor进程。这些Executor是Spark在每个Worker节点上启动的进程,负责执行具体的Task。

二、DAG(有向无环图)的构建与划分

Spark的DAG(Directed Acyclic Graph,有向无环图)调度原理是Spark作业调度机制的核心部分,它负责将复杂的作业分解成可并行执行的任务集,并通过任务调度器进行高效执行。以下是Spark DAG调度原理的详细解释:
在这里插入图片描述

1. DAG的构建

用户代码中包含Transformations(转换操作)和Actions(行动操作)时,Spark会构建一个DAG来表示RDD(弹性分布式数据集)之间的依赖关系。这些依赖关系决定了数据处理的流程。

  • RDD的依赖关系:
    在Spark中,RDD(弹性分布式数据集)是数据处理的基本单位。RDD之间的依赖关系决定了数据处理的流程和顺序。这些依赖关系是有向的,总是由子RDD指向父RDD。
  • DAG的生成:
    当用户提交一个Spark作业时,Spark会根据RDD之间的依赖关系构建一个DAG。这个DAG表示了作业中所有RDD之间的转换和行动操作,以及它们之间的数据流动关系。

2. DAG的划分

  • DAG Scheduler负责将DAG划分为多个Stage(阶段)。Stage的划分依据是RDD依赖关系中的宽依赖(如shuffle操作)。宽依赖标志着数据重分布的需求,自然成为Stage的边界。每个Stage包含一组可以并行执行的Task。
  • Stage的划分:
    如果RDD之间的依赖是窄依赖(即一个父RDD的分区只会被一个子RDD的分区使用),则它们会被划分到同一个Stage中。如果依赖是宽依赖(即一个父RDD的分区会被多个子RDD的分区使用,通常涉及shuffle操作),则会在宽依赖处进行Stage的划分。
    Task的生成:
    每个Stage会被进一步划分为多个Task(任务)。这些Task是Spark实际执行的最小单元,它们将被分发到集群中的Executor上执行。

3. DAG的调度执行

  1. Task的提交与执行:
    DAG Scheduler将划分好的Stage提交给Task Scheduler。Task Scheduler负责将Stage中的Task分发到集群的Executor上执行。Executor多线程地执行Task,每个线程负责一个Task。
  2. 执行结果的收集:
    当Task执行完成后,会将结果返回给Task Scheduler。Task Scheduler将结果汇总后,通知DAG Scheduler。DAG Scheduler根据Task的执行结果和Stage的依赖关系,决定是否提交下一个Stage执行。
  3. 容错与重试:
    如果某个Task执行失败,Task Scheduler会负责重试该Task。如果某个Stage中的所有Task都执行失败,DAG Scheduler会重新提交该Stage执行。这种容错机制保证了Spark作业的健壮性和可靠性。

4. DAG调度的优化

  1. 本地性优化:
    Spark在调度Task时,会尽量将Task分配到存储了所需数据的节点上执行,以减少数据的网络传输开销。这种本地性优化策略提高了Spark作业的执行效率。
  2. 资源动态分配:
    Spark支持资源的动态分配,即根据作业的执行情况和集群的负载情况动态调整Executor的数量和资源。这种动态分配策略有助于充分利用集群资源,提高资源利用率。
    综上所述,Spark的DAG调度原理是一个复杂而高效的过程,它通过将作业分解成可并行执行的Stage和Task,并利用DAG Scheduler和Task Scheduler进行高效的调度执行。同时,Spark还通过本地性优化和资源动态分配等策略来优化DAG调度的性能。

三、Task的生成与调度

1. Task的生成

DAG Scheduler将每个Stage转换为一个或多个TaskSet(任务集),Task Scheduler负责将这些TaskSet分配到各个Executor上执行。

2. Task的调度

Task Scheduler接收DAG Scheduler提交过来的TaskSet,并将Task分发到集群中的Executor上运行。Executor多线程地执行Task,每个线程负责一个Task。

四、Task的执行与结果返回

1. Task的执行

Task在Executor上执行,处理数据,并将结果返回给Driver。对于ShuffleMapTask,计算结果会写入BlockManager中,并返回给DAG Scheduler一个MapStatus对象,存储BlockManager的基本信息,这些信息将成为下一个阶段任务获取输入数据的依据。

2. 结果的返回

对于ResultTask(最终任务),返回的是func函数的计算结果。这些结果会被发送到Driver端,供用户程序进一步处理或展示。

五、监控与容错

1. 监控

DAGScheduler监控Job与Task的完成情况,通过回调函数接收TaskScheduler的通知,了解任务的开始、结束、失败等信息,以维护作业和调度阶段的状态信息。

2. 容错

如果某个Executor失败,DAGScheduler会根据RDD的依赖关系重新计算丢失的分区。Spark通过RDD的Lineage(血统)进行容错,确保数据的完整性和一致性。

六、优化策略

1. 内存计算

Spark利用内存进行计算加速,通过存储RDD的分区在内存中来避免频繁的磁盘读写。这大大提高了数据处理的效率。

2. 智能Shuffle机制

在涉及宽依赖的Stage间,数据需经过Shuffle过程重分布。Spark使用了基于排序的Shuffle机制,优化了数据处理的效率和内存使用。

3. 资源管理与调度

Spark通过智能的资源管理与调度策略,如FIFO调度策略等,确保任务的高效执行。同时,Spark还优化了数据处理的本地性,优先安排Task在数据所在的节点上执行,以减少网络传输和提高执行效率。
综上所述,Spark调度底层执行原理是一个复杂而精细的过程,它通过高度优化的DAG执行模型、内存计算、智能的Shuffle机制和强大的资源管理与调度策略,实现了大数据处理的高效性和灵活性。

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

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

相关文章

力扣1111.有效括号的嵌套深度

力扣1111.有效括号的嵌套深度 栈模拟 对于每个括号求出深度 奇数深度存入A&#xff0c;偶数深度存入B这样最大程度降低最大深度 class Solution {public:vector<int> maxDepthAfterSplit(string s) {//因为栈中只会存(的数量 所有用一个变量即可int d 0;vector<i…

Python | Leetcode Python题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; class Solution:def countDigitOne(self, n: int) -> int:# mulk 表示 10^k# 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;# 但为了让代码看起来更加直观&#xff0c;这里保留了 kk,…

C语言内存管理深度解析面试题及参考答案(2万字长文)

在嵌入式面试时,C语言内存管理是必问面试题,也是难点,相关知识点可以参考: C语言内存管理深度解析​​​​​​​ 下面整理了各种类型的C语言内存管理的面试题: 目录 全局变量和局部变量在内存中分别存储在哪个区域? 静态变量和全局变量有什么区别? 什么是作用域?…

ORM Bee,如何使用Oracle的TO_DATE函数?

ORM Bee,如何使用Oracle的TO_DATE函数? 在Bee V2.4.0,可以这样使用: LocaldatetimeTable selectBeannew LocaldatetimeTable();Condition conditionBF.getCondition();condition.op("localdatetime", Op.ge, new TO_DATE("2024-07-08", "YYYY-MM-DD&…

如何选择适合的分布式锁技术

1. Redis锁 优势&#xff1a; 性能高&#xff1a;Redis作为内存数据库&#xff0c;读写速度非常快&#xff0c;因此Redis锁在性能上表现优异。 实现方便&#xff1a;Redis提供了丰富的命令集&#xff0c;可以方便地实现分布式锁的逻辑。 劣势&#xff1a; 可靠性&#xff1a…

Excel第31享:基于left函数的截取式数据裂变

1、需求描述 如下图所示&#xff0c;在“Excel第30享”中统计2022年YTD各个人员的“上班工时&#xff08;a2&#xff09;”&#xff0c;需要基于工时明细表里的“日期”字段建立辅助列&#xff0c;生成“年份”字段&#xff0c;本文说明“年份”字段是怎么裂变而来的。 下图为…

systemverilog的关联数组

关联数组定义 在 SystemVerilog 中&#xff0c;关联数组&#xff08;Associative Arrays&#xff09;是一种非常灵活的数据结构&#xff0c;它可以使用任意类型的键&#xff08;key&#xff09;来索引数组中的元素。这使得关联数组特别适合于实现类似哈希表&#xff08;hash t…

图像处理:使用 OpenCV-Python 卡通化你的图像(2)

一、说明 在图像处理领域&#xff0c;将图像卡通化是一种新趋势。人们使用不同的应用程序将他们的图像转换为卡通图像。如今&#xff0c;玩弄图像是许多人的爱好。人们通常会点击图片并添加滤镜或使用不同的东西自定义图像并将其发布到社交媒体上。但我们是程序员&#xff0c;…

后端老鸟的前端初探:心得与领悟20240713

&#x1f389; 后端老鸟的前端初探&#xff1a;心得与领悟 &#x1f680; 作为一名深耕后端多年的开发者&#xff0c;我最近踏上了前端探索的征程。这段跨界之旅让我有了许多深刻的心得与领悟&#xff0c;现在我想和大家细细分享&#xff1a; 前端技术的飞速更新 &#x1f68…

godis源码分析——Redis协议解析器

前言 redis这个目录下的所有代码就是为了一个事情&#xff0c;就是适配redis。 流程 redis下的基本流程 源码 在redis/client/client.go 主要是客户端处理 package clientconst (created iotarunningclosed )type B struct {data chan stringticker *time.Ticker }// …

Docker安装RabbitMQ(带web管理端)

1.拉取带web管理的镜像 可以拉取rabbitmq对应版本的web管理端&#xff0c;比如&#xff1a;rabbitmq:3.9.11-management&#xff0c;也可以直接拉取带web管理端的最新版本 rabbitmq:management. docker pull rabbitmq:3.9.11-management 注意&#xff1a;如果docker pull ra…

sqlalchemy使用with_entities返回指定数据列

sqlalchemy使用with_entities返回指定数据列 在 SQLAlchemy 中,with_entities 方法用于指定查询语句返回的实体(Entity)或列(Column)。它允许你限制查询的返回结果,只包含你感兴趣的特定字段或实体 使用方法 假设有一个名为 User 的 SQLAlchemy 模型类,包含以下字段:…

Unity3D中如何降低游戏的Drawcall详解

在Unity3D游戏开发中&#xff0c;Drawcall是一个至关重要的性能指标&#xff0c;它指的是CPU通知GPU绘制一个物体的命令次数。过多的Drawcall会导致游戏性能下降&#xff0c;因此优化Drawcall的数量是提高游戏性能的关键。本文将详细介绍Unity3D中降低Drawcall的几种主要方法&a…

设计模式使用场景实现示例及优缺点(行为型模式——模板方法模式)

模板方法模式&#xff08;Template Method Pattern&#xff09; 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法的骨架&#xff0c;将算法的一些步骤延迟到子类中。这样可以在不改变算法的结构的前提下…

Git使用介绍教程

Git使用介绍教程 小白第一次写博客,内容写的可能不是很详细,仅供参考,大家一起努力 gitee网址:https://gitee.com 大部分的开发团队都以 Git 作为自己的版本控制工具,需要对 Git 的使用非常的熟悉。这篇文章中本人整理了自己在开发过程中经常使用到的 Git 命令,方便在偶…

jenkins系列-06.harbor

https://github.com/goharbor/harbor/releases?page2 https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz harbor官网&#xff1a;https://goharbor.io/ 点击 Download now 链接&#xff0c;会自动跳转到上述github页面&am…

C++ | Leetcode C++题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong l…

Redis系列命令更新--Redis哈希命令

一、设置密码验证&#xff1a; 使用文本编辑器&#xff0c;这里使用Notepad&#xff0c;打开Redis服务配置文件。 注意&#xff1a;不要找错了&#xff0c;通常为redis.windows-service.conf&#xff0c;而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置…

使用个人p12证书请求https接口数据

依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency>code package com.hexin.cbas.test;import org.apache.commons.net.util.TrustM…

《BASeg: Boundary aware semantic segmentation for autonomous driving》论文解读

期刊&#xff1a;Neural Networks | Journal | ScienceDirect.com by Elsevier 年份&#xff1a;2023 代码&#xff1a;https://github.com/Lature-Yang/BASeg 摘要 语义分割是自动驾驶领域街道理解任务的重要组成部分。现有的各种方法要么专注于通过聚合全局或多尺度上下文…