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.mfbz.cn/a/783661.html

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

相关文章

昇思第18天打卡|ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作:Pointw…

使用命令行修改Ubuntu 24.04的网络设置

Ubuntu里,使用命令行下修改IP地址,网上有很多方案,我最终觉得这个方案(使用Netplan)最好,最根本,记录下来备查 1.使用命令ip link show 查看Ubuntu上可以使用的网络接口名称 2.查找Netplan的配…

「Java开发指南」如何用MyEclipse完成Spring Web Flow 2.0搭建?

本教程将引导您完成Spring Web Flow的软件组件生成,这是Spring的一个项目,用于简化Web应用程序的开发。虽然Spring Web Flow与Spring MVC兼容,但Spring Web Flow使用流而不是控制器来实现应用程序的Web层。在本教程中,您将学习如何…

放大镜案例

放大镜 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>商品放大镜</title><link rel&qu…

可控硅整流自动恒流充电器设计制作

该充电器除可为各种镍镉电池充电外&#xff0c;也可为干电池充电。其充电电流可调。充电终止电压由RP1预先确定。 工作原理 电路原理见图1。开始充电时&#xff0c;电池组两端电压较低&#xff0c;不足以使晶体管VT导通。由RC组成的移相电路给可控硅提供触发电流。移相角度由R…

Java技术栈总结:Spring框架篇

一、SpringBean 1、定义方式 </bean>标签&#xff08;XML文件&#xff09;Bean注解Component注解BeanDefinition方法FactoryBeanSupplier 注&#xff1a;BeanDefinition方法为“</bean>标签、Bean注解、Component注解”的底层实现。 &#xff08;1&#xff09;…

【K8s】专题六(5):Kubernetes 稳定性之重启策略、滚动更新策略

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、重启策略 1、基本介绍 2、资源清单&#xff08;示例&#xff09; 二、滚动更新策略 …

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇-续

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

Zabbix自动发现

目录 自动发现的主要特点包括&#xff1a; 如何配置自动发现&#xff1a; 实验步骤 1. 创建自动发现规则 2. 给自动发现规则创建动作 3. 给新主机安装agent 在 Zabbix 中&#xff0c;自动发现&#xff08;Auto Discovery&#xff09;是一种强大的功能&#xff0c;用于自…

Vue CoreVideoPlayer 一款基于 vue.js 的轻量级、优秀的视频播放器组件

大家好,我是程序视点的小二哥!今天小二哥给大家推荐一款非常优秀的视频播放组件 效果欣赏 介绍 Vue-CoreVideoPlayer 一款基于vue.js的轻量级的视频播放器插件。 采用Adobd XD进行UI设计&#xff0c;支持移动端适配,不仅功能强大&#xff0c;颜值也是超一流&#xff01; Vue-…

读书记录《SQL从小白到大牛》01

读书记录《SQL从小白到大牛》01 接地气的书名&#xff0c;内容应当值得一读。 第一篇 SQL基础 01 一些基础概念 SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;&#xff0c;是一套用来输入、更改和查看关系数据库内容的命令。数据库发展经历三个阶…

ROS-机械臂-基础概念

课纲 话题通信模型&#xff08;多对多&#xff09; RPC RPC&#xff0c;全称为 Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是一种通信协议&#xff0c;允许一个计算机程序在另一个网络上的计算机上执行一组函数或过程&#xff0c;而不需程序员显式编码网络…

SketchUp如何阵列?

sketchup如何阵列&#xff1f;请看下面方法。 方法 打开SketchUp。 以默认人物为例。 按M&#xff0c;选中人物&#xff0c;再按住Ctrl移动鼠标&#xff08;不要点击鼠标键&#xff09; 按键盘数字键输入距离&#xff0c;按回车&#xff0c;不要动鼠标。 按*10设置阵列数。 按…

前端开发攻略---webSocket的简单实现与使用

1、演示 2、实现流程 安装依赖 npm i ws 服务端代码 const WebSocket require(ws)// 创建一个 WebSocket 服务器&#xff0c;监听端口 3000 const wss new WebSocket.Server({ port: 3000 })// 监听连接事件 wss.on(connection, function connection(ws) {console.log(客户端…

MySQL篇四:表的约束

文章目录 前言1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。…

香橙派编译linux内核支持ebpf和虚拟WIFI

前言 上一篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)中说了怎么运行redroid&#xff0c;这篇补一下怎么修改参数编译内核。 补充 上篇文章有个内容需要补充一下&#xff1a;更新完内核需要用下面的命令防止内核被apt更新&#xff0c;不然后面使用apt update又回…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出&#xff0c;MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询&#xff0c;第一个会列…

HTML5新增的input元素类型:number、range、email、color、date等

HTML5 大幅度地增加与改良了 input 元素的种类&#xff0c;可以简单地使用这些元素来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 到目前为止&#xff0c;大部分浏览器都支持 input 元素的种类。对于不支持新增 input 元素的浏览器&#xff0c;input 元素被统一…

位置编码的具体计算方式(公式解释)

公式 (10.6.2) 描述了位置编码的具体计算方式&#xff0c;这种位置编码基于正弦和余弦函数&#xff0c;用于在自注意力机制中引入位置信息。下面我们详细解释公式和代码。 公式 (10.6.2) 公式 (10.6.2) 的目的是为输入序列中的每个词元添加一个位置编码&#xff0c;以保留序列…

厦门大学-中央空调分户计费预付费管理系统案例

厦门大学-中央空调分户计费预付费管理系统案例 实现中央空调节能与舒适的双重目标随着社会的发展和人们生活水平的提高&#xff0c;空调已成为现代建筑中不可或缺的设备。传统的集中计费方式已无法满足多样化的用户需求和节能减排的市场趋势。中央空调如何公平、公正、合理的收…