2024-02-23(Spark)

1.RDD的数据是过程数据

RDD之间进行相互迭代计算(Transaction的转换),当执行开启后,代表老RDD的消失

RDD的数据是过程数据,只在处理的过程中存在,一旦处理完成,就不见了。

这个特性可以最大化的利用资源,老旧的RDD没有用了,就从内存中清理,给后续的计算腾出内存空间。内存中只存在一个RDD

2.RDD的缓存

当然,Spark也有缓存技术,Spark提供了缓存API,可以让我们通过调用API,将指定的RDD数据保留在内存或者硬盘上。保留了RDD的血缘关系。

RDD的缓存技术是分散存储的,分区数据各自存储到Executor所在的服务器上。

(有时候一个前置RDD,会被多个后续RDD使用,所以需要持久化一下)

3.RDD的CheckPoint

CheckPoint也是将RDD的数据保存起来,但是它仅支持硬盘存储,但是它不保留血缘关系。

CheckPoint技术是将RDD各个分区的数据集中存储到HDFS上 

(有时候一个前置RDD,会被多个后续RDD使用,所以需要持久化一下)

4.Jieba库用于中文分词

5.广播变量

使用场景:有时候一个Executor会处理多个分区数据,这些分区数据是接受相同的数据的,这个时候就不需要数据源一一给这些分区发一份分区数据了,只需要给这个Executor发一份数据就好,其所管辖的分区共享这份相同的数据。可以节约资源,降低IO,节约内存。

使用方式:使用boardcast()接口,将本地需要发送给分区的变量标记为广播变量就可以了

本地集合对象 和 分布式集合对象(RDD)进行关联的时候,需要将本地集合对象 封装为广播变量。可以节省网络IO的次数,Executor的内存占用

6.累加器

可以实现分布式的累加功能(将各个分区的值累加到一起)

Spark为我们提供了专门的累加器变量

7.小总结

广播变量解决了什么问题?

分布式集合RDD和本地集合进行关联使用的时候,降低内存占用以及减少网络IO的传输,提高性能。

累加器解决了什么问题?

分布式代码的执行过程中,进行全局累加。

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------Spark内核调度(重点理解)

8.DAG

DAG:有向无环图,有方向没有形成闭环的一个执行流程图(其实就是代码的一个执行流程图(RDD的转换。。。。RDD的执行)罢了,眼睛看着代码就能分析出来)

eg:

上图中,有三个DAG。

此外:上图也可以看出,一个程序Application,可能有多个Job(一条执行路线就是一个Job,可以理解为上图程序做了三件事(也可以说一个Action会产生一个Job(一个应用程序内的子任务)))

一个Application中,可以有多个JOB,每一个JOB内含一个DAG,同时每一个JOB都是由一个Action产生的

带有分区关系的DAG图:其实就是在有向无环的DAG图中把分区关系画出来而已。

9.DAG的宽窄依赖和阶段划分

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

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

10.DAG的阶段划分

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

划分依据:从后向前,遇到宽依赖,就划分出一个阶段,称之为stage

在stage的内部,一定都是窄依赖。

例如下图的两个stage:

11.Spark是怎么做内存计算的?DAG的作用?Stage阶段划分的作用?

1.Spark会产生DAG图

2.DAG图会基于分区和宽窄依赖关系划分阶段

3.一个阶段内部都是窄依赖,窄依赖内,如果形成前后1:1的分区对应关系,就可以产生许多内存迭代计算的管道

4.这些内存迭代计算的管道,就是一个个具体的执行Task

5.一个Task是一个具体的线程,任务跑在一个线程内,就是走内存计算了。

12.Spark为什么比MapReduce快?

1.Spark的算子十分丰富,MapReduce算子匮乏(Map和Reduce),MapReduce这个编程模型,很难在一套MR任务中处理复杂的任务,很多复杂的任务,是需要写多个MapReduce进行串联,多个MR串联通过磁盘交互数据。

