RDD调用机制、数据流在RDD中的流通

news2024/11/20 8:25:06

问题

一直很疑惑spark中数据的流向是如何的,网上的文章基本上都是在讲述RDD的基本概念,看来看去都是些RDD直接相互依赖、Spark构造DAG、RDD计算只能由行动算子触发等一些基础概念,没有解开我的疑惑,因此自己点击源码查看,并记录下来。

我们都知道spark是通过RDD的相互依赖构成一张DAG,而构成DAG的单位是一个个的STAGE,每个STAGE中数据不涉及Shuffle,多个RDD构成了一个STAGE。那么问题来了,数据在RDD中是怎样流通的呢?是一条一条的进入RDD,从第一个到最后一个呢?还是Spark会读取所有数据进内存后再供给每个RDD计算呢?既然RDD不存储数据,那么它又如何去拉取数据进行计算的呢?下面将对RDD的处理机制进行描述。

Spark中的数据流

Spark并不会直接把数据全部存储到内存之中,而是利用RDD的依赖关系构建一个RDD依赖链,在阶段提交时按阶段切分成一系列的任务给Executor执行,由于RDD是懒执行的,所以当行动算子触发job时,才会真正去读取数据进行处理。spark中存储数据的情况:

  1. RDD缓存spark可以选择把后面rdd频繁使用的rdd进行缓存,由于rdd只是对操作函数的封装,因此数据不会存在rdd中,如果后续很多rdd依赖于当前rdd,那么当前rdd会频繁的执行加工数据,因此把本RDD缓存在内存中,后面的rdd可以直接从内存中拿去数据,省去了在通过rdd依赖加载转换数据的开销。
  2. Shuffle暂存数据在进行shuffle时,会有shuffle read 和 shuffle write 两个阶段,在进行shuffle write时,把数据缓存到spark的execution内存区域并装入AppendOnlyMap或Pairbuffer中,当内存不足时,会对排序才写到磁盘文件。而在shuffle read 阶段,会把数据读入内存并进行聚合,如果内存满了会溢写磁盘,最后再把内存和磁盘的文件进行归并。
  3. 系统或用户对象对象存储开销

RDD的调用机制

RDD调用链过程

首先RDD并不存储数据,只是存储获取数据的分区getPartition以及每个分区的计算函数compute。rdd1经过转换map成rdd2时,rdd2会把rdd1记录成自己的父rdd,并且把rdd1进行的map方法记录成函数f,并使用一个迭代器去通过map方法执行该函数(map方法一条条的处理数据),也就是说一个新的rdd会记录它的父rdd,以及它是如何由父rdd转换而来的,源码:
在这里插入图片描述
在这里插入图片描述

上面的f函数就是转换操作。iter是一个迭代器,new的时候f函数的逻辑是调用iter迭代器的map方法,执行传入的转换操作。而在computer中实现时,这个迭代器就是firstParent的iterator,那么firstParent是哪个RDD呢?看new一个RDD的时候:
在这里插入图片描述
它继承了RDD,并且传入了prev就是它的父RDD作为构造函数的参数,再看这个构造函数:
在这里插入图片描述
可以看到在一对一依赖的情况下,传入的这个rdd就是它的依赖表的唯一成员,也就是说调用firstParent的时候实际上获取的就是传入的这个prev。
而根rdd则是读取数据的rdd,如通过textfile获得的rdd则是通过读取文件生成的hadoopRdd,hadooprdd的compute函数就是读取文件的过程。
到这里整个rdd调用链就清楚了:
行动算子触发计算时,将由最后一个rdd调用iterator方法进而调用compute方法,在compute方法里,会调用compute所在rdd的父rdd的迭代器执行父rdd传入的处理过程函数,而调用父rdd的迭代器时,又会导致父rdd的iterator方法调用父rdd的compute方法,如此不断往上调用,直到来到读取文件的rdd(hadoopRdd),调用hadooprdd的compute方法,读取文件数据,再依次进过层层处理,来到最后一个rdd,调用结束。

第一个调用iterator的地方

