【Spark系列2】Spark编程模型RDD

news2024/11/20 1:23:51

RDD概述

RDD最初的概述来源于一片论文-伯克利实验室的Resilient Distributed Datasets:A Fault-Tolerant Abstraction for In-Memory Cluster Computing。这篇论文奠定了RDD基本功能的思想

RDD实际为Resilient Distribution Datasets的简称,意为弹性分布式数据集

RDD的基本属性

1、分区

RDD的中文含义是弹性分布式数据集,其中分区的概念实现了分布式所需的功能。每个分区中包含一部分数据,通过对每个分区的数据计算以及最后对结果数据的汇总,从而实现对整个数据集的计算。RDD的计算是以分区为单位进行的,而且同一分区的所有数据都进行相同的计算。对于同一分区的数据而言,要么全执行,要么全不执行。理论上分区越多,能够并行计算任务数据越多,但还是会收到物理资源如CPU等的限制。

2、计算函数

RDD的数据被分区了,但是每个分区的数据是如何来的呢,一个RDD的数据来源只有两种:一是从数据源或集合中进行加载运行的到RDD的数据;而是通过其他RDD进行一定的转换的来的数据,无论哪种方式,RDD的数据都是通过其计算函数得到的。计算函数compute返回值为迭代器器类型。

如Spark在加载HDFS中的数据时,每个分区的数据通过计算函数加载对应的block块的数据,从而实现了数据分布式加载的过程,如下图

Spark还可以从集合中创建RDD,实现每个分区加载集合中的一部分数据,如SparkContext中实现的parallelize的并行集合的方法。甚至可以自定义分区函数实现特定加载数据的方式,如将历史数据按照时间分区进行加载

3、依赖

在RDD进行转换过程中,子RDD是通过父RDD转换而来的。但在具体的实现过程中,所有RDD的数据都是通过其计算函数而得到的,所以,子RDD在计算过程中需要得到父RDD的,分局父RDD的数据算出子RDD每个分区的数据。

在RDD计算时有些子RDD的一个分区只依赖父RDD的一个分区,即每个父RDD的分区最多被子RDD的一个分区所使用,则这种依赖方式称为窄依赖,如下图

在RDD计算时,如果一个分区的数据依赖了父RDD多个分区的数据,即多个子RDD的分区数据依赖了父RDD的同一个分区的数据,这种依赖方式称为宽依赖

4、分区器

并不是所有的RDD都有分区器(partitioner),一般只有(Key,Value)形式的RDD才有分区器。分区器在Shuffle的Map阶段使用,当RDD的计算发生Shuffle时,Map阶段虽然将结果进行保存,供Reduce阶段的任务来拉取数据,但是Map阶段的每个分区的数据可能会被Reduce阶段的多个分区使用。如何把Map阶段的数据进行分组,区分出时给Reduce阶段的RDD哪个分区使用呢,这就是分区器(pattitioner)的作用

5、首选运行位置

每个RDD对于每个分区来说都有一组首选运行位置,用于表示RDD的这个分区数据最好能在哪台主机上运行。通过RDD的首选运行位置,可以让RDD的某个分区的计算任务直接在指定主机上运行,从而实现了移动计算而不是移动数据的目的,减小了网络传输的开销,如Spark中HadoopRDD能够实现加载数据的任务在相应的数据节点上执行

RDD的缓存

如果一个RDD在计算完成后,不是通过流水线的方式被一个RDD调用,而是被多个RDD调用,则在计算过程中就需要对RDD进行缓存,避免二次计算。尤其是一个RDD经过多次特别复杂的Shuffle生成的数据,缓存之后可以极大的提升程序运行的效率。

因为RDD是分布式的,不同的分区散落在不同的物理节点上,所以RDD的缓存也是分布式的。让对RDD进行缓存时,可以将每个分区的数据直接缓存在当前计算节点,每个计算节点缓存一部分数据,完成整个RDD的缓存,如图

RDD的容错机制

