Spark教程:RDD中的惰性求值和持久化
程序员文章站
2022-03-14 08:44:12
本节对前面所讲的 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缓存下来,可以存储在内存或者磁盘。
本例多次使用rdd1进行Action操作,如果不使用持久化,每次Action整个RDD都会从头开始运算,使用持久化大大提高效率。
设置存储级别:
(3)Spark持久化机制是自动容错的,如果某个存储RDD的Partition丢失了,Spark会通过其源RDD重新计算该Partition
(4)最后,unpersist()可以将持久化的RDD移除。