2.Spark可以执行内存迭代,算子之间形成DAG,基于依赖划分阶段之后,在阶段内形成内存迭代管道。但是MapReduce的Map和Reduce之间的交互依旧是通过硬盘来交互的。

综上总结:

a.编程模型上Spark占优(算子丰富)

b.算子交互上,和计算上可以尽量多的内存计算而非磁盘迭代

13.Spark的并行度

在同一时间内,有多少个Task在同时运行

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

确保是CPUh核心数量的整数倍,最小是2倍,最大一般10倍或者更高均可。

14.Spark的任务调度

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

a.逻辑DAG的产生

b.分区DAG的产生

c.Task划分

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

15.Driver内的两个组件

DAG调度器

工作内容:将逻辑的DAG图进行处理,最终得到逻辑上的Task划分

Task调度器

工作内容:基于DAG Schedule的产出,来规划这些逻辑的task,应该在哪些物理的executor上运行,以及监控它们的运行。

16.Spark中的名词概念汇总

Application/应用:用户代码提交到Spark去运行的时候,这就是一个应用。一个Application由一个Driver去控制它的运行。

Application jar:如果是Java语言编写的程序,可以打成一个Application jar的jar包。

Driver program:程序main方法的入口,也是程序的调度者和管理者,也负责构建SparkContext。

Cluster manager/集群管理器:一个外部服务,用于管理整个集群的资源,也就是Master角色的东西

Deploye mode/部署模式:一般用YARN模式(又分为客户端模式 和 集群模式)

Worder node/Worker角色:单台服务器的资源管理者,负责在单个机器内去提供Spark程序运行所需要的资源。

Executor/程序的运行启动器:内部可以分为许多Task,可以理解为真正干活的。

Task/一个工作线程:它是Executor内最小的一个工作单元,这个工作单元对整个Spark任务进行任务的干活。

Job/并行化的计算集合:Job归属于Application,一个Application可以有多个Job。

Stage/阶段:在Job内部基于DAG关系图可以划分出许多Stage(划分依据:宽依赖),每个stage内部都是窄依赖,又因为是窄依赖,便可以构建内存迭代的管道,然后去设定并行的Task。

层级关系梳理

1.一个Spark环境可以运行多个Application

2.一个代码跑起来,会成为一个Application

3.Application内部可以有多个Job

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

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

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

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

以上就是Spark程序的运行原理,重点理解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lua速成(2)

一、流程控制 Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。 …

NOIP2018-J-4-对称二叉树的题解

原题描述: 题目描述 时间:1s 空间:256M 一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树: 1. 二叉树; 2. 将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且…

WinForms中的Timer探究:Form Timer与Thread Timer的差异

WinForms中的Timer探究:Form Timer与Thread Timer的差异 在Windows Forms(WinForms)应用程序开发中,定时器(Timer)是一个常用的组件,它允许我们执行定时任务,如界面更新、周期性数据…

QT之项目经验(windows下的sqlite,c++开发)

目录 一、需要时间去磨练gui的调整和优化 1. 借鉴网上开源项目学习 2. gui的布局及调整是磨人的一件事情 3. gui的布局也是可以用组件复刻的 4. 耗时的设备树 二、多线程异步弹窗 三、定时任务动态变更设定 1.确定按钮触发 2.此处监听定时任务时间的改变 3.此处对改变做出具…

Vue 实现页面导出A4标准大小的PDF文件,以及处理图片跨域不能正常展示的问题等

效果预览: 代码流程:首先在utils文件夹下创建htmlToPdf的js工具文件,然后在main.js中注册引用 htmlToPdf.js // 导出页面为PDF格式 import html2Canvas from html2canvas import JsPDF from jspdfexport default {install(Vue, options) {V…

vscode输入英文时字体之间的间隔突然变大,似中文

vscode输入英文时字体之间的间隔突然变大,似中文 主要原因: 是由于输入法变成全角模式了。原因可能是不小心按了 shift空格键快捷键造成的。 正常情况,全角就是字母和数字等与汉字占等宽位置的字。 半角就是ASCII方式的字符,在没…

