Spark 分布式弹性计算集(RDD)相关概念介绍

目录

一、概述

二、RDD的核心概念

2.1 Partition

2.2 Partitioner

2.3 RDD的依赖关系

2.4 Stage

2.5 PreferredLocation

2.6 CheckPoint

三、RDD的持久化

3.1 概述

3.2 概念

3.3 RDD持久化级别

3.3.1 MEMORY_ONLY

3.3.2 MEMORY_AND_DISK

3.3.3 MEMORY_ONLY_SER

3.3.4 OMEMORY_AND_DISK_SER

3.3.5 DISK_ONLY

3.3.6 MEMORY_ONLY2和MEMORY_AND_DISK2

3.3.7 OFF_HEAP

3.4 RDD 持久化原则

3.5 删除RDD持久化缓存


一、概述

RDD是 Spark 中最基本的数据抽象,代表一个不可变、可分区、元素可并行计算的集合。RDD具有自动容错、位置感知性调度和可伸缩等特点。RDD 允许用户在执行多个查询时显式地将数据集缓存在内存中,后续查询能够重用该数据集,这极大地提升了查询效率。

二、RDD的核心概念

2.1 Partition

RDD内部的数据集在逻辑上和物理上都被划分为多个分区(Partition)以提高运行的效率,分区数量决定了计算的并行度,每一个分区内的数据都在一个单独的任务中被执行,如果在计算过程中没有指定分区数,那么 Spark 会采用默认分区数量。默认分区数量为程序运行分配到的CPU核数。

2.2 Partitioner

Partitioner 是 RDD的分区函数。分区函数不但决定了 RDD本身的分区数量,也决定了其父 RDD Shuffle 输出时的分区数量。Spark 实现了基于 Hash(HashPartitioner)和基于范围(RangePartitioner)的两种分区函数。

注意:只有对于Key-Value的RDD才会有 Partitioner,而非 Key-Value的RDD的Parititioner 值是None。

2.3 RDD的依赖关系

RDD的每次转换都会生成一个新的 RDD,因此RDD之间会有前后依赖关系。当在计算过程中出现异常情况导致部分分区数据丢失时,Spark 可以通过依赖关系从父 RDD 中重新计算丢失的分区数据,而不需要对 RDD上的所有分区全部重新计算。RDD的依赖分为窄依赖和宽依赖。

  •  窄依赖:如果父 RDD的每个分区最多只能被子RDD的一个分区使用,则称之为窄依赖。
  • 宽依赖:如果父 RDD的每个分区都可以被子RDD的多个分区使用,则称之为宽依赖。

窄依赖的每个子RDD的Partition 的生成操作都是可以并行的,而宽依赖则需要所有父Partition Shuffle结果完成后再被执行。Spark的窄依赖和宽依赖如图所示:

2.4 Stage

Stage 是由一组 RDD组成的可进行优化的执行计划。如果 RDD的依赖关系为窄依赖,则可放在同一个 Stage 中运行;若 RDD的依赖关系为宽依赖,则要划分到不同Stage 中。这样,当Spark 执行作业时,会按照Stage 划分不同的RDD,生成一个完整的最优的执行计划,使每个 Stage 内的 RDD都尽可能在各个节点上并行地被执行,

如图所示:

阶段三 包含 阶段一和 阶段二,其中,阶段一为宽依赖,阶段二为窄依赖。

2.5 PreferredLocation

PreferredLocation 是一个用于存储每个 Partition 的优先位置的列表。对于每个 HDFS文件来说,这个列表保存的是每个 Partition 所在的块的位置也就是该HDFS文件的“划分点”。

2.6 CheckPoint

CheckPoint 是Spark 提供的一种基于快照的缓存机制。当需要计算的 RDD 过多时,为了避免任务执行失败后重新计算之前的 RDD,可以对 RDD 做快照(CheckPoint)处理,检查 RDD 是否被计算,并将结果持久化到磁盘或 HDFS 上。

此外Spark 提供另一种缓存机制 Cache,Cache 缓存数据由 Executor 管理,当Executor 消失时Cache 缓存的数据将被清除,而 CheckPoint将数据保存到永久性磁盘或HDFS,当计算出现运行错误时,Job可以从CheckPoint 点继续计算。

三、RDD的持久化

3.1 概述

Spark 可以跨节点在内存中持久化 RDD。当持久化 RDD时,每个节点都会在内存中缓存计算后的分区数据,当其他操作需要使用该 RDD 时,可以直接重用该缓存数据,这使得之后的 RDD 计算速度更快(通常超过10倍)。缓存是选代计算和交式计算的关键。

3.2 概念

应用程序可以使用 persist0或 cache0标记要缓存的 RDD,当调用操作(Action)执行计算时,计算结果将被缓存在节点的内存中。Spark 缓存具有容错性,如果 RDD的某个分区丢失,则该RDD将被自动重新计算。