现在知道compute方法的入口方法时iterator方法,即整个调用链是从iterator方法开始的,既然rdd的处理调用是一个向上迭代的过程,那么第一个调用iterator的地方在哪里呢?
RDD算子最终会被转化为shuffle map task和result task,并发送到executor执行。而这个地方就在ShuffleMapTask的runTask方法中:
在这里插入图片描述
进入write方法
在这里插入图片描述
会在传入的rdd基础上调用RDD的iterator方法。进入该方法:
在这里插入图片描述
当该rdd有存储级别时(被cache或者persist过)会先在当前executor上的BlockManager获取指定blockId的block,如果没有缓存则调用computeOrReadCheckpoint。
在这里插入图片描述
在这里插入图片描述
isCheckpointedAndMaterialized方法会判断checkpointData是否有当前rdd,如果有则会调用firstParent[T].iterator(split, context)方法返回checkpoint的rdd,然后调用该rdd的iterator方法。
如果没有checkpoint,则直接调用本rdd的compute方法执行具体逻辑。
所以在executor执行maptask时,会拿出一个rdd执行它的iterator,而这个rdd就是一个stage中的最后一个rdd。

RDD中流通的数据大小

那么iterator迭代的数据量又是多少呢,换句话说,究竟在rdd间流通的数据是一条数据,还是多条呢?上面分析可知转换操作会通过iter的map方法作用在每一条数据上,所以肯定是一批数据在rdd间流通,并且我们知道一个task是运行在一个分区上,所以流通的数据量实际上就是一个分区的数据量。因此一个文件如果不止一个分区,就会划分成多个task,在executor中不断执行!

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

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

相关文章

《InnoDB引擎》 Master Thread、IO Thread、Purge Thread

后台线程 后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行的状态。 InnoDB存储引擎是多线程的模型,因此…

用键盘传输小数据,破除解决多层远程访问或防火墙限制不能粘贴复制的问题

经常在项目上遇到这样的问题,由于vpn或者防火墙限制远程连接到服务器时不能进行粘贴复制文本。本机改好的代码还需要在远程机上在敲一遍,并且不能传输文件,每次传输东西都要找管理员给传输文件很麻烦,所以想到了这样一个又蠢又灵活…

ME60单板加载故障维护经验

ME60单板加载故障维护经验 加载是设备管理中重要的模块。它完成系统软件和逻辑软件从主控板的 CFcard下载到接口板或者交换网板的存储区域。接口板或者交换网板的存储区域有以下三种: 1 单板 CFcard存储区域 2 单板 bootrom存储区域 3 单板逻辑芯片内部存储区…

数字先锋 | 教育资源乘云而来!46万城乡学子共享名师课堂

城乡学生同上“一堂课”,是一种怎样的体验?在淄博市张店区重庆路小学的教室里,正在进行着这样一节特殊的数学课。 数学老师演示着手里的教具,将抽象的教材讲解得生动精彩,班级内的同学听得聚精会神。黑板上方的一块屏幕…

聚水潭对接金蝶云星空数据方案

01 系统说明: 聚水潭:是由上海聚水潭网络科技有限公司基于SaaS模式开发的商家ERP软件系统,公司创始团队聚集了一群来自阿里、麦包包等知名企业的技术、仓管、市场营销精英,具有近二十年传统及电商企业的ERP实践经验。秉承互联网开…

软件开发 23个设计模式收集

从基础的角度看,设计模式是研究类本身或者类与类之间的协作模式,是进行抽象归纳的一个很好的速成思路。后面阅读设计模式后,为了加深理解,对相关图片进行了描绘和微调。 从技术的角度已经有很多好的总结,本文会换一种角…

基于docker部署redis多主多从集群

在docker中部署redis多主多从集群,准备部署三对一主一从服务,共6个 首先获取镜像 这里使用的是6.0.8版本 docker pull redis:6.0.8 启动六个容器 docker run -d --name redis-node1 --net host --privilegedtrue -v /usr/local/redis/node1:/data red…

Vue实现点击按钮或者图标可编辑输入框

