欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Spark教程:RDD中的惰性求值和持久化

程序员文章站 2022-07-07 22:34:08
本节对前面所讲的 Transformation和Action操作进行一个补充。 一、惰性求值 RDD的Transformation操作都是惰性求值的。什么意思呢?也就是说Transform...

本节对前面所讲的 Transformation和Action操作进行一个补充。

一、惰性求值

RDD的Transformation操作都是惰性求值的。什么意思呢?也就是说Transformation操作不会开始真正的计算,只有在执行Action操作的时候Spark才会真正开始计算

比如,我们要筛选出某个文件包含“spark”的行,最后只输出第一个符合条件的行。

我们先读取文件生成Rdd1,然后使用filter()方法生成Rdd2,最后是行动操作first()。

试想,如果读取文件的时候就把所有的行都存储起来,但我们马上就要筛选出只具有“Spark”的行,等筛选出来具有“spark”的行,又要求只输出第一个。这样是不是太浪费存储空间了呢?所以实际上,Spark是在行动操作first()的时候开始真正的运算:只扫描第一个匹配的行,不需要读取整个文件。

二、持久化

(1)为什么需要持久化?

每当我们调用一个新的Action操作时,整个RDD都会从头开始运算。如果某个rdd会被反复重用,那么这将非常低效,我们应该对多次使用的RDD进行一个持久化操作。

(2)如果持久化?RDD.persist()方法让Spark把这个RDD缓存下来,可以存储在内存或者磁盘。

Spark教程:RDD中的惰性求值和持久化

本例多次使用rdd1进行Action操作,如果不使用持久化,每次Action整个RDD都会从头开始运算,使用持久化大大提高效率。

设置存储级别:

Spark教程:RDD中的惰性求值和持久化Spark教程:RDD中的惰性求值和持久化

(3)Spark持久化机制是自动容错的,如果某个存储RDD的Partition丢失了,Spark会通过其源RDD重新计算该Partition

(4)最后,unpersist()可以将持久化的RDD移除。