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

相关推荐
蘑菇蘑菇不会开花~6 分钟前
分布式Redis(14)哈希槽
redis·分布式·哈希算法
问道飞鱼1 小时前
分布式中间件-Pika一个高效的分布式缓存组件
分布式·缓存·中间件
小宋10213 小时前
玩转RabbitMQ声明队列交换机、消息转换器
服务器·分布式·rabbitmq
懒洋洋的华3698 小时前
消息队列-Kafka(概念篇)
分布式·中间件·kafka
March€9 小时前
分布式事务的基本实现
分布式
DieSnowK10 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
Lill_bin11 小时前
深入理解ElasticSearch集群:架构、高可用性与数据一致性
大数据·分布式·elasticsearch·搜索引擎·zookeeper·架构·全文检索
涛思数据(TDengine)11 小时前
TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准
大数据·时序数据库·tdengine
isNotNullX12 小时前
如何用SQL Server和Oracle进行数据同步?
大数据·数据库·sql·oracle
RwTo13 小时前
Elasticsearch 聚合搜索
大数据·elasticsearch·搜索引擎·全文检索