博主介绍 📢点击下列内容可跳转对应的界面,查看更多精彩内容! 🍎主页:水香木鱼 🍍专栏:后台管理系统 文章目录 简介:这是一篇有关【Vue - 实现点击按钮(笔图标&#xff…

VS五子棋大战

本项目里面只是浅述了一下基本实现步骤,很多细节的地方都在注释中标注了,如需完整代码请去博主码云哦。zqy (zhang-qinyang1) - Gitee.com 目录 一、用到的关键技术点 二、主要模块 1.使用mybatis操作连接数据库 1.1修改spring配置文件 1.2创建实体…

json.converter

爬虫组件分析目录概述需求:设计思路实现思路分析1.ActivityProcessor2.AssociationJsonConverter3.BaseBpmnJsonConverter4.BoundaryEventJsonConverter5.BpmnJsonConverter拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , …

【出人意料】一种基于Vue2监听器(watch)和定时器(setInterval)的轨迹播放方法实现方案

1、需求 数据库中有设备的经纬度记录,前端需要实现从数据库中取到数据后在地图上显示轨迹,显示轨迹的方式就是一个一个点地有序显示。点与点之间用线段连接,最终构成一条轨迹线。 2、场景过程 前端定义一个播放暂停按钮;点击播…

【Flutter】【package】auto_size_text 文字自动适配大小

文章目录前言一、auto_size_text 是什么?二、使用1.简单的使用2.参数说明3.group4.rich text总结前言 auto_size_text :https://pub.flutter-io.cn/packages/auto_size_text 一、auto_size_text 是什么? 第三方的插件,能够自动适…

DDD的落地,需要基础设施的大力支持

1. 概览 对于复杂业务,DDD 绝对是一把神器,由于它过于复杂,很多人望而却步。因为太过严谨,形成了很多设计模式、规范化流程,这些爆炸的信息已经成为 DDD 落地的重大阻力。 但,如果我们将这些规范化的流程…

1.4_28 Axure RP 9 for mac 高保真原型图 - 案例27【中继器 - 后台管理系统5】功能-弹窗修改数据

相关链接 目录Axure中文学习网AxureShopAxureShop-QA 案例目标1. 了解使用中继器,弹窗修改数据的实现方式 一、成品效果 Axure Cloud 案例27【中继器 - 后台管理系统5】功能-弹窗修改数据 版本更新一、修改功能   1.1 点击修改按钮,标记该条数据&am…

国产软件Bigemap与国产在线地图源<星图地球数据云>推动国内新GIS应用

自星图地球数据云(GEOVIS Earth Datacloud)图源成为国产基础软件Bigemap的在线地图数据服务平台之一以来,其日均地图瓦片请求调用量目前已经超过2亿。 “星图地球数据云"是中科星图(股票代码[688568])旗下子公司——星图地球倾力打造的在线时空数据云服务平台…

基于约束的装配设计【CadQuery】

本教程介绍在CadQuery中如何使用装配约束功能来构建逼真的模型,我们将组装一个由 20x20 V 型槽型材制成的门组件。 1、定义参数 我们希望从定义模型参数开始,以便以后可以轻松更改尺寸: import cadquery as cq# Parameters H 400 W 200…

2.8 高收藏率小红书笔记怎么写?试一试这7类方法吧【玩赚小红书】

1、教程攻略类 ​ ​ ​ 打开任何一类的美妆产品,最常见的就是各类妆容教程和变美攻略。就拿教程最多的眼妆来说吧,很多女孩子都觉得眼妆很难画好。 如果是碰到网上流行的网红眼影,比如什么猫眼妆、截断式眼影、桃花眼影等等。 【 高收藏秘…

社区团购小程序制作有什么优势_ 社区团购小程序的作用

打造属于自身的独立小程序拥有更高的自主性,特别是基于得店小程序的创新产品力,从设计上彰显品牌理念,到功能上进行扩展拓宽营销方式,都完全自我掌控, ● 更重要的是,相比于平台上各种复杂的机制&#xff0…

点击化学接头BCN-endo-PEG15-NH2,endo-BCN-十五聚乙二醇-胺

(本品应密封避光,储存于阴凉,干燥,通风处,取用一定要干燥,避免频繁的溶解和冻干) 【产品理化指标】: CAS:N/A 化学式:C43H80N2O17,分子量&#xf…

Vue3+TS+Vite 搭建组件库记录

使用pnpm 安装 npm install pnpm -g初始化package.json pnpm init新建配置文件 .npmrc shamefully-hoist true这里简单说下为什么要配置shamefully-hoist。 如果某些工具仅在根目录的node_modules时才有效,可以将其设置为true来提升那些不在根目录的node_modu…