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

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.rhkb.cn/news/249329.html

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

相关文章

git clone常见问题一览及解决方法

在使用Ubuntu下,终端运行git clone命令时会遇见许多问题,本文主要针对一些常见的问题进行整理。关于换源问题,推荐使用小鱼的一键换源。 1.git clone 速度过慢 1.1 魔法 这个方法不做过多赘述,ubuntu下个人使用发现体验良好&am…

matlab中的图窗属性和坐标轴的属性

图窗的Position和Outerposition Position 指定窗口的尺寸和窗口在屏幕中的位置。 Outerposition 指定窗口外轮廓的大小和位置。 两者都是用一个4维向量来定义,格式为[左 底 宽 高]。 可通过set函数修改Position和Outerposition,如下:在屏幕左…

【2024全网最详细】Google 搜索命令终极指南

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 你是否尝试过使用 Google 搜索作为免费的 SEO …

Flink 读取 Kafka 消息写入 Hudi 表无报错但没有写入任何记录的解决方法

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

设计一个支持并发的前端缓存接口

文章目录 一、概述二、并发缓存2.1、问题2.2、思考2.3、优化 三、总结四、最后 一、概述 缓存池不过就是一个map,存储接口数据的地方,将接口的路径和参数拼到一块作为key,数据作为value存起来罢了,这个咱谁都会。 const cacheMa…

pnpm tauri icon 一键转换 icon

在使用 Electron、Tauri 等框架开发桌面应用时,需要为应用生成不同平台的图标,如:MacOS 中的 icon.icns、Windows 中的 icon.ico、Linux 中的 *.png 等类型图标,这里介绍一种简单快捷一键转换图标的方法。 准备工作 nodejs 环境n…

ElasticSearch 应用实践 笔记

概述 介绍 ES 是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储,检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ElasticSearch的底层是开源库Lu…

c JPEG ZRL (15,0) 的问题

问题:如果量化表全为64个1,编码图片显示非常乱。如果用压缩比较大的量化表,显示基本正常。如果编码过程中不处理ZRL,图片正常。此问题一直没有排除。 下图为两张量化表全为64个1的情况下加了(15,0)后的不正…

[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] }

[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] } ubuntu20 win10 edge浏览器访问 服务器部署 页面打开后想使用chatgpt报错了 rootcoal-pasi1cmp:/www/wwwroot/ChatGPT-Next-Web# PORT3000 yarn start yarn run v1.22.19 warning package.json:…

实现vue3响应式系统核心-shallowReactive

简介 今天来实现一下 shallowReactive 这个 API。 reactive函数是一个深响应,当你取出的值为对象类型,需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应,即 只代理了对象的第一层,也就是 shallowReactiv…

【方法论】费曼学习方法

费曼学习方法是由诺贝尔物理学奖得主理查德费曼提出的一种学习方法。这种方法强调通过将所学的知识以自己的方式解释给别人来提高学习效果。 费曼学习方法的步骤如下: 选择一个概念:选择一个要学习的概念或主题。 理解和学习:用自己的方式学…

TCP四次握手

TCP 协议在关闭连接时,需要进行四次挥手的过程,主要是为了确保客户端和服务器都能正确地关闭连接。 # 执行流程 四次挥手的具体流程如下: 客户端发送 FIN 包:客户端发送一个 FIN 包,其中 FIN 标识位为 1&#xff0c…

MATLAB - 仿真单摆的周期性摆动

系列文章目录 前言 本例演示如何使用 Symbolic Math Toolbox™ 模拟单摆的运动。推导摆的运动方程,然后对小角度进行分析求解,对任意角度进行数值求解。 一、步骤 1:推导运动方程 摆是一个遵循微分方程的简单机械系统。摆最初静止在垂直位置…

阿赵UE学习笔记——14、LOD

阿赵UE学习笔记目录   大家好,我是阿赵。   继续学习虚幻引擎的用法。这次看看虚幻引擎的Level Of Detail(LOD)的用法。 一、测试场景准备 用植物系统,在地形上面刷了好多草: 这个时候看一下网格,会发现网格比较多和密集。 …

Leetcode第382场周赛

Leetcode第382场周赛 本人水平有限,只做前三道。 一、按键变更的次数 给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s “ab” 表示按键变更一次,而 s “bBBb”…

tableau绘制雷达图

目标图形: 1. 数据准备 (1)原始数据 你要进行用雷达图比较的对象的各指标的数据。 (2) 处理后数据 在原数据的基础上添加对各指标进行区间的划分数据,也就是层级的划分。 2. 操作步骤 (1)数据转化 转化前&#xf…

Logstash 7.7.1版本安装系统梳理

前言 上一篇文章介绍了 《ElasticSearch7.7.1集群搭建 & Kibana安装》,今天说一下 Logstash的安卓和配置; Logstash是一个开源的数据收集引擎,具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来,并将数据标准化…

idea docker 镜像生成太慢太大问题

文章目录 前言一、更小的jdk基础镜像二、服务瘦包(thin jar)2.1 maven2.2 修改dockerfile2.3 container run options 三、 基础jdk镜像入手?总结 前言 idea docker 内网应用实践遗留问题 idea docker插件 build 服务镜像太慢服务镜像太大 …

补充推导步骤,重写 Matrix Computations 5.1.2 节

本来的内容有点小小的跳跃,补一下跳跃的部分,下次推导时省点时间,备忘 1. 补充后的内容 2. 代码 LaTeX code: \documentclass{article} \title{Matrix Computations 5.1.2 time saving revision} \date{} \begin{document} \mak…

CSRF靶场练习

简述:CSRF漏洞实际很少;条件限制很多;局限性很大;实验仅供参考,熟悉csrf概念和攻击原理即可 Pikachu靶场 CSRF GET 登录用户vince的账户可以看到用户的相关信息; 点击修改个人信息,发现数据包…