Spark中的RDD你了解多少?带你快速了解RDD的知识

255 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

image.png

对于大数据中的Spark计算引擎,相信大家都了解Spark的两种部署方式,倘若不了解也没关系,后续我会专门写篇关于Spark不同部署方式的文章。本文章主要讲解下Spark中比较重要而且面试经常会问的知识---RDD。那么什么是RDD?它又是做什么用的呢?别着急,往下看。

RDD概述

1. 什么是RDD

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象。体现在 代码中就是一个抽象类,代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。

那么在这个概念中,我们要知道以下几点:

  1. RDD只是把计算的逻辑疏通好,只有调用Action行动算子的时候数据才会被读入内存开始分析计算;
  2. RDD一旦创建,这个对象就是不可变的了,RDD中的所有属性都无法更改;
  3. RDD中不存储数据,只是确定一个计算的流程,类似于在工厂中生产商品之前需要先确定好制作工序;

2. WordCount工作流程(对RDD更深的理解 )

对于RDD的特性,我们可以通过一个实际案例来进行理解记忆,在这里我们使用Spark中最为经典的WordCount案例。

WordCount中的关于计算的核心代码:
sc.textFile("input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

工作流程如下图所示:

image.png

这个就是Spark运行模式中的 yarn-cluster模式,一般适用于生产环境中,而yarn-client模式适用于交互、调试,这个我们后续文章具体说明。

1)运行流程文字描述如下:

命令提交--> 启动本地脚本 --> 命令提交给yarn中的RM(资源分配和调度) --> RM提交给NM(管理节点资源、处理RM命令) --> NM中启动ApplicationMaster(AM:为应用程序分配资源)--> AM中会启动Driver,然后Driver会命令其他的NM启动Executor来运行此任务

2)RDD跨分区存在

因为RDD是可以分区的,所以RDD中不同的分区就在不同的Container中,换句话理解就是,同一个RDD因为内部有多个不同分区,而分区在不同节点上,所以RDD是可以跨节点存在的,如上图所示。

3)算子

在这个过程中,程序经过了 FlatMAp、Map、reduceByKey 三个Transformation转换算子以及 collect 行动算子,这里面还涉及到宽窄依赖问题,那么关于算子以及宽窄依赖的相关知识我们后续文章讲解,这也是Spark中比较重要的知识。

我们现在要知道的是,所有和RDD算子相关的操作都是在Executor端执行的,所有的RDD算子之外的操作都是在Driver端执行,比如 任务切分、结果打印。

而且在Spark中,只有遇到action等行动算子,才会执行RDD的计算(即延迟计算)。

3. RDD的特性(根据程序理解)

1)弹性

  • 存储的弹性:内存与磁盘的自动转换;
  • 容错的弹性:数据丢失可以自动恢复;
  • 计算的弹性:计算出错重试机制;
  • 分片的弹性:可根据需要重新分片;

其中容错和计算的弹性和RDD的父子关系有关,也就是我们说的上下级关系,在每个RDD中都会记录有相应的父子关系,倘若子类中的数据丢失,可以去找父类、爷爷类,依次往上寻找。

2) 分布式

数据存储在大数据集群中的不同节点,也就是 RDD 可以跨节点存在。

3) 数据集,不存储数据

RDD只是封装了计算逻辑,并不会保存数据。

**4) 数据抽象 **

RDD是一个抽象类,需要子类具体实现。

5) 不可变

RDD封装了计算逻辑,是不可以改变的,想要改变,只能产生新的RDD,在新的RDD里面封装计算逻辑。

6) 可分区、并行计算

总结

RDD是一个比较重要的Spark知识点,但不怎么好理解,所以读者多看下上面的WordCount工作流程图,动手写一下代码,理解的可能会更快一些。