横扫Spark之 - RDD(Resilient Distributed Dataset)弹性分布式数据集

水善利万物而不争,处众人之所恶,故几于道💦

文章目录

      • 一、概念
      • 二、理解
        • [1. 弹性](#1. 弹性)
        • [2. 分布式](#2. 分布式)
        • [3. 数据集](#3. 数据集)
      • 三、5个主要特性
        • [1. 一个分区列表](#1. 一个分区列表)
        • [2. 作用在每个分区上的计算函数](#2. 作用在每个分区上的计算函数)
        • [3. 一个和其他RDD的依赖列表](#3. 一个和其他RDD的依赖列表)
        • [4. 一个分区器(可选)](#4. 一个分区器(可选))
        • [5. 计算的最佳位置(可选)](#5. 计算的最佳位置(可选))

一、概念

RDD就是Spark中的一种数据抽象 ,比如下面的代码(不用管他是干啥的)很多操作的返回值就直接是一个RDD类型。代码里面RDD就是一个抽象类

你可以理解成函数,但是Spark里面它不叫函数,它同样封装的是对数据的操作,a操作的返回值类型是一个RDD,b又基于a的结果进行操作 返回值的类型又是一个RDD...你可以想象成套娃,就比如下图

外层的RDD依赖于里面的RDD,这一系列就构成了对数据的处理流程。

二、理解

1. 弹性

存储的弹性 :RDD不存储数据,它将数据读到一个Iterator迭代器里面,处理完后将内存释放,如果数据量太大,这个迭代器放不下,就会将放不下的数据存储到磁盘里面。内存和磁盘的自动切换,这就是存储的弹性
容错的弹性 :计算过程中,如果挂了数据丢失了,可以进行自动恢复,恢复的前提是要知道依赖关系,找父RDD要,一直找到源头,重新计算一遍就可以恢复了
计算的弹性 :计算过程中,如果有shuffle,下一个阶段会从上一个阶段拉数据,如果拉取过程中因为某些问题(比如正在进行Full GC)拉不到数据它暂时不会报错,而是会等一会儿再尝试去拉,尝试三次后还拉不到的话才会报错
分片的弹性:是指RDD的分区不是固定不变的,而是根据文件的切片动态生成的,切几个片就有几个分区

2. 分布式

因为数据是以块的形式存储在集群的不同节点上的,所以如果RDD的分区要读某一块数据就可以将RDD的分区放到这个数据块所在的节点,这样本地就能拉到数据进行计算,从而提高速度。移动数据不如移动计算,除非资源不够用

3. 数据集

RDD只是封装了计算的逻辑,并不保存数据。每个RDD分区的底层只是一个Iterator迭代器,它在迭代的时候处理数据,迭代完成后也就是处理完了,这个迭代器也就释放了,就不能用了,所以它不存储数据只是一段计算的逻辑

三、5个主要特性

点进RDD,可以看到他是一个抽象类

每个RDD都有5个主要的特性

1. 一个分区列表

A list of partitions

因为Spark处理数据的时候也要对数据切片,假如一个文件在HDFS上有三块,那么处理的时候就切三片,这个RDD要对这三片做相同的处理,所以就把这个RDD分为三个区,分别对这三片数据进行处理。

2. 作用在每个分区上的计算函数

A function for computing each split

这个特性的意思就是每个分区对数据的操作,比如rdd1在每个分区上的计算函数就是textFile()、rdd2在每个分区上的计算函数就是map

3. 一个和其他RDD的依赖列表

A list of dependencies on other RDDs

也就是这个RDD依赖于哪个RDD,依赖不只是依赖一个也有可能依赖多个。比如下图:rdd4依赖于rdd1和rdd2。rdd5依赖rdd3

4. 一个分区器(可选)

Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned

对于这种key-value结构的RDD有分区器,因为他要进行不同节点间数据的传输,默认的分区器是hash-partitioned,将key的hash值相同的数据分到同一个分区进行计算。

为什么groupBy()操作的数据不是key-value结构的数据也有分区器呢?是因为groupBy的源码中把数据已经转成了key-value的结构然后调用groupByKey()进行的分组。

5. 计算的最佳位置(可选)

Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

就是这个计算要在哪个节点上计算,一般是将计算放在块所在的位置(这样就不用 走网络IO了),如果是需要shuffle的话,就在shuffle后数据被分到哪台节点上就在那台节点上进行计算。总的原则就是:移动数据,不如移动计算,除非资源不够用

相关推荐
IT成长日记9 分钟前
Elasticsearch集群手动分片分配指南:原理与实践
大数据·elasticsearch·手动分片分配
zdkdchao7 小时前
hbase资源和数据权限控制
大数据·数据库·hbase
归去_来兮7 小时前
知识图谱技术概述
大数据·人工智能·知识图谱
计算机毕设定制辅导-无忧学长7 小时前
Kafka 核心架构与消息模型深度解析(一)
分布式·架构·kafka
一弓虽8 小时前
zookeeper 学习
分布式·学习·zookeeper
yt948328 小时前
如何在IDE中通过Spark操作Hive
ide·hive·spark
青春之我_XP9 小时前
【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数
大数据·数据仓库·sql·dataworks·maxcompute·data studio
predisw9 小时前
kafka consumer group rebalance
分布式·kafka
明达技术9 小时前
ProfiNet 分布式 IO 在某污水处理厂的应用
分布式
云道轩9 小时前
llm-d:面向Kubernetes的高性能分布式LLM推理框架
分布式·容器·kubernetes