Spark内核调度

news2024/9/21 19:48:56

目录

一、DAG

        (1)概念

        (2)Job和Action关系

        (3)DAG的宽窄依赖关系和阶段划分

二、Spark内存迭代计算

三、spark的并行度

        (1)并行度设置

        (2)集群中如何规划并行度

四、spark任务调度

五、Spark运行概念名词

        (1)概率名词

        (2)Spark运行层级梳理


一、DAG

        Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建DAG,基于DAG划分Stage,将每个Stage中的任务发到指定节点运行。基于Spark的任务调度原理,可以合理规划资源利用,做到尽可能用最少的资源高效地完成任务计算。

wordcount_DAG流程图
        (1)概念

        DAG:有向无环图。有方向没有形成闭环的一个执行流程图。

        有向:有方向。

        无环:没有形成闭环。

        (2)Job和Action关系

        一个Action会产生一个Job(一个应用程序内的子任务),每个Job会产生各自自己的DAG流程图。如上图,有三个Action,所以有三个Job,每一个链路对应这每个Job的DAG流程图。

        (3)DAG的宽窄依赖关系和阶段划分

        在SparkRDD前后之间的关系,分为:

        ①窄依赖:父RDD的一个分区,全部将数据发给子RDD的一个分区(一对一)

        ②宽依赖(别名:shuffle):父RDD的一个分区,将数据发给子RDD的多个分区(一对多)

        对于Spark来说,会根据DAG,按照宽依赖,划分不同的DAG阶段。

        划分依据:从后向前,遇到宽依赖就划分出一个阶段,称为Stage。在Stage内部一定是窄依赖。

二、Spark内存迭代计算

        如图,基于带有分区的DAG以及阶段划分。可以从图中得到逻辑上最优的task分配,一个task是一个线程来具体执行那么如上图, task1中rdd1、rdd2、rdd3的迭代计算,都是由一个task(线程完成),这一阶段的这一条线,是纯内存计算。
        如上图,task1、task2、task3就形成了三个并行的内存计算管道。Spark默认受到全局并行度的限制,除了个别算子有特殊分区情况,大部分的算子,都会遵循全局并行度的要求,来规划自己的分区数。如果全局并行度是3,其实大部分算子分区都是3。
        注意::Spark我们一般推荐只设置全局并行度,不要再算子上设置并行度,除了一些排序算子外,计算算子就让他默认开分区就可以了。

面试题1 : Spark是怎么做内存计算的? DAG的作用? Stage阶段划分的作用?
        ①Spark会产生DAG图。
        ②DAG图会基于分区和宽窄依赖关系划分阶段。
        ③一个阶段的内部都是窄依赖,窄依赖内,如果形成前后1:1的分区对应关系,就可以产生许多内存迭代计算的管道这些内存迭代计算的管道,就是一个个具体的执行Task。
        ④一个Task是一个具体的线程,任务跑在一个线程内,就是走内存计儿了。

面试题2: Spark为什么比MapPeduce快

        ①Spark的算子丰富,MapReduce算子匮乏(Map和Reduce),MapReduce这个编程模型,很难在一套MR中处理复杂的任务。很多的复杂任务,是需要写多个MapReduce进行串联。多个MR串联通过磁盘交互数据。
        ②Spark可以执行内存迭代,算子之间形成DAG基于依赖划分阶段后,在阶段内形成内存迭代管道。但是MapReduce的Map和Reduce之间的交互依旧是通过硬盘来交互的。
总结:
        编程模型上Spark占优(算子够多)。
        算子交互上,和计算上可以尽量多的内存计算而非磁盘迭代。

三、spark的并行度

        Spark的并行:在同一时间内,有多少个task在同时运行
        并行度:并行能力的设置
        比如设置并行度6,其实就是要6个task并行在跑。在有了6个task并行的前提下,rdd的分区就被规划成6个分区了。

        (1)并行度设置

        可以在代码中和配置文件中以及提交程序的客户端参数中设置优先级从高到低:

        ①代码中

        ②客户端提交参数中配置文件中

        ③默认(1,但是不会全部以1来跑,多数时候基于读取文件的分片数量来作为默认并行度)

        全局并行度配置的参数:
                spark.default.parallelism

        全局并行度是推荐设置,不要针对RDD改分区,可能会影响内存迭代管道的构建,或者会产生额外的Shuffle。

        (2)集群中如何规划并行度

        结论:设置为CPU总核心的2-10倍。比如集群可用CPU核心是100个,建议并行度是200-1000。确保是CPU核心的整数倍即可,最小是2倍,最大一般是10或更高(适量)即可。

        为什么要设置最少2倍?

        CPU的一个核心同一时间只能干一件事情。所以,在100个核心的情况下,设置100个并行,就能1让CPU 100%出力。这种设置下,如果task的压力不均衡,某个task先执行完了。就导致某个CPu核心空闲。所以,我们将Task(并行)分配的数量变多,比如800个并行,同一时间只有100个在运行,700个在等待。但是可以确保,某个task运行完了。后续有task补上,不让cpu闲下来,最大程度利用集群的资源。规划并行度,只看jiqunzongCPU核数。