RDD的容错时通过lineage机制实现的。因为每个RDD的数据都可以通过其父RDD转换而来。如果运行的过程中,某一个分区的数据丢失,则重新计算该分区的数据。当此RDD的依赖时窄依赖时,只需要计算依赖的父RDD的一个分区的数据即可,避免了一个节点出错则所有数据节点都重新计算的缺点。但是如果丢失数据的RDD的依赖是宽依赖,那么分区的数据可能是父依赖的所有分区数据,这种情况下必须重新计算父RDD分区的所有数据,从而完成数据的恢复

Spark RDD的操作

Spark定义了很多对RDD的操作,主要分为两类:transformation 和 action。transformation操作并不会真正的触发Job的执行,它只是定义了RDD和RDD之间的lineage,只有action操作才会触发Job的真正执行。

1、transformation操作

在Spark中,主要的transformation操作如下

操作说明
map迭代RDD中的每个元素生成新的RDD
filter对RDD的元素进行过滤
flatMap和Map类似,将每个元素转为0个或多个元素
mapPartitions迭代每个分区,这在操作数据库时,可以将每个分区创建一个连接
distinct将数据去重,涉及shuffle
groupByKey按照Key进行分组
reduceByKey按照Key进行聚合
union将两个RDD整合成一个RDD
coalesce减小分区数量,一般用在执行filter,过滤掉大量数据后调用
repartition重新分区,这会在城所有的数据进行shuffle

2、action操作

操作说明
collect将所有的数据作为一个数据返回Driver程序。当每个分区数据较多,返回Driver中时,可能会造成内存溢出。
count返回RDD数据的总数
first返回RDD中的第一个元素
take将RDD中的前n个元素作为数组返回
saveAsTextFile将数据写入文件系统
foreach对RDD中的每个元素都应用给定的函数
reduce按照给定的函数将数据聚合

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

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

相关文章

Linux提权:Docker组挂载 Rsync未授权 Sudo-CVE Polkit-CVE

目录 Rsync未授权访问 docker组挂载 Sudo-CVE漏洞 Polkit-CVE漏洞 这里的提权手法是需要有一个普通用户的权限,一般情况下取得的webshell权限可能不够 Rsync未授权访问 Rsync是linux下一款数据备份工具,默认开启873端口 https://vulhub.org/#/envir…

Linux:共享内存

文章目录 System V共享内存的原理管理共享内存shmgetshmatshmdtshmctl 共享内存和管道实现进程间同步通信 前面介绍完了匿名管道和命名管道,那么本篇要引入的主题是共享内存 System V 作为进程通信部分的内容,共享内存必然有其存在的意义和价值&#x…

RabbitMQ快速实战

目录 什么是消息队列? 消息队列的优势 应用解耦 异步提速 削峰填谷 总结 主流MQ产品特点比较 Rabbitmq快速上手 创建用户admin Exchange和Queue Connection和Channel RabbitMQ中的核心概念总结 什么是消息队列? MQ全称Message Queue&#xf…

从零学习Linux操作系统 第二十二部分 企业域名解析服务的部署及安全优化

# 一、dns的主要信息 关于dns的名词解释:dns: domain name service(域名解析服务) 关于客户端: /etc/resolv.conf dns指向文件 A记录 ##ip地址叫做域名的Address 记录 SOA ##授权起始主机 关于服务端 bind安装包named服务名称/etc/named.conf主配置文件/var/na…

【深度学习:多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型

【深度学习:多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型 Meta 发布开源人工智能工具的历史分段任何模型DINOv2 什么是多模态学习?什么是嵌入?什么是 ImageBind?集成在 ImageBind 中的模式图像绑定架构特定模式编码器跨…

window下如何安装ffmpeg(跨平台多媒体处理工具)

ffmpeg是什么? FFmpeg是一个开源的跨平台多媒体处理工具,可以用于录制、转换和流媒体处理音视频。它包含了几个核心库和工具,可以在命令行下执行各种音视频处理操作,如剪辑、分割、合并、媒体格式转换、编解码、流媒体传输等。FFmpeg支持多…