每个持久化 RDD 都可以使用不同存储级别进行存储,Spark 允许将数据集存储在磁盘上或内存中。Spark 将需要缓存的数据序列化为 Java 对象(序列化可以节省磁盘或内存空间),然后跨节点复制到其他节点上,以便其他节点重用该数据。Spark 中缓存持久化级别是通过StorageLevel来设置的。具体代码如下

lineLengths.persist(storageLevel.MEMORY_ONLY());

3.3 RDD持久化级别

3.3.1 MEMORY_ONLY

使用未经过序列化的 Java 对象在内存中存储 RDD。当内存不够时,将不会进行持久化:当下次需要该 RDD 时,再从源头处重新计算。该策略是默认的持久化策略,当使用 cache()时,使用的是该持久化策略。

3.3.2 MEMORY_AND_DISK

使用未经过序列化的 Java 对象存储 RDD,优先尝试将RDD保存在内存中。如果内存不够,则会将 RDD写人磁盘文件;当下次需要该 RDD时从持久化的磁盘文件中读取该 RDD 即可。

3.3.3 MEMORY_ONLY_SER

MEMORY_ONLY_SER 的含义与 MEMORY_ONLY 类似唯一区别是MEMORY_ONLY_SER 会将 RDD中的数据进行序列化。在序列化过程中,RDD的每个 Partition 都将会被序列化成一个字节数组,这种方式更加节省内存,从而避免持久化的RDD占用过多内存导致JVM频繁GC。

3.3.4 OMEMORY_AND_DISK_SER

MEMORY_AND_DISK_SER 的含义与 MEMORY_AND_DISK类似。唯一区别是MEMORY_AND_DISK_SER会将RDD中的数据进行序列化。在序列化过程中,RDD的每个 Partition 都会被序列化成一个字节数组。这种方式更

加节省内存,从而避免持久化的 RDD占用过多内存导致频繁GC。

3.3.5 DISK_ONLY

使用未序列化的Java对象将 RDD全部写人磁盘文件。

3.3.6 MEMORY_ONLY2和MEMORY_AND_DISK2

对于上述任意一种持久化策略如果加上后缀 2,代表的是将每个持久化的数据都复制一份副本,并将副本保存到其他节点上。这种基于副本的持久化机制主要用于容错。假如某个节点挂掉,节点的内存或磁盘中的持久化数据丢失了,那么后续对 RDD 计算时还可以使用该数据在其他节点上的副本。如果没有副本,则只能将这些数据从头重新计算一遍。

3.3.7 OFF_HEAP

OFF_HEAP与MEMORY_ONLY_SER类似,OFF_HEAP将数据存储在堆外内存中。该参数需要Spark 启用堆外内存。

3.4 RDD 持久化原则

Spark 提供了丰富的存储级别,旨在通过不同存储级别的设置实现内存和CPU的最佳使用,具体开发中该如何选择持久化方案呢?以下为 Spark 官方提供的缓存持久化的选择流程。

  1. 如果RDD在默认存储级别(MEMORYONLY)下运行良好,则建议使用MEMORY_ONLY。该级别是CPU效率最高的类型,基于CPU快速计算可以使 RDD上的操作尽可能快地运行。
  2. 如果系统显示内存使用过高,则尝试使用MEMORY_ONLY_SER,并选择更快速的序列化库,以加快序列化时间和节省对象的存储空间。
  3. 如果要快速恢复故障,则建议使用副本存储级别。其他存储级别需要通过重新计算丢失的数据来保障缓存的完整性,而副本存储级别可以在其缓存对应的副本节点上直接执行任务,不用等待重新计算丢失的分区数据

3.5 删除RDD持久化缓存

Spark 会自动监视每个节点上的缓存使用情况,并以 LRU方式删除旧的数据分区如果想手动删除RDD,则可通过RDD.unpersist()方法完成。

今天Spark RDD的相关内容就分享到这里,可以关注Spark专栏《Spark》,后续不定期分享相关技术文章。如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

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

相关文章

基于语义的法律问答系统

第一步,准备数据集 第二步,构建索引数据集,问答对数据集,训练数据集,召回评估数据集 第三步,构建dataloader,选择优化器训练模型,之后召回评估 第四步,模型动转静,之后…

【UE5.1 角色练习】15-枪械射击——子弹发射物

目录 效果 步骤 一、创建并发射子弹 二、优化子弹 效果 步骤 一、创建并发射子弹 1. 在前面的文章中(【UE5.1 角色练习】06-角色发射火球-part1)我们创建了蓝图“BP_Skill_FireBall” 这里我们复制一份命名为“BP_Ammo_5mm”,用于表示…

若依搭建 帝可得 售货机 笔记

一、搭建项目 1.后端gitee链接: 启动项目时记得修改mysql和redis的相关信息;创建项目相关数据库,并导入初始化的SQL脚本 dkd-parent: 帝可得后台管理系统 (gitee.com) 2.前端gitee链接: 启动项目时记得安装依赖:np…

Github Action 自动部署更新静态网页服务

