SparkRDD之——RDD概述

2024-04-30 18:08
文章标签 概述 rdd sparkrdd

本文主要是介绍SparkRDD之——RDD概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、什么是RDD

①弹性:

②分布式

③数据集

④数据抽象

⑤不可变

2、RDD特征

①分区列表

②分区计算函数

③依赖于其他RDD

④(Key,Value)数据类型的RDD分区器(可选特征)

⑤首选位置(可选特征)

3、执行原理

4、RDD的依赖

①窄依赖

②宽依赖

4、创建RDD

①在内存中创建

②读取文件创建

5、spark分区方式

①读取数据分区方式

②如何分区


1、什么是RDD

RDD Resilient Distributed Dataset )叫做弹性分布式数据集,是 Spark 中最基本的 数据处理模型 。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。

①弹性:

⚫存储的弹性:内存与磁盘的自动切换,Spark优先把数据放到内存中,如果内存放不下,就会放到磁盘里面,程序进行自动的存储切换。

⚫容错的弹性:数据丢失可以自动恢复,在RDD进行转换和动作的时候,会形成RDD的Lineage依赖链即血统,当某一个RDD失效的时候,可以通过重新计算上游的RDD来重新生成丢失的RDD数据。

⚫计算的弹性:计算出错重试机制,RDD的计算任务如果运行失败,会自动进行任务的重新计算,默认次数是4次。

⚫分片的弹性:可根据需要重新分片,动态调整数据分片的个数即可以重分区,提升整体的应用执行效率。

②分布式

数据存储在大数据集群不同节点上

③数据集

RDD 封装了计算逻辑,并不保存数据。数据在内存中的多个 RDD 操作之间进行传递,不需要在磁盘上进行存储和读取,避免了不必要的读写磁盘开销;

④数据抽象

RDD 是一个抽象类,需要子类具体实现

⑤不可变

RDD 封装了计算逻辑,是不可以改变的,想要改变,只能产生新的 RDD,在新的 RDD 里面封装计算逻辑

2、RDD特征

RDD总共有五个特征,三个基本特征,两个可选特征。

①分区列表

每个RDD被分为多个分区(Partitions),这些分区运行在集群中的不同节点,每个分区都会被一个计算任务处理,分区数决定了并行计算的数量,创建RDD时可以指定RDD分区的个数。如果不指定分区数量,当RDD从集合创建时,默认分区数量为该程序所分配到的资源的CPU核数(每个Core可以承载2~4个Partition),如果是从HDFS文件创建,默认为文件的Block数

②分区计算函数

Spark的RDD的计算函数是以分区为基本单位计算的,每个RDD都会实现 compute函数,对具体的分区进行计算。

③依赖于其他RDD

RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。因为RDD中是不保存数据的,所以要得到该分区数据必须从头开始计算。而如果出现shuffer即重分区,那么会从shuffer这里会产生一个新的血缘,如果要恢复数据那么需要从头开始重新计算。

④(Key,Value)数据类型的RDD分区器(可选特征)

当数据为 KV 类型数据时,可以通过设定自定义分区器自定义数据的分区

⑤首选位置(可选特征)

优先位置列表会存储每个Partition的优先位置,对于一个HDFS文件来说,就是每个Partition块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

3、执行原理

从计算的角度来讲,数据处理过程中需要计算资源(内存 & CPU)和计算模型(逻辑)。 执行时,需要将计算资源和计算模型进行协调和整合。

Spark 框架在执行时,先申请资源,然后将应用程序的数据处理逻辑分解成一个一个的计算任务。然后将任务发到已经分配资源的计算节点上, 按照指定的计算模型进行数据计算。最后得到计算结果。 即RDD 采用了惰性调用,即在 RDD 的执行过程中,所有的转换操作都不会执行真正的操作,只会记录依赖关系,而只有遇到了行动操作,才会触发真正的计算,并根据之前的依赖关系得到最终的结果。