java设计模式:工厂模式

1:在平常的开发工作中,我们可能会用到不同的设计模式,合理的使用设计模式,可以提高开发效率,提高代码质量,提高系统的可拓展性,今天来简单聊聊工厂模式。 2:工厂模式是一种创建对象的…

Java TemporalAdjusters 时间调节器

提供了非常多处理日期相关的函数: 使用示例: /*** JCccc* param args*/public static void main(String[] args) {DateTimeFormatter pattern DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDateTime now LocalDateTime.now();//获取当月…

备战蓝桥杯---二分(入门)

话不多说,先来个模板题来回顾一下上次讲的: 下面是AC代码: 下面进入正题: 本题对1,2行与3,4行组合,再用二分查找即可实现n^2logn的复杂度。 下面是AC代码: 接题: 让我们…

基于springboot校园交友网站源码和论文

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

QT学习日记 | QT的环境搭建

目录 前言 一、QT概述 二、QT的环境搭建 1、QT SDK安装 2、环境变量的配置 前言 本系列为小编新开的一个系列,主要记录小编学习QT的过程,作为笔记仅供各位参考; 一、QT概述 Qt是一个跨平台C图形应用界面框架;简单来说&#x…

Android 13.0 SystemUI下拉状态栏定制二 锁屏页面横竖屏时钟都居中功能实现二

1.前言 在13.0的系统rom定制化开发中,在关于systemui的锁屏页面功能定制中,由于在平板横屏锁屏功能中,时钟显示的很大,并且是在左旁边居中显示的, 由于需要和竖屏显示一样,所以就需要用到小时钟显示,然后同样需要居中,所以就来分析下相关的源码,来实现具体的功能 如图…

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序,如assert,缺陷:用户难以…

鸿蒙 ArkTs初识

前提:基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌) 吐槽:官网上的案例只有代码和文档解释,没有可以直接运行查看效果的模拟器,这一点上&#…

Qt|大小端数据转换

后面打算写Qt关于网络编程的博客,网络编程就绕不开字节流数据传输,字节流数据的传输一般是根据协议来定义对应的报文该如何组包,那这就必然牵扯到了大端字节序和小端字节序的问题了。不清楚的大小端的可以看一下相关资料:大小端模…

【RTP】webrtc 学习3: webrtc对h264的rtp解包

rtp_rtcp\source\video_rtp_depacketizer_h264.cc【RTP】webrtc 学习2: webrtc对h264的rtp打包 中分析了打包过程的代码,这样再来看解析过程的源码就容易多了:本代码主要基于m79,m98类似。这里注明了jitterbuffer 会再次 做 解析stap-a 变为NAL units解析ParseFuaNalu 第一…

Jmeter 分布式测试

Jmeter单机进行压测,受到单台机器的性能影响,Jmeter支持分布式测试,用一个控制节点去控制多个工作节点去模拟更多的用户。 版本信息 内容版本号JDK1.8Jmeter5.6.2 分布式测试原理 jmeter 官网对分布式测试有说明,jmeter分布式…

RabbitMQ 死信交换机的详述➕应用

🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 一.什么是死信交换机 二. 死信队列…

说说你对vue的mixin的理解,有什么应用场景

mixin是什么 Vue中的mixin 局部混入全局混入注意事项: 使用场景源码分析Vue 的几种类型的合并策略 替换型合并型队列性叠加型小结 此文章,来源于印客学院的资料,这里只是分享,便于查漏补缺。 mixin是什么 Mixin 是 面向对象程序设计语言中…

一文理清楚-Docker 容器如何工作

Docker 容器如何工作 集装箱什么是虚拟机?虚拟化如何运作?什么是容器?什么是 Docker?总结 五星上将麦克阿瑟曾经说过:在docker面前,虚拟机就是个弟弟 集装箱 《盒子:集装箱如何让世界变得更小&…