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

2024-01-08 15:04

本文主要是介绍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。
在这里插入图片描述

这篇关于Spark六:Spark 底层执行原理SparkContext、DAG、TaskScheduler的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583852

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa