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
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转换。
1条答案
按热度按时间bgibtngc1#
这些东西没有必要使spark读取两次输入。
列出所有可能的场景:
示例1:文件甚至不读取一次
在这种情况下,它不会做任何事情,因为在转换过程中没有任何动作。
例2:文件读取一次
只有一次文件会被y读取以使其Map
例3:文件读取两次
它现在只会读取输入文件两次,因为转换时会使用一个操作。
例4:文件读取一次
例5:文件读取两次
因为action现在用于两个不同的rdd,所以它将读取两次。
例6:文件读取一次
即使现在两个不同的操作也只使用一次,rdd将被执行并存储到内存中。现在,第二个操作发生在缓存的rdd上。
编辑:附加信息
所以问题就出现了,缓存什么,不缓存什么?
答:您将反复使用的rdd需要缓存。
例7:
所以在这种情况下,我们使用
x
一次又一次。所以建议x
。因为它不必阅读x
所以如果你在处理大量的数据,这会为你节省很多时间。假设您开始将所有rdd作为内存/磁盘中的缓存,并带有/不带有序列化。如果要执行任何任务,如果spark的内存较少,那么它将开始使用lru(最近使用的一次)策略删除旧的rdd。每当再次使用删除的rdd时,它将从源代码执行所有步骤,直到rdd转换。