四、spark任务调度

        Spark的任务,由Driver进行调度,这个工作包含:

        ①逻辑DAG产生

        ②分区DAG产生

        ③Task划分

        ④将Task分配给Executor并监控其工作

        如图,Spark程序的调度流程如图(1-4都是Driver的工作,5是Worker的工作):

        ①Driver被构建出来

        ②构建SaprkContext(执行环境入口对象)

        ③基于DAG Scheduler(DAG调度器)goujainluojiTask分配

        ④基于TaskScheduler(Task调度器)将逻辑Task分配到各个Executor上干活,并监控他们

        ⑤Worker(Executor),被TaskScheduler管理监控,听从它们的指令干活,并定期汇报进度

DAG调度器(DAG Scheduler):将逻辑的DAG图进行处理,最终得到逻辑上的Task划分(重点)

Task调度器(Task Scheduler):基于DAG Scheduler的产出,来规划这些逻辑的task,应该在哪些物理的Executor上运行,以及监控管理它们的运行。

五、Spark运行概念名词

        (1)概率名词
Spark运行概念名词
TermMeaning
Application

用户编写的Spark应用程序,当该应用程序在集群上运行时包含一个driver program和多个executors。

Application  jar

包含Spark的应用程序的jar包

Driver program

是一个进程,包含Spark应用程序(application)的main方法,并且创建SparkContext。其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常用SparkContext代表Driver。

Cluster  manager

集群的管理者,SparkContext会与之进行通信,主要负责集群资源的管理,包括yarn、mesos。

Deploy  mode

运行模式,用来设定driver端在哪里运行,主要包括client和cluster。cluster模式中,driver端运行在集群中一个节点,client模式下,driver运行在集群之外。

Worker  node

集群中运行spark任务的节点。

Executor

一个进程,在worker node 运行应用程序,他可以运行task(计算),和保存应用程序中所用的数据到内存或者磁盘上。每一个应用程序拥有其独有的executor。在Spark on Yarn模式下,其进程名称为CoarseGrainedExecutorBackend,类似于Hadoop MapReduce中的YarnChild。一个CoarseGrainedExecutorBackend进程有且仅有一个executor对象,它负责将Task包装成taskRunner,并从线程池中抽取出一个空闲线程运行Task。每个CoarseGrainedExecutorBackend能并行运行Task的数量就取决于分配给它的CPU的个数了。

Task

被送到某个Executor上的工作单元,和hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责。

Job并行化的运算集合
StageStage是每一个Job处理过程要分为的几个阶段,一个Stage可以有一个或多个Task。
TaskScheduler实现Task分配到Executor上执行。
        (2)Spark运行层级梳理

        ①一个Spark环境可以运行多个Application

        ②一个代码运行起来,会成为一个Application

        ③Application内部可以有多个Job

        ④每个Job由一个Action产生,并且每个Job有自己的DAG执行图

        ⑤一个Job的DAG图会基于宽窄依赖划分成不同的阶段

        ⑥不同阶段内基于分区数量,形成多个并行的内存迭代管道

        ⑦每一个内存迭代管道形成一个Task ( DAG调度器划分将Job内划分出具体的task任务,一个Job被划分出来的task在逻辑上称之为这个job的taskset )

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

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

相关文章

给Windows文件夹添加备注信息

自己的电脑中文件夹为了安装各种开发环境,基本都是英文字母命名,就导致好多东西猛地一看找不着。此时加个备注会不会就好很多呢?就如以下这种 设置方法: 1、展示备注 右键展示的列表头部,会出现展示项,一…

前沿重器[36] | ACL23-基于检索的大语言模型-报告阅读

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…

Jenkins+Ant+Jmeter接口自动化集成测试

一、Jenkins安装配置 1、安装配置JDK1.6环境变量; 2、下载jenkins.war,放入C:\jenkins目录下,目录位置随意; Jenkins启动方法: cmd进入Jenkins目录下,执行java -jar jenkins.war 浏览器输入:l…

Server Name Indication(SNI),HTTP/TLS握手过程解析

Server Name Indication(SNI)是一种TLS扩展,用于在TLS握手过程中传递服务器的域名信息。在未使用SNI之前,客户端在建立TLS连接时只能发送单个IP地址,并且服务器无法知道客户端请求的具体域名。这导致服务器需要使用默认…

Spring中动态代理设计模式

