Spark六:Spark 底层执行原理SparkContext、DAG、TaskScheduler

news2024/11/17 21:36:14

Spark底层执行原理

学习Spark运行流程
学习链接:https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ

一、Spark运行流程

在这里插入图片描述
流程:

  1. SparkContext向管理器注册并向资源管理器申请运行Executor
  2. 资源管理器分配Executor,然后资源管理器启动Executor
  3. Executor发送心跳至资源管理器
  4. SparkContext构建DAG有向无环图
  5. 将DAG分解成Stage(TaskSet)
  6. 把Stage发送给TaskScheduler
  7. Executor向SparkContext申请Task
  8. TaskScheduler将Task发送给Executor运行
  9. 同时SparkContext将应用程序代码发给Executor
    10.Task在Executor上运行,运行完毕后释放所有资源

1.1 从代码角度看DAG图的构建

val session = SparkSession.builder().master("local[*]").appName().getOrCreate()
val sc = session.sparkContext
val lines1 = sc.textFile(inputPath1).map(...).map(...)
val lines2 = sc.textFile(inputPath2).map(...)
val lines3 = sc.textFile(inputPath3)

val dtinone1 = lines2.union(lines3)
val dtinone = lines1.join(dtinone1)
dtinone.saveAsTextFile(...)
dtinone.filter(...).foreach(...)

代码的DAG图:
在这里插入图片描述
Spark内核会在需要计算发生的时刻绘制一张关于计算路径的有向无环图,也就是上图所示的DAG。

Spark的计算发生在RDD的Action操作,而对Action之前所有的Transformation,Spark只是记录下RDD生成的轨迹,不会触发真正的计算。

1.2 将DAG划分为Stage核心算法

一个Application可以有多个job多个Stage:
Spark Application中可以因为有不同的Action触发众多的job,一个Application中可以有很多的job,每个job是由一个或者多个Stage构成的,后面的Stage依赖于前面的Stage,也就是只有前面的Stage计算完毕后,后面的Stage才会运行。


划分依据:
Stage划分的一句是宽依赖:像像 reduceByKey,groupByKey 等算子,会导致宽依赖的产生。

宽窄依赖划分原则:
窄依赖:父 RDD 的一个分区只会被子 RDD 的一个分区依赖。即一对一或者多对一的关系,可理解为独生子女。常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父 RDD 是 hash-partitioned)等。
宽依赖:父 RDD 的一个分区会被子 RDD 的多个分区依赖(涉及到 shuffle)。即一对多的关系,可理解为超生。常见的宽依赖有 groupByKey、partitionBy、reduceByKey、join(父 RDD 不是 hash-partitioned)等。


核心算法:回溯算法
从后往前回溯/反向解析,遇到窄依赖加入本Stage,遇到宽依赖进行Stage切分。

Spark内核会从触发Action操作的那个RDD开始,从后往前推,首先回味最后一个RDD创建要一个Stage,然后倒推,如果发现对某个RDD是宽依赖,那么会将宽依赖的那个RDD创建一个新的Stage,那个RDD就是新的Stage的最后一个RDD,以此类推继续倒推,知道所有的RDD全部遍历完成。

1.3 DAG划分为Stage剖析

具体可见 Spark二、Spark技术栈之Spark Core 第六点。

1.4 提交Stages

调度阶段的提交,最终会被转换成一个任务的提交:

  • DAGScheduler通过TaskScheduler接口提交任务集
  • 这个任务集最终会触发TaskScheduler构建一个TaskSetManager的实例来管理这个任务集的生命周期
  • 对于DAGScheduler来说,提交调度阶段的工作到此就完成了。

而TaskScheduler的具体实现则会在得到计算资源的时候,进一步通过TaskSetManager调度具体的任务到对应的Executor节点上进行运算。
在这里插入图片描述

1.5 监控Job、Task、Executor

1.5.1 DAGScheduler监控Job与Task

要保证相互依赖的作业调度阶段能够得到顺利的调度执行,DAGScheduler 需要监控当前作业调度阶段乃至任务的完成情况。


通过对外暴露一系列的回调函数实现,对于TaskScheduler来说,这些回调任务主要包括任务的开始结束失败、任务集的失败,DAGScheduler 根据这些任务的生命周期信息进一步维护作业和调度阶段的状态信息。

1.5.2 DAGScheduler 监控 Executor 的生命状态

TaskScheduler 通过回调函数通知 DAGScheduler 具体的 Executor 的生命状态,如果某一个 Executor 崩溃了,则对应的调度阶段任务集的 ShuffleMapTask 的输出结果也将标志为不可用,这将导致对应任务集状态的变更,进而重新执行相关计算任务,以获取丢失的相关数据。