3、函数定义,函数调用,this指向总结,闭包

一、函数的定义方式 1、函数声明 function demo1() {var num 12var result Math.pow(num,2)//指数函数return result }2、函数表达式 var demo2 function (x,y) { //内置对象arguments前面的两个参数 是 x,yvar sum arguments[0] arguments[1]console.log(sum) }3、构…

stm32用CubeMX库控制OLED显示数字,单个字符,字符串

首先是打开proteus绘制电路图: 接着就是打开CubeMX软件,配置晶振和GPIO口: 接下来就用前面讲过的方法添加一个自己的代码文件夹和代码了: 下面是OLED.c文件,复制就能用: #include "OLED_Font.h"…

如何优化一个看似正常的数据库

通常DBA是不会太了解业务逻辑的,遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化,但是并不是所有的sql都能通过添加索引来优化 这就需要重sql的本身来做分析,另外还要了解什么样的语句会不走索引!本文通过几个简单的例子…

再见,Visual Basic——曾经风靡一时的编程语言

2020年3月,微软团队宣布了对Visual Basic(VB)的“终审判决”:不再进行开发或增加新功能。这意味着曾经风光无限的VB正式退出了历史舞台。 VB是微软推出的首款可视化编程软件,自1991年问世以来,便受到了广大…

不只是数字游戏:六西格玛培训让数据讲述餐厅故事

随着时代的进步和科技的发展,人们对食品安全、健康以及就餐体验的要求日趋增高。这些因素推动了餐饮服务行业不断向前演进,以顺应消费者的多变需求。在2024年,这一行业预计将继续经历创新和变化,其中包括对运营效率的持续改进、对…

状态机-----

1.原理 同步的意思就是状态的跳转都是在时钟的作用下跳转的,有限是指状态机中状态的个数是有限的。两种状态机的共同点都是状态的跳转只和输入有关,区别就是如果最后的输出只和当前状态有关而与输入无关,则是moore型状态机。如果最后的输出不…

VUE基础知识九 ElementUI项目

ElementUI官网 一 项目 最终完成的效果: 切换上边的不同按钮,下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后,引入ElementUI(搭建、引入ElementUI步骤在第七节里已…

如何让网页APP化 渐进式Web应用(PWA)

前言 大家上网应该发现有的网页说可以安装对应应用,结果这个应用好像就是个web,不像是应用,因为这里采用了PWA相关技术。 PWA,全称为渐进式Web应用(Progressive Web Apps),是一种可以提供类似…

索引使用规则1——最左前缀法则

这篇文章主要介绍索引的使用规则——最左前缀法则,关于索引的效率,可以查看上一篇文章索引的有效性 最左前缀法则:索引使用了复合索引,也就是联合索引,使用一个索引名称索引了好几个字段。在这类索引中需要遵守最左前…

华为云是什么

公有云配置 区域: 同一个区域中的云主机是可以互相连通的,不通区域云主机是不能使用内部网络互相通信的 选择离自己比较近的区域,可以减少网络延时卡顿 华为云yum仓库:https://repo.huaweicloud.com/rockylinux/ 首先完成跳板机的…

文件拖放到窗体事件

参考代码 参考链接 拖放文件到窗体_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV13d4y1h7vr/?spm_id_from333.999.0.0&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年2月27日

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网,选择 install (默认是最新版本) b、选择包管理安装,手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

【linux进程信号(一)】信号的概念以及产生信号的方式

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 进程信号 1. 前言2. 信号的基…

MySQL集群 双主架构(配置命令)

CSDN 成就一亿技术人&#xff01; 今天刚开学第一天给大家分享一期&#xff1a;MySQL集群双主的配置需求和命令 CSDN 成就一亿技术人&#xff01; 神秘泣男子主页&#xff1a;作者首页 <———— MySQL专栏 &#xff1a;MySQL数据库专栏<———— MySQL双主是一…
最新文章