横扫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后数据被分到哪台节点上就在那台节点上进行计算。总的原则就是:移动数据,不如移动计算,除非资源不够用

相关推荐
圆蛤镇程序猿9 分钟前
【什么是RabbitMQ】
分布式·rabbitmq
张彦峰ZYF28 分钟前
接口性能优化宝典:解决性能瓶颈的策略与实践
java·redis·分布式·后端·算法·性能优化·架构
运维&陈同学2 小时前
【zookeeper02】消息队列与微服务之zookeeper单机部署
linux·服务器·分布式·微服务·zookeeper·云原生·消息队列·云计算
Mephisto.java2 小时前
【大数据学习 | Spark-Core】广播变量和累加器
大数据·学习·spark
Mephisto.java2 小时前
【大数据学习 | Spark-Core】详解分区个数
大数据·sql·oracle·spark·json·database
zmd-zk2 小时前
flink学习(6)——自定义source和kafka
大数据·hadoop·学习·flink·kafka·实时
java1234_小锋2 小时前
详细描述一下Elasticsearch搜索的过程?
大数据·elasticsearch·jenkins
NewsMash3 小时前
平安养老险20年:专业书写“养老金融”答卷
大数据·人工智能
samLi06204 小时前
【工具变量】中国省市社会信用体系建设名单匹配数据(省级及地级市城市)2010-2024年
大数据
魅美5 小时前
大数据技术之SparkCore
大数据·spark