1.6 获取任务执行结果

1.6.1 结果DAGScheduler

一个具体的任务在 Executor 中执行完毕后,其结果需要以某种形式返回给 DAGScheduler,根据任务类型的不同,任务结果的返回方式也不同。

1.6.2 两种结果:中间结果与最终结果

  1. 对于 FinalStage 所对应的任务,返回给 DAGScheduler 的是运算结果本身。
  2. 对于中间调度阶段对应的任务 ShuffleMapTask,返回给 DAGScheduler 的是一个 MapStatus 里的相关存储信息,而非结果本身,这些存储位置信息将作为下一个调度阶段的任务获取输入数据的依据。

1.6.3 两种类型:DirectTaskResult 与 IndirectTaskResult

按任务结果大小的不同,ResultTask返回的结果分成两类:

  1. 如果结果足够小,则直接放在 DirectTaskResult 对象内中。
  2. 如果超过特定尺寸则在 Executor 端会将 DirectTaskResult 先序列化,再把序列化的结果作为一个数据块存放在 BlockManager 中,然后将 BlockManager 返回的 BlockID 放在 IndirectTaskResult 对象中返回给 TaskScheduler,TaskScheduler 进而调用 TaskResultGetter 将 IndirectTaskResult 中的 BlockID 取出并通过 BlockManager 最终取得对应的 DirectTaskResult。

1.7 任务调度总体诠释

在这里插入图片描述

二、Spark运行架构特点

2.1 Executor进程专属

每个Application获取专属的Executor进程,该进程在Application期间一直驻留,并以多线程方式运行Tasks。

Spark Application不能跨应用程序共享数据,除非将数据写入到外部存储系统,如图所示:
在这里插入图片描述

2.2 支持多种资源管理器

Spark与资源管理器无关,只要能够获取Executor进程,并能保持互相通信就可以了。
Spark支持支援管理器包括:Standalone、On Mesos、On YARN、Or On EC2。如图所示:
在这里插入图片描述

2.3 Job提交就近原则

提交SparkContext的Client应该靠近Worker节点(运行Executor的节点),最好在同一个Rack(机架)里,因为Spark Application运行过程中SparkContext和Executor之间有大量的信息交换;

如果想在远程集群中运行,最好使用RPC将SparkContext提交给集群,不要远离Worker运行SparkContext
在这里插入图片描述

2.4 移动程序而非移动数据的原则执行

移动程序而非移动数据的原则知性,Task采用了数据本地行和推测知性的优化机制
关键方法:taskIdToLocations、getPreferedLocations。
在这里插入图片描述

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

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

相关文章

Day4Qt

1.头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTimerEvent>//定时器类 #include <QTextToSpeech> namespace Ui { class Widget; }class Widget : publi…

Leetcode2982. 找出出现至少三次的最长特殊子字符串 II

Every day a Leetcode 题目来源&#xff1a;2982. 找出出现至少三次的最长特殊子字符串 II 解法1&#xff1a;字符串分割 分类讨论 按照相同字母分组&#xff0c;每组统计相同字母连续出现的长度。例如 aaaabbbabb 把 a 分成一组&#xff0c;组内有长度 4 和长度 1&#x…

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念&#xff1a;具有语义的人脸区域&#xff0c;如嘴、鼻子、眼睛。 二、研究目标 1.验证假设&#xff0c;并…

centos8部署MySQL5.7故障集

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在centos8系统上安装MySQL&#xff0c;使用的是centos7上安装MySQL的脚本&#xff0c;出现了以下问题&#xff0c;以做记录&…

Spark原理——逻辑执行图

逻辑执行图 明确逻辑计划的边界 在 Action 调用之前&#xff0c;会生成一系列的RDD,这些RDD之间的关系&#xff0c;其实就是整个逻辑计划 val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source") val sc new SparkContext(conf)v…

多测师肖sir___ui自动化测试po框架讲解版

po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写 &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一个配置class&#xff0c; 配置class就用来维护页面元素或操作方法 &#xff08;3&am…

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包 2024/1/11 18:25 百度搜搜&#xff1a;ubuntu rar文件怎么解压 rootrootrootroot-X99-Turbo:~/temp$ ll total 2916 drwx------ 3 rootroot rootroot 4096 1月 11 18:28 ./ drwxr-xr-x 25 rootroot rootroot 4096 1月…

【时事篇-02】20240110 365天存钱法(sum法)

