如果rdd被多次使用,是否需要缓存?

qncylg1j  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(516)

假设,我们有以下代码。

x = sc.textFile(...)
y = x.map(...)
z = x.map(...)

缓存是必要的吗 x 在这里?无法缓存 x 让spark读取输入文件两次?

bgibtngc

bgibtngc1#

这些东西没有必要使spark读取两次输入。
列出所有可能的场景:
示例1:文件甚至不读取一次

x = sc.textFile(...)    #creation of RDD
y = x.map(...)    #Transformation of RDD
z = x.map(...)    #Transformation of RDD

在这种情况下,它不会做任何事情,因为在转换过程中没有任何动作。
例2:文件读取一次

x = sc.textFile(...)    #creation of RDD
y = x.map(...)    #Transformation of RDD
z = x.map(...)    #Transformation of RDD
println(y.count())    #Action of RDD

只有一次文件会被y读取以使其Map
例3:文件读取两次

x = sc.textFile(...)    #creation of RDD
y = x.map(...)    #Transformation of RDD
z = x.map(...)    #Transformation of RDD
println(y.count())    #Action of RDD
println(z.count())    #Action of RDD

它现在只会读取输入文件两次,因为转换时会使用一个操作。
例4:文件读取一次

x = sc.textFile(...)    #creation of RDD
y = x.map(...)    #Transformation of RDD
z = y.map(...)    #Transformation of RDD
println(z.count())    #Action of RDD

例5:文件读取两次

x = sc.textFile(...)    #creation of RDD
y = x.map(...)    #Transformation of RDD
z = y.map(...)    #Transformation of RDD
println(y.count())    #Action of RDD
println(z.count())    #Action of RDD

因为action现在用于两个不同的rdd,所以它将读取两次。
例6:文件读取一次

x = sc.textFile(...)    #creation of RDD
y = x.map(...).cache()    #Transformation of RDD
z = y.map(...)    #Transformation of RDD
println(y.count())    #Action of RDD
println(z.count())    #Action of RDD

即使现在两个不同的操作也只使用一次,rdd将被执行并存储到内存中。现在,第二个操作发生在缓存的rdd上。
编辑:附加信息
所以问题就出现了,缓存什么,不缓存什么?
答:您将反复使用的rdd需要缓存。
例7:

x = sc.textFile(...)    #creation of RDD
y = x.map(...)    #Transformation of RDD
z = x.map(...)    #Transformation of RDD

所以在这种情况下,我们使用 x 一次又一次。所以建议 x 。因为它不必阅读 x 所以如果你在处理大量的数据,这会为你节省很多时间。
假设您开始将所有rdd作为内存/磁盘中的缓存,并带有/不带有序列化。如果要执行任何任务,如果spark的内存较少,那么它将开始使用lru(最近使用的一次)策略删除旧的rdd。每当再次使用删除的rdd时,它将从源代码执行所有步骤,直到rdd转换。

相关问题