当应用程序中有 100 次操作时,将中间数据存储在 Spark 中

Storing intermediate data in Spark when there are 100s of operations in an application

RDD 由于其血统而具有内在的容错性。但是,如果一个应用程序有 100 多个操作,那么通过所有这些操作进行重建将变得很困难。有没有办法存储中间数据? 我知道有 persist()/cache() 选项来保存 RDD。但是它们足以保存中间数据吗?检查点是否是一种选择?还有一种方法可以在检查点 RDD 时指定存储级别吗?(如 MEMORY 或 DISK 等,)

虽然 cache()persist() 是通用的 checkpoint 是特定于流媒体。

缓存 - 缓存可能发生在内存或磁盘上

rdd.cache()

persist - 您可以选择将数据保存在内存或磁盘中的位置

rdd.persist(storage level)

checkpoint - 你需要指定一个你需要保存数据的目录(在像HDFS/S3这样的可靠存储中)

val ssc = new StreamingContext(...)   // new context

ssc.checkpoint(checkpointDirectory)   // set checkpoint directory

cache/persistcheckpoint之间有显着差异。

Cache/persist 实现 RDD 并将其保存在内存和/或磁盘中。但是RDD的lineage(即生成RDD的seq of operations)会被记住,这样如果出现节点故障,部分缓存的RDD丢失,可以重新生成。

然而,checkpoint 将 RDD 保存到 HDFS 文件中,实际上 FORGETS 完全沿袭。这允许截断长谱系并将数据可靠地保存在 HDFS 中(通过复制自然容错)。

http://apache-spark-user-list.1001560.n3.nabble.com/checkpoint-and-not-running-out-of-disk-space-td1525.html

(Why) do we need to call cache or persist on a RDD