背景需求 朋友圈里&#xff0c;一位保险推销员发布“存钱法广告”&#xff0c;我想用Python验算结果正确性 使用的是最近宫格数独里用到的”sum法” 代码展示 项目:存钱游戏计算 sum() 作者:阿夏 时间:2024年1月10日19:03 import random1、钻石版&#xff1a;从1元存到365元&a…

七星彩中奖号码模拟机器

七星彩号码抽取规则。 前区&#xff1a;抽取前区6个号码&#xff0c;每个号码是0~9之间选1个。 后区&#xff1a;抽取后区1个号码&#xff0c;每个号码是0~14之间选1个。 #七星彩模拟器&#xff0c;2024-01-12&#xff0c;by qs import random QianQu_6number [0,1,2,3,4,5,…

【C语言】linux内核set_task_stack_end_magic函数

一、函数定义 void set_task_stack_end_magic(struct task_struct *tsk) {unsigned long *stackend;stackend end_of_stack(tsk);*stackend STACK_END_MAGIC; /* for overflow detection */ } 内核版本6.4.3、6.7。 二、代码解读 解读1 这段代码是一个在Linux内核中定…

奇异值分解在图形压缩中的应用

奇异值分解在图形压缩中的应用 在研究奇异值分解的工程应用之前&#xff0c;我们得明白什么是奇异值&#xff1f;什么是奇异向量&#xff1f; 奇异值与奇异向量 概念&#xff1a;奇异值描述了矩阵在一组特定向量上的行为&#xff0c;奇异向量描述了其最大的作用方向。 奇异值…

Flash教程(一)入门

从本篇开始&#xff0c;我们将开始基于python的web开发系列教程&#xff0c;这里使用轻量级的web框架Flask。 1、简介 Flask是一个用来构建基于python语言的web应用程序的轻量级web框架。Flask的作者是来自Pocoo(由一群热爱python的人组建)的Armin Ronacher。本来只是作者的一…

Numpy使用简介

Numpy 相关题目 【Python】—— Numpy 初体验 【Python】—— NumPy基础及取值操作 Numpy是基于Python的通用数值计算工具包&#xff0c;其内包含大量数学计算函数和矩阵运算函数。多数科学计算工具包&#xff0c;比如Scipy&#xff0c;和数值分析工具包&#xff0c;比如Pandas…

大学物理-实验篇(二)——用分光计测定三棱镜的折射率(光:特定频段电磁波、光线在介质界面折射、平行光与凸透镜)

目录 预备知识 光&#xff1a;特定频段电磁波 光线在介质界面折射 平行光与凸透镜 实验目的 实验仪器 实验原理 实验步骤 准备分光计 目镜调焦 刻度盘读数 测三棱镜顶角 测三棱镜最小偏向角 数据处理 预备知识 光&#xff1a;特定频段电磁波 光速&#xff1a;…

YOLOv8涨点改进:多层次特征融合(SDI),小目标涨点明显,| UNet v2,比UNet显存占用更少、参数更少

💡💡💡本文独家改进:多层次特征融合(SDI),能够显著提升不同尺度和小目标的识别率 如何引入到YOLOv8 1)替代原始的Concat; 💡💡💡Yolov8魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你…

H 指数,经典算法实战。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Mac上使用phpstudy+vscode配置PHP开发环境

使用的工具&#xff1a; 1、系统版本 2、vs code code 3、phpstudy_pro 一、下载vs code code以及必要的插件 1、vs code下载 点击vs code官网下载 选择对应的版本&#xff0c;一般电脑会自动识别对应的版本&#xff0c;点击下载&#xff0c;然后傻瓜式安装&#xff01; 2…

陶瓷碗口缺口检测-技术方案

项目背景 陶瓷碗出厂前需要做的质量检测工作包括对陶瓷碗是否有缺口的检测&#xff0c;利用图像处理技术也可以对陶瓷碗的缺口进行检测和定位。 技术方案 陶瓷碗口缺口检测包含如下五个步骤。首先通过CMOS相机获取陶瓷碗的图像&#xff0c;二值化处理后通过图像复原技术进行去…

1886_emacs_v29中的行号配置

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. emacs 29中的行号显示配置 行号显示 行号显示是一个编辑器中很常见的功能&#xff0c;我觉得这个功能的需求度可能因人群或者个人习惯而不同。对于只…

果然程序员的世界不是 0 就是 1

在一场轰动全球的爱情故事中&#xff0c;OpenAI 的首席执行官、同时也是打破常规的浪漫英雄&#xff0c;奥特曼&#xff0c;与他的基友奥利弗穆尔赫林在夏威夷举行了一场迷人的婚礼。在奥特曼的岛屿别墅附近&#xff0c;这对低调却又令人羡慕的新人&#xff0c;在奥特曼的哥哥杰…