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

相关推荐
幼稚园的山代王3 小时前
RabbitMQ 4.1.1初体验-队列和交换机
分布式·rabbitmq·ruby
小新学习屋3 小时前
Spark从入门到熟悉(篇三)
大数据·分布式·spark
rui锐rui3 小时前
大数据学习2:HIve
大数据·hive·学习
G皮T4 小时前
【Elasticsearch】检索高亮
大数据·elasticsearch·搜索引擎·全文检索·kibana·检索·高亮
沉着的码农7 小时前
【设计模式】基于责任链模式的参数校验
java·spring boot·分布式
zskj_zhyl8 小时前
智慧养老丨从依赖式养老到自主式养老:如何重构晚年生活新范式
大数据·人工智能·物联网
哲科软件9 小时前
从“电话催维修“到“手机看进度“——售后服务系统开发如何重构客户体验
大数据·智能手机·重构
zzywxc7879 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
专注API从业者9 小时前
构建淘宝评论监控系统:API 接口开发与实时数据采集教程
大数据·前端·数据库·oracle
一瓣橙子10 小时前
缺少关键的 MapReduce 框架文件
大数据·mapreduce