本文首发于 Anyeの小站,点击跳转 获得更优质的阅读体验 前言 贴一段胡话 在用过 应用:静态网页服务 之后,事实证明: 总而言之,自动化是一个很令人着迷的东西,摆脱重复繁琐的工作,解放了双手的…

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…

【45 Pandas+Pyecharts | 去哪儿海南旅游攻略数据分析可视化】

文章目录 🏳️‍🌈 1. 导入模块🏳️‍🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 日期处理,提取年份、月份2.4 经费处理2.5 天数处理 🏳️‍🌈 3. Pyecharts数据可视化3.1 出发日期_…

华南师范大学“大学生校外实践教学基地”授牌仪式暨见习参观活动圆满结束

为促进校企合作的深入发展,培育出具有实际应用技能的人才,7月9日,华南师范大学数学科学院与广东泰迪智能科技股份有限公司联合开展“大学生校外实践教学基地”授牌仪式暨见习参观活动。华南师范大学数学科学院数据科学系主任陈艳男、副主任陈…

Idea 2023 使用GitLab提交代码提示输入Token

项目场景: 今天电脑换硬盘了,安装了 IDEA2023 款的社区版开发工具,下载代码后,提交并推送代码到远程服务器的时候,提示输入Token,并不是用户名和密码。 问题描述 推送代码到远程GitLab本地仓库的时候&…

单链表--续(C语言详细版)

2.6 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x); 分为两种情况:1. 插入的数据在链表中间;2. 插入的数据在链表的前面。 // 在指定位置之前插入数据 void SLTInsert(SLTNode** …

AI绘画何以突飞猛进? 从历史到技术突破, 一文读懂火爆的AI绘画发展史

前言 自从前段时间偶然间被当下AI绘画的水平震住之后(超越一切的AI作画神器,和它创作的234个盔甲美女未来战士) ,作者深感当今AI绘画的飞速进展或许已远超所有人的预期。 而这里的前因后果,包括AI绘画的历史&#xff…

十九.升职加薪系列-JVM优化-解决JVM性能瓶颈的JIT即时编译器

前言 在很多年以前,做C或者C的程序员经常说Java语言的运行速度不如C或C,Java运行速度慢主要是因为它是解释执行的,而C或C是编译执行的,解释执行需要通过JVM虚拟机将字节码实时翻译成机器码(边翻译边执行)&…

Rust 版本升级:rustup update stable 报错

Rust 版本升级 rustup update stable 报错 一、报错内容 error: could not download file from ‘https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256’ to ‘/Users/xxx/.rustup/tmp/rv6vdfu3eupwo64m_file’: failed to make network request: error sendi…

【实战场景】@Transactional中使用for update的注意点

【实战场景】Transactional中使用for update的注意点 开篇词:干货篇:知识回顾注意点1.锁的范围和粒度:2.事务的隔离级别:3.死锁:4.性能影响:5.事务的边界:6.异常处理:7. 数据库和存储…

【漏洞复现】网神 SecGate 3600 防火墙 sys_export_conf_local_save 任意文件读取

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

javaweb学习day5--《HTML篇》Springboot的模块创建、HTML的相关知识点详解

一、前言 从今天开始,就要启动后端的学习了,Springboot会贯穿到底,一定要跟着小编严谨的去搭建Springboot环境,依赖添加的过程可能需要2分钟左右,读者们要耐心等待一下,搭建好Springboot之后才算正式的开始…

算力革命:弹性租赁,解锁无限可能

华为创始人任正非曾在一场程序设计竞赛中说道,我们即将进入第四次工业革命,基础就是大算力。事实上,随着5G、人工智能等信息技术的迅猛发展,算力需求持续增长,但高昂的成本和快速的技术迭代让许多中小企业和个人开发者…

Covalent Network(CXT)通过社区投票将代币迁移并更名为 CXT,以推动人工智能更深层次的创新

专注于人工智能和 Web3 的模块化数据基础设施 Covalent Network(CXT)宣布,其治理提案已通过社区投票并顺利实施,即将原生代币 CQT 迁移为新的 CXT 代币,并部署至新的合约。这一关键性转变标志着 Covalent Network&…

springboot文达办公物资管理系统-计算机毕业设计源码51191

摘要 本文介绍了一种名为"文达办公物资管理系统"的基于JAVA语言、基于Springboot框架和MYSQL数据库开发的管理系统。该系统主要分为管理员和员工用户两个角色,以满足不同用户的需求。 对于管理员用户,系统提供了仪器设备管理、设备借用管理、设…

【大数据技术】换新电脑了,如何快速迁移MySQL到新电脑上(含程序+数据),这样既快速又高效,省去了“各种安装+各种配置+各种迁移数据”带来的麻烦和时间

【大数据技术】换新电脑了,如何快速迁移MySQL到新电脑上(含程序数据 背景步骤总结 背景 很久没有写博文了哦,最近我换了新的笔记本,于是需要在新笔记本电脑上搭建MySQL环境,因为我原电脑上是安装的MySQL解压版,故我想偷偷懒&…

可理解性评估:使用Google Gemini优化语音识别的意义保留

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…