正是 RDD 的这种惰性调用机制,使得转换操作得到的中间结果不需要保存,而是直接管道式的流入到下一个操作进行处理。

Yarn 环境中, RDD的工作原理:
1) 启动 Yarn 集群环境
2) Spark 通过申请资源创建调度节点和计算节点
3) Spark 框架根据需求将计算逻辑根据分区划分成不同的任务
4) 调度节点将任务根据计算节点状态发送到对应的计算节点进行计算

4、RDD的依赖

RDD的依赖关系分为两种模型,一种是窄依赖(narrow dependency)和宽依赖(wide dependency)。

①窄依赖

父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区(第一类),或者是多个父RDD的分区对应于一个RDD的分区(第二类),也就是说一个父RDD的一个分区不可能对应于一个子RDD的多个分区。

如下图所示,对输入进行协同划分(co-partitioned)的join属于第二类。当子RDD的分区依赖于单个父RDD的分区的时候,分区的结构不会发生改变,如下图中的map,filter等操作,相反的,对于一个子RDD的分区依赖于多个RDD的分区的时候,分区的结构会发生改变,如下图的union操作。

②宽依赖

宽依赖是值子RDD的每一个分区都要依赖于所有父RDD的所有分区或者多个分区。也就是说存在一个父RDD的一个分区对应着一个子RDD的多个分区。如下图的groupByKey就属于宽依赖。其中宽依赖会出发shuffle操作。

640

4、创建RDD

三种创建方式:

①在内存中创建

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))

②读取文件创建

val rdd: RDD[String] = sc.TextFile("Input/input.txt")

③读取多个文件创建

val rdd: RDD[(String, String)] = sc.wholeTextFiles("Input/WordCount")
//返回的是一个[String, String]类型元组,第一个元素表示文件路径,第二个元素表示文件内容

5、spark分区方式

①读取数据分区方式

makeRDD方法可以传递第二个参数,这个参数可以表示分区的数量

val sparkConf: SparkConf = new SparkConf().setMaster("local[4]").setAppName("Partition")
sparkConf.set("spark.default.parallelism", "3")
val sc: SparkContext = new SparkContext(sparkConf)
val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4), 2)
rdd.saveAsTextFile("OutPut/par-memory")


第二个参数可以不传递,makeRDD方法会使用默认值:defaultParallelism
spark在默认情况下,从配置对象中获取配置参数:spark.default.parallelism的值作为分区数
如果获取不到,那么使用totalCores属性得到分区数,即为当前运行环境的最大可用核数

val sparkConf: SparkConf = new SparkConf().setMaster("local[4]").setAppName("Partition")
sparkConf.set("spark.default.parallelism", "3")
val sc: SparkContext = new SparkContext(sparkConf)
val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
rdd.saveAsTextFile("OutPut/par-memory")

textFile分区数从配置对象中获取配置参数:spark.default.parallelism的值作为分区数如果获取不到,那么使用totalCores属性得到分区数,即为当前运行环境的最大可用核数

②如何分区

数据保存在内存中时
//两个分区时:【1,2】,【3,4】
val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4), 2)//三个分区时:【1】,【2】,【3,4】
val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4), 3)//五个值三个分区时:【1】,【2,3】,【4,5】
val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5), 3)
根据该函数进行分区
i为分区的分区号,length为数据长度,numSilence为分区数量
(start, end)为左开右闭(0 until numSlices).iterator.map { i =>val start = ((i * length) / numSlices).toIntval end = (((i + 1) * length) / numSlices).toInt(start, end)
}

 

这篇关于SparkRDD之——RDD概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949554

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE)似乎是最佳选择,因为它功耗低,在我们的手机中无处不在,而且无需连接到更广泛的网络。因此,蓝牙应用程序的需求也在不断增长。 通过阅读本文,您将了解如何开始在 Flutter 中开

类和对象的概述以及this指针的应用

定义 类是一种用户自定义的复合数据类型,即包括表达属性的成员变量,也包括表达行为的成员函数                                                                                                                                         类可用于表达那些不能直接与内置基