我们.cache()
在 RDD 上用于数据集的持久缓存,我关心的是这个缓存什么时候会过期?
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
我们.cache()
在 RDD 上用于数据集的持久缓存,我关心的是这个缓存什么时候会过期?
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
在 Spark 内存不足之前它不会过期,此时它将从缓存中删除最不常用的 RDD。当您请求未缓存的内容时,它将重新计算管道并将其再次放入缓存中。如果这太昂贵,请取消持久化其他 RDD,首先不要缓存它们或将它们持久化到您的文件系统上。
除了 Jan 的回答,我想指出,序列化的 RDD存储(/缓存)比大型数据集的普通 RDD 缓存效果好得多。
在大型数据集的情况下,它还有助于优化垃圾收集。
此外,从火花文档:
当您的对象仍然太大而无法有效存储尽管进行了调整时,减少内存使用的更简单的方法是以序列化形式存储它们,使用 RDD 持久性 API 中的序列化 StorageLevels,例如 MEMORY_ONLY_SER。然后 Spark 会将每个 RDD 分区存储为一个大字节数组。以序列化形式存储数据的唯一缺点是访问时间较慢,因为必须动态反序列化每个对象。如果您想以序列化形式缓存数据,我们强烈建议您使用 Kryo,因为它比 Java 序列化(当然也比原始 Java 对象)小得多。
如果不再使用 RDD,Spark 将自动取消持久化/清理 RDD 或 Dataframe。要检查 RDD 是否被缓存,请检查 Spark UI 并检查 Storage 选项卡并查看 Memory 详细信息。
从终端,您可以使用rdd.unpersist()
或sqlContext.uncacheTable("sparktable")
从内存中删除 RDD 或表。Spark 为惰性评估而设计,除非你说任何操作,否则它不会将任何数据加载或处理到 RDD 或 DataFrame 中。