Spark内核调度

目录

一、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的任务调度原理,可以合理规划资源利用,做到尽可能用最少的资源高效地完成任务计算。

b64e3724de674b01b7c94bf91e236beb.png

wordcount_DAG流程图

        (1)概念

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

        有向:有方向。

        无环:没有形成闭环。

73b8cb5b952d48a1a75c8184ad8497e0.png

        (2)Job和Action关系

db5b310b2c34404facf04a7085598ff3.png

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

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

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

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

326a985206c94b65b893d64d12894ad6.png

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

bcfc51f9c6214fe7be5431d5cf17601b.png

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

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

2b3268aa90c84321b3682bf6e03e4314.png

二、Spark内存迭代计算

6ce7df1e26a144aa890d073a98ade3b6.png

        如图,基于带有分区的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

ea81179c91d1496283f3655cadeb981c.png

        全局并行度是推荐设置,不要针对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并监控其工作

46a828db853c4fc9b878d334306dc34b.png

        如图,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.mzph.cn/news/119371.shtml

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

相关文章

javascript IP地址正则表达式

/^(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2})\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)$/g.test(10.2.35.8) 注: 一定不要把表达式赋值给变量,直接…

软考-网络安全审计技术原理与应用

本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 网络安全审计概念 等级保护网络安全审计是指对涉及国家安全、重要利益或关键信息基础设施…

FPGA/SoC控制机械臂

FPGA/SoC控制机械臂 机器人技术处于工业 4.0、人工智能和边缘革命的前沿。让我们看看如何创建 FPGA 控制的机器人手臂。 介绍 机器人技术与人工智能和机器学习一起处于工业 4.0 和边缘革命的最前沿。 因此,我认为创建一个基础机器人手臂项目会很有趣,我们…

听GPT 讲Rust源代码--library/std(3)

rust标准库std中的src目录主要包含以下内容和模块: alloc:内存分配相关函数,比如alloc::boxed::Box、alloc::string::String等。 ascii:ASCII相关工具函数。 char:字符相关类型和函数,如Char、char等。 cmp:比较相关trait和函数,如Ord、Eq、PartialOrd等。 env:环境变量相关功能…

什么是React中的有状态组件(stateful component)和无状态组件(stateless component)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

微信小程序如何跳转页面

1.wx.navigateTo:用于跳转到其他页面,并保留当前页面。通过该 API 跳转后,可以通过返回按钮回到原页面。 wx.navigateTo({url: /pages/otherPage/otherPage })2.wx.redirectTo:用于跳转到其他页面,并关闭当前页面。通…

探索SOCKS5与SK5代理在现代网络环境中的应用

随着互联网技术的飞速发展,网络安全成为了不容忽视的重要议题。其中,网络代理技术作为一种重要的网络安全手段,以其独特的功能和优势在网络安全领域占据了重要的位置。本文将探讨两种常见的代理技术:SOCKS5代理和SK5代理&#xff…

Linux中关于glibc包导致的服务器死机或者linux命令无法使用的情况

glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX …

量子计算与量子密码(入门级)

量子计算与量子密码 写在最前面一些可能带来的有趣的知识和潜在的收获 1、Introduction导言四个特性不确定性(自由意志论)Indeterminism不确定性Uncertainty叠加原理(线性)superposition (linearity)纠缠entanglement 虚数的常见基本运算欧拉公式&#x…

本地新建项目如何推到码云上去

1.先在码云上建立一个空仓库,正常步骤就行。建立完成有readme.md. 2.然后本地建立项目文件,正常脚手架搭建VUE\REACT等。记得要项目git init一下。 3.本地改好的内容commit 一下。 4.本地文件与远端仓库建立连接。git remote add origin https://gite…

基于C/C++的UG二次开发流程

文章目录 基于C/C的UG二次开发流程1 环境搭建1.1 新建工程1.2 项目属性设置1.3 添加入口函数并生成dll文件1.4 执行程序1.5 ufsta入口1.5.1 创建程序部署目录结构1.5.2 创建菜单文件1.5.3 设置系统环境变量1.5.4 制作对话框1.5.5 创建代码1.5.6 部署和执行 基于C/C的UG二次开发…

hypercube背景设置为白色,绘制高光谱3D立方体

import scipy pip install wxpython PyOpenGL和Spectral需要本地安装 可参考链接https://blog.csdn.net/qq_43204333/article/details/119837870 参考:https://blog.csdn.net/Tiandailan/article/details/132719745?spm1001.2014.3001.5506Mouse Functions:left-cl…

何判断自己网络是否支持IPV6

环境: Win10专业版 IPV6 问题描述: 何判断自己网络是否支持IPV6 解决方案: 要判断您的网络是否支持 IPv6,可以采取以下方法: 检查您的网络设备(如路由器、交换机等)是否支持 IPv6。通常&a…

看完这篇 教你玩转渗透测试靶机Vulnhub——Hacksudo: Aliens

Vulnhub靶机Bluemoon: 2021渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:Vulnhub靶机漏洞详解:①:信息收集:②:数据库后台传木马:③:反弹shell&#x…

muduo源码剖析之poller/EpollPoller多路复用类

简介 poller是I/O多路复用接口抽象虚基类,对I/O多路复用API的封装,muduo提供了EPollPoller和PollPoller派生类(epoll和poll),所以不支持select. newDefaultPoller()默认选择epoll 主要接口 poll 是Poller的核心功能,使用派生类的poll或者epoll_wait来阻塞等待I…

后端工程进阶| 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天 并发编程 协程Goroutine通道Channel锁Lock 并发基础 串行程序与并发程序:串行程序特指只能被顺序执行的指令列表,并发程序则是可以被并发执行的两个及以上的串行程序的综合体。并发程序与并行程序…

Java设计模式之模板方法模式

目录 定义 结构 案例 优缺点 优点 缺点 使用场景 JDK源码解析 无法查看的无参read()原因 定义 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。简单来说&#xf…

python---设计模式(单例模式和工厂模式)

单例模式 定义:保证一个类只有一个实例,并提供一个访问它的全局访问点。节省内存,节省创建对象的开销。 非单例模式 : class StrTools:passs1 StrTools() s2 StrTools() print(s1) print(s2) 单例模式 : # tr_t…

Ubuntu安装pyenv,配置虚拟环境

文章目录 安装pyenvpyenv创建虚拟环境一般情况下创建虚拟环境的方法 安装pyenv 摘自:文章 pyenv可以管理不同的python版本 1、安装pyenv的依赖库 # 执行以下命令安装依赖库 # 更新源 sudo apt-get update # 更新软件 sudo apt-get upgradesudo apt-get install ma…

二十、设计模式之迭代器模式

目录 二十、设计模式之迭代器模式能帮我们干什么?主要解决什么问题?优缺点优点缺点: 使用的场景角色 实现迭代器模式定义迭代器容器实现可迭代接口迭代器实现使用 总结 二十、设计模式之迭代器模式 所属类型定义行为型提供一种方法顺序访问一…