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

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.mzph.cn/news/605290.shtml

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

相关文章

系列十四、理解MySQL varchar(50)

一、理解MySQL varchar(50) 1.1、概述 日常开发中,数据库建表是必不可少的一个环节,建表的时候通常会看到设定某个字段的长度为varchar(50),例如如下建表语句: 那么怎么理解varchar(50)?这个分情况的,MySQ…

静态路由、代理ARP

目录 静态路由静态路由指明下一跳和指明端口的区别代理ARP 我们知道,跨网络通信需要路由 路由有三种类型: 1.直连路由。 自动产生的路由,当网络设备连接到同一网络时,他们可以自动学习到对方的存在。自动学习相邻网络设备的直连信…

用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few…

盛元广通实验室业务流审批管理系统2.0

系统通过对取样、分析、数据处理、检验报告等分析全过程中多种影响因素的有效管理,强化检验质量,获得准确可靠的分析成果。业务流审批管理系统主要包括了检测管理、业务受理、样品管理、资源质量管理、分包管理、报告生成、统计分析等,系统能…

7N65-ASEMI高压NPN型MOS管7N65

编辑:ll 7N65-ASEMI高压NPN型MOS管7N65 型号:7N65 品牌:ASEMI 连续漏极电流(Id):4A 漏源电压(Vdss):650V 栅极阈值电压:30V 单脉冲雪崩能量:150mJ 集电极电流(脉冲&#xff…

网络安全B模块(笔记详解)- 网络爬虫渗透测试

LAND网络渗透测试 1.进入虚拟机操作系统:BT5中的/root目录,完善该目录下的land.py文件,填写该文件当中空缺的Flag1字符串,将该字符串作为Flag值(形式:Flag1字符串)提交;(land.py脚本功能见该任务第6题) 输入flag sendp(packet) Flag:sendp(packet) 2.进入虚拟机操作…

关键字、标志符、变量、基本数据类型

1、关键字 1.1、定义 定义:被JAVA语言赋予了特殊含义,用作专门用途的字符串(或单词) 特点:全部关键字都是小写字母 上源码: 代码中定义类的关键字class,定义一个订单控制器类 ​​​​​​​…

用Java爬取新房二手房数据看总体大环境

都说现在房市惨淡,导致很多人在观望,那么今天我写一段爬虫,主要是抓取各地新房以及二手房成交状况,然后了解总体楼市是否回暖上升。 以下是Java爬虫程序的代码示例,用于抓取贝壳网新房和二手房数据: impor…

污水处理成套设备如何选择

污水处理是现代社会中不可或缺的一个重要环节,它涉及到环保领域,与人们的生活和健康息息相关。而污水处理成套设备的选择则显得尤为重要,因为合适的设备能够有效地解决水污染问题,提高环境质量。 在选择污水处理成套设备时&#x…

Python绘制茎叶图:plt.stem

文章目录 简介参数演示 简介 茎叶图从外观来看,更像是火柴,由基线、茎线、茎头三部分构成。最简单的示例如下 import numpy as np import matplotlib.pyplot as plt plt.stem(np.sin(np.arange(10))) plt.show()参数 stem的完整参数如下 stem([locs,…

【C++】- 类和对象(构造函数!析构函数!拷贝构造函数!详解)

类和对象② 类的6个默认成员函数构造函数析构函数拷贝构造函数 类的6个默认成员函数 上一篇详细介绍了类。如果一个类中什么成员都没有,简称为空类。 那么空类中真的什么都没有吗? 并不是,当类在什么都不写时,编译器会自动生成…

SQLServer设置端口,并设置SQLServer和SQLServer Browser服务

SQLServer默认使用动态端口,即每次启动sqlserver.exe时,端口port都会动态变化。若要使用静态端口,比如port1433,则需要在SQL Server Configuration Manager(简称SSMS)里配置。这里以SQL Server 2005 Configuration Man…

安科瑞有序充电运营场站落成-安科瑞 蒋静

今年6月,发布了《关于进一步构建高质量充电基础设施体系的指导意见》,提出到2030年基本建成高质量充电基础设施体系,以支撑新能源汽车产业的发展和满足人民群众的出行充电需求。7月底,国家部门印发了《关于促进汽车消费的若干措施…

应对 DevOps 中的技术债务:创新与稳定性的微妙平衡

技术性债务在DevOps到底意味着什么?从本质上讲,这是小的开发缺陷的积累,需要不断地返工。它可能由多种原因引起,例如快速交付新功能的压力,这可能会导致团队不得不牺牲代码的整洁和完善。但这些不完整的小代码&#xf…

Qt - QML框架

文章目录 1 . 前言2 . 框架生成3 . 框架解析3.1 qml.pro解析3.2 main.cpp解析3.3 main.qml解析 4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 什么是QML? QML是一种用户界面规范和编程语言。它允许开发人员…

桌面图标变成白色文件?学会这4个方法,轻松解决!

“不知道为什么,我有些文件夹直接保存在电脑桌面了,但是今天查看的时候却发现它们变成了白色的文件。有什么方法可以解决这个问题吗?” 在使用电脑时,可能由于各种原因,会出现桌面图标变成白色文件的情况。这不仅会让用…

docker安裝gocd-server,并配置gitlab授权登录

gocd的地址:Installing GoCD server on Windows | GoCD User Documentation gocd文档:GitHub - gocd/docker-gocd-server: Docker server image for GoCD 一、docker拉取gocd镜像 #拉取server镜像 docker pull gocd/gocd-server:v21.1.0docker pull g…

isaacgym(legged_gym)学习 (二)—— 设置环境地形

isaacgym(legged_gym)学习 (二)—— 设置环境地形 文章目录 isaacgym(legged_gym)学习 (二)—— 设置环境地形前言一、了解isaacgym中地形如何构成的二、自定义修改1.代码2.查看script/play.py 总结 前言 如何设置isaacgym中的环…

系列三十七、IDEA设置全局快捷键

一、IDEA设置全局快捷键 1.1、idea默认的快捷键 1.2、修改全局搜索快捷键为Alt F

永磁同步电机的磁场定向控制

目录 概述 通过系统仿真验证行为 探索模型架构 生成用于集成到嵌入式应用程序的控制器 C 代码 指定控制器模型的参考行为 创建 PIL 实现 准备用于 PIL 测试的控制器模型 测试生成的代码的行为和执行时间 结论 此示例说明从电机控制算法生成 C 代码并验证其编译行为和执…