【大数据学习 | Spark-Core】RDD的五大特性(包含宽窄依赖)

embedded/2024/11/28 10:33:10/

分析一下rdd的特性和执行流程

  • A list of partitions 存在一系列的分区列表
  • A function for computing each split 每个rdd上面都存在compute方法进行计算
  • A list of dependencies on other RDDs 每个rdd上面都存在一系列的依赖关系
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) 在k-v类型的rdd上面存在可选的分区器
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) 优先位置进行计算

1. rdd的第一大特性:存在一系列的分区列表

每个rdd都存在一系列的分区列表,rdd弹性分布式数据集,必须是存在分区的,因为存在分区才会让集群多个线程进行执行,并行操作速度和效率更快。

分区可以进行调节,shuffle类算子可以修改分区,coalesce算子和repartition算子,修改分区在一定程度上可以增加计算效率,一个阶段中的一个rdd的分区代表的是一个task任务,并且在读取hdfs文件的时候,一个block块对应的是一个分区,让数据的计算本地化执行

2. rdd的第二大特性:每个rdd上面都存在compute方法进行计算

rdd是调用算子进行计算的,一个元素一个元素的进行计算,compute帮助进行递归rdd的数据使用用户定义的逻辑进行计算。

我们compute方法是如何遍历RDD中的元素的。

如果是缓存了,那么从缓存中读取数据 getOrCompute

如果设置了缓存,并且已经有人计算完毕放入到缓存中了,那么直接从缓存中取值,如果缓存中没有值,我们需要计算并且存储到缓存中。

读取数据,如果命中就直接返回,如果没有命中就计算。

获取缓存数据

没有获取到数据需要进行计算,放入到缓存中,在从缓存中读取数据

doPutIterator 存储数据到缓存中,判断存储级别,分别放入数据到缓存或者磁盘中并且对数据进行备份和副本。

然后当放入完毕以后再次从缓存中读取数据。

3. rdd的第三大特性:每个rdd上面都存在一系列的依赖关系

rdd之间存在一系列的依赖关系。

所说的依赖关系就是rdd之间的关系,依赖关系就是算子的关系,转换类算子的关系,比如调用的算子不同关系也不相同。

map flatMap mapPartitions filter 一对一的关系,窄依赖

groupBy sortBy groupByKey sortByKey reduceBykey 他们都是带有shuffle的算子,都会产生宽依赖

shuffle就是宽依赖,非shuffle的算子就是窄依赖。

shuffleDependency:宽依赖

narrowDependency:窄依赖

窄依赖分为三种:

oneToOne 一个对一个的关系 map FlatMap filter...
rangeDependency: union范围依赖
pruneDependency: filterByRange 子类关系,父节点的部分数据被子节点继承了,排序完毕的结果被子节点继承一部分

宽依赖的关系

窄依赖的关系

map算子中的依赖关系

union算子

filterByRange

4. rdd的第四大特性:在kv类型的rdd上面存在可选的分区器。

首先rdd上面是不存在分区器的,只有调用了shuffle类算子才会有分区器默认的分区器HashPartition[分组],rangePartitioner[排序]。

同样我们可以人为自定义分区器,但是不管是人为的还是系统自带的都需要在Key进行处理,需要实现两个方法:一个是分区的数量,numPartitions,一个是getPartition,怎么计算得到分区id。

不是kv类型的rdd肯定没有分区器,kv类型的rdd上面不一定存在分区器,分区器可以规定数据的流向,上游的数据到下游的相应的分区中是可以定义规则的

5. rdd的第五大特性:优先位置进行计算

一般数据的切片大小和block块的大小是一一对应的,可以实现本地化执行操作,避免了远程io。

读取hdfs的文件切片计算逻辑中就可以找到。

每次形成切片的时候都带有block的域名信息,处理和计算的时候就可以直接找到地址,按照本地化进行执行。


http://www.ppmy.cn/embedded/141160.html

相关文章

Rk3588 onnx转rknn,出现 No module named ‘rknn‘

一、操作步骤: rk3588 需要将yolo11 的模型onnx转rknn。 https://github.com/airockchip/rknn_model_zoo/tree/main/examples/yolo11 这个是用yolo11训练的模型,有80种类型。 完整下载下来后,在按文档描述下载模型下来: 然后进…

基于spring boot开发的理财管理系统设计

文章目录 项目介绍环境要求技术栈使用说明运行指导运行截图代码 项目介绍 该毕业设计使用了当前较为流行的spring boot,spring,spring mvc,mybatis,shiro框架分页处理使用了pagehelper进行操作,前台使用了模板语言thy…

vue3+antd注册全局v-loading指令

文章目录 1. 创建指令文件2. 全局注册3. 使用 1. 创建指令文件 src/directives 在directives中创建如下文件 src│─directives│ index.ts└─loadingindex.tsindex.vuedirectives/ index.ts export * from ./loadingdirectives/loading/index.ts import { createApp } f…

Scala的字符串

package hfd.test32import java.io.PrintWriter import scala.io.Sourceobject Test {def main(args: Array[String]): Unit {//从文件1.txt中,读入内容val content Source.fromFile("1.txt").mkStringprintln(content)//把字符串中的每个单词&#xff…

数据结构——排序算法第二幕(交换排序:冒泡排序、快速排序(三种版本) 归并排序:归并排序(分治))超详细!!!!

文章目录 前言一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本 快排1.2.2 挖坑法 快排1.2.3 lomuto前后指针 快排 二、归并排序总结 前言 继上篇学习了排序的前面两个部分:直接插入排序和选择排序 今天我们来学习排序中常用的交换排序以及非常稳定的归并排序 快排可是有多…

【LC】3101. 交替子数组计数

题目描述: 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况,我们称这样的子数组为 交替子数组 。返回数组 nums 中交替子数组的数量。 示例 1: 输入: nums [0,1,1,1] 输出: 5 …

Android - 权限管理漏洞

所属分类:Android - 权限管理漏洞缺陷详解:应用未正确实施最小权限原则或滥用已声明的权限可能导致敏感信息泄露。例如,恶意代码利用已授予的权限绕过用户授权,访问通讯录、位置、短信等敏感资源。部分开发者还可能滥用权限以执行…

挑战 Cursor,Codeium 推出下一代 AI IDE Windsurf

适应技术不是人类社会的长项 面向我们展开的 是越发不可知 而被忽略的险境 自从 AI 的出现,在 IDE 的领域,不断的有新的带有 AI 性质的 IDE 出现,这不 Codeium 公司在前几天又推出了一款新的 AI IDE windsurf。 用过 vscode 的同学或多或少…