目录 一、什么是动态代理 二、动态代理开发步骤 2.1 搭建开发环境 2.2 具体过程 三、动态字节码技术 四、动态代理开发简化代理开发 一、什么是动态代理 其实不管是静态代理还是动态代理其本质都是一样的,都是通过代理类为目标类增加额外功能,从而方便目…

Day7力扣打卡

打卡记录 合法分组的最少组数(贪心) 链接 举例说明,假设 c n t [ x ] 32 cnt[x]32 cnt[x]32, k 10 k10 k10,那么 32 10 10 10 2 321010102 321010102,多出的 2 2 2 可以分成两个 1 1 1&#xf…

Verilog基础:$fopen和$fclose系统函数、任务的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 $fopen和$fclose是两个用于打开和关闭文件的系统函数、任务。最初,在Verilog-1995标准中,最多只能同时打开32个文件,其所使用的…

Flink部署模式及核心概念

一.部署模式 1.1会话模式(Session Mode) 需要先启动一个 Flink 集群,保持一个会话,所有提交的作业都会运行在此集群上,且启动时所需的资源以确定,无法更改,所以所有已提交的作业都会竞争集群中…

2023/10/22总结

项目上 登录注册忘记密码已经全部完善——连接数据库,发送验证码等 把ER图和项目功能点也给做完了(可能后期还需要修改 ,因为问题会在实践的时候出现) 功能点图 刷题记录 接下来的任务是争取早日完成这个项目。

图论04-【无权无向】-图的广度优先遍历BFS

文章目录 1. 代码仓库2. 广度优先遍历图解3.主要代码4. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 广度优先遍历图解 3.主要代码 原点入队列原点出队列的同时,将与其相邻的顶点全部入队列下一个顶点出队列出队列的同时,将…

Python基础入门例程4-NP4 读入整数数字

描述 在学会读入字符串以后,小白还想要读入整数,请你帮他使用input函数读入数字并输出数字与变量类型。 输入描述: 输入只有整数。 输出描述: 将输入的数字输出,同时换行输出变量类型。 示例1 输入: …

《算法通关村第二关黄金挑战一一K个一组反转》

《算法通关村第二关黄金挑战一一K个一组反转》 描述 每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 解法 头插法 理解…

【超级基础版】十进制与二进制的转换

目录 一、为什么是二进制? 二、二进制的加法和乘法 三、二进制向十进制转换 四、十进制整数向二进制转换 五、十进制小数向二进制小数的转换 六、八进制和十六进制的引入 一、为什么是二进制? 我们知道电脑的数据本质上是0和1,就是我们…

已更新!c++第四章知识点合集(自定义函数的格式和使用方法详解, #include,函数的嵌套 递归,局部变量与全局变量的区别等等)

c知识点合集已经完成欢迎前往主页查看,点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL知识点持续更新中 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL-第三章节DCL-管理用户&…

库函数qsort的使用

在排序时,我们通常写的函数只能排一种固定的类型,那有没有一种方法可以用来对所有的数据类型,进行排序呢?库函数中的qsort函数就可以实现这种排序。 首先qsort的函数参数有四个,第一个是数组的起始地址(即数组名)&…

【ML】cheatsheet

LR 原理与面试题目DT, Adaboost, GBDT, xgboost 原理 细节 与 例子 https://www.cnblogs.com/createMoMo/p/12635709.html xgboost挺详细的算法原理与例子 https://zhuanlan.zhihu.com/p/660468945 着重lightgbm就xgboost的改善方向 https://zhuanlan.zhihu.com/p/366952043机器…

什么是卷积神经网络?解决了什么问题?

什么是卷积神经网络? 卷积神经网络(Convolutional Neural Network,CNN)是一种深度神经网络模型,主要用于图像识别、语音识别和自然语言处理等任务。它通过卷积层、池化层和全连接层来实现特征提取和分类。 解决了什么问…

pycharm使用Git拉取最新代码(配置了远程服务器)

首先分享一下如何在pycharm设置代理(毕竟pull代码往往是从GitHub上)。因为即便本地开启了代理,PyCharm并不会自动使用它。需要在PyCharm的设置中手动配置代理。 下面是在PyCharm中设置代理的步骤: 主菜单中选择File > Settin…

Node学习笔记之MySQL基本使用

使用 SQL 管理数据库 其实写接口简单来说就是操作数据库数据,所以我们需要学会数据库的增、删、查、改等基本操作 1. 什么是 SQL SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据…

Kubernetes技术与架构-网络 1

基于OSI网络模型,Kubernetes集群的网络策略包括7层负载均衡的网关路由策略,以及4层3层的网络IP地址策略,这些网络策略是保证Kubernetes集群内Pod之间的网络访问的互联互通,本文主要描述Kubernetes集群的网络策略的基本使用方式。 …