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

embedded/2024/10/11 13:30:21/

系列文章目录

一、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.ppmy.cn/embedded/59006.html

相关文章

【Js】导出 HTML 为 Word 文档

在 Web 开发中,有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档,以便更方便地分享和打印。 html样式 word文档 工具准备 1、 html-docx-js - npm html-docx-js是一个 JavaScript 库,用于将 HTML 内容转换为 Word 文档的格式。它…

LDR6020一拖二/一拖三快充数据线方案

*一拖三快充线方案主要采用USB Power Delivery (USB PD)协议,‌这是一种主流的快充协议,‌能够通过USB电缆和连接器增加电力输送,‌扩展USB应用中的电缆总线供电能力。‌这种方案的核心在于使用小板作为“桥梁”,‌一端焊接USB-C输…

VLM技术介绍

1、背景 视觉语言模型(Visual Language Models)是可以同时从图像和文本中学习以处理许多任务的模型,从视觉问答到图像字幕。 视觉识别(如图像分类、物体保护和语义分割)是计算机视觉研究中一个长期存在的难题&#xff…

JDBC学习笔记

引言 参考B站课程 why? 我们在开发Java程序时,数据都是存储在内存中,属于临时存储,当程序停止或重启时,内存中的数据就丢失了!我们为了解决数据的长期存储问题,有如下解决方案: 数…

客家菜餐馆点菜小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,菜系管理,菜品信息管理,我的订单管理,桌号管理,退款信息管理 微信端账号功能包括:系统首页,菜品信息&#…

Kafka基础入门篇(深度好文)

Kafka简介 Kafka 是一个高吞吐量的分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用与大数据实时处理领域。 1. 以时间复杂度为O(1)的方式提供消息持久化能力。 2. 高吞吐率。(Kafka 的吞吐量是MySQL 吞吐量的30…

[论文笔记]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

1.INTRODUCTION(引言) 检索增强语言模型能够更好地适应世界状态的变化并融入长尾知识。然而,大多数现有方法只能从检索语料库中检索到短的连续文本片段,限制了对整个文档上下文的完整理解。作者引入了一种新颖的方法,即递归嵌入、聚类和总结…

JDK11以上高版本jenkins构建jdk8项目解决方法

最近搭建jenkins做持续集成,版本2.452.2,最低要求jdk11。构建jdk1.8的项目总是默认使用jdk11构建。后来排查是因为maven 集成插件版本问题。高版本的maven插件不支持jdk1.8。 解决方案: 1.新增一个自由风格项目,不使用maven构建项…