大数据计算存储调度

什么是 Spark RDD ?

2021-08-29  本文已影响0人  光剑书架上的书

1. 什么是 RDD

RDD 是一个弹性的分布式的数据集,是 Spark 中最基础的抽象。它表示了一个可以并行操作的、不可变得、被分区了的元素集合。用户不需要关心底层复杂的抽象处理,直接使用方便的算子处理和计算就可以了。

RDD 示意图:

RDD 的五个主要特性

默认情况下,一个 HDFS 上的数据分片就是一个 partiton,RDD 分片数决定了并行计算的力度,可以在创建 RDD 时指定 RDD 分片个数,如果不指定分区数量,当 RDD 从集合创建时,则默认分区数量为该程序所分配到的资源的 CPU 核数 (每个 Core 可以承载 2~4 个 partition),如果是从 HDFS 文件创建,默认为文件的 Block 数。

有一点非常重要,就是由于 RDD 有前后依赖关系,遇到宽依赖关系,如 reduce By Key 等这些操作时划分成 Stage, Stage 内部的操作都是通过 Pipeline 进行的,在具体处理数据时它会通过 Blockmanager 来获取相关的数据,因为具体的 split 要从外界读数据,也要把具体的计算结果写入外界,所以用了一个管理器,具体的 split 都会映射成 BlockManager 的 Block,而体的 splt 会被函数处理,函数处理的具体形式是以任务的形式进行的。

初始化 RDD

并行集合的方式:

val data = Array(1, 2, 3, 4, 5)  
val distData = sc.parallelize(data)

引用外部存储系统的数据集 (text、HDFS、Hbase 等):

val distFile = sc.textFile("data.txt")

操作 RDD

闭包问题

最简单的理解就是在 RDD 的算子中使用了外部 (Driver 端) 定义的变量。

var counter = 0
var rdd = sc.parallelize(data)

// 不能这样使用,该出在 foreach 算子的函数内引用了 Driver 端定义的 counter 变量,即闭包操作。
rdd.foreach(x => counter += x)

println("Counter value: " + counter) // Counter value: 0

2. Stage 划分

宽依赖与窄依赖

RDD 每经过一次转换操作都会生成一个新的 RDD,它们之间存在着依赖关系,这种依赖关系被划分成了两种,即窄依赖宽依赖

image

宽窄依赖示意图

如何划分 Stage

当 RDD 触发了 action 算子之后,DAGScheduler 会开始分析最终 RDD 形成的依赖关系,逆向往前推导,前一个 RDD 被看做是父 RDD。每当遇到一个宽依赖的时候,便会以此为分界线,划分出一个 Stage。

stage 划分

3. RDD 的缓存

当一个 RDD 需要被重复使用时,或者当任务失败重新计算的时候,这时如果将 RDD 缓存起来,就可以避免重新计算,保证程序运行的性能。

cache 和 persist 的区别

其实 cache 底层实际调用的就是 persist 方法,只是缓存的级别默认是 MEMORY_ONLY,而 persist 方法可以指定其他的缓存级别。

cache 和 checkPoint 的区别

persist 和 checkPoint 的区别

persist 也可以选择将数据缓存到磁盘当中,但是它交给 blockManager 管理的,一旦程序运行结束,blockManager 也会被停止,这时候缓存的数据就会被释放掉。而 checkPoint 持久化的数据并不会被释放,是一直存在的,可以被其它的程序所使用。


What is RDD ?

RDD is the spark's core abstraction which is resilient distributed dataset.

It is the immutable distributed collection of objects.

RDD Creation

RDD vs Dataframe vs Dataset

上一篇 下一篇

猜你喜欢

热点阅读