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

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

文章目录

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

一、概念

  RDD就是Spark中的一种数据抽象,比如下面的代码(不用管他是干啥的)很多操作的返回值就直接是一个RDD类型。代码里面RDD就是一个抽象类
  你可以理解成函数,但是Spark里面它不叫函数,它同样封装的是对数据的操作,a操作的返回值类型是一个RDD,b又基于a的结果进行操作 返回值的类型又是一个RDD…你可以想象成套娃,就比如下图

横扫Spark之 - RDD(Resilient Distributed Dataset)弹性分布式数据集_第1张图片

横扫Spark之 - RDD(Resilient Distributed Dataset)弹性分布式数据集_第2张图片
  外层的RDD依赖于里面的RDD,这一系列就构成了对数据的处理流程。

二、理解

1. 弹性

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

2. 分布式

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

3. 数据集

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

三、5个主要特性

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

横扫Spark之 - RDD(Resilient Distributed Dataset)弹性分布式数据集_第3张图片

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

1. 一个分区列表

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

横扫Spark之 - RDD(Resilient Distributed Dataset)弹性分布式数据集_第4张图片

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

横扫Spark之 - RDD(Resilient Distributed Dataset)弹性分布式数据集_第5张图片

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值相同的数据分到同一个分区进行计算。

横扫Spark之 - RDD(Resilient Distributed Dataset)弹性分布式数据集_第6张图片
为什么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后数据被分到哪台节点上就在那台节点上进行计算。总的原则就是:移动数据,不如移动计算,除非资源不够用

你可能感兴趣的:(Spark,分布式,spark,大数据,RDD,RDD的5个主要特性)