缓存RDD后立即执行'take'操作只会导致2%的缓存

时间:2015-07-20 04:51:10

标签: apache-spark rdd

我有一个RDD,它是通过读取大小约为117MB的本地文本文件而形成的。

scala> rdd
res87: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at textFile at <console>:24

我缓存RDD: -

scala> rdd.persist()
res84: rdd.type = MapPartitionsRDD[3] at textFile at <console>:24

在此之后,我在RDD上调用' take(1)'动作来强制进行评估。完成后,我会检查Spark UI的存储页面。它显示我的缓存分数仅为2%,内存大小为6.5MB。然后我在RDD上调用“计数”操作。在此之后,当我检查Spark UI Storage页面时,我突然发现这些数字现在已经改变了。缓存的分数为82%,内存大小为258.2MB。这是否意味着即使在缓存RDD之后,Spark也只会真正缓存后续操作所需的内容(因为 take(1)只读取一个顶部元素)?当第二个动作“计数”被触发时,它需要触摸所有元素,所以它最终也会缓存其余部分?我没有遇到过这样的记录行为,这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

根据源代码,你是对的。 RDD引用仅保存到持久RDD的HashMap,并在调用persist()时注册到特殊清除程序。因此,在实际读取数据期间执行缓存。更多内容可以被替换(例如,当没有足够的内存和对数据的活动引用时)。