在 Spark 中何时持久化以及何时取消持久化 RDD

Posted

技术标签:

【中文标题】在 Spark 中何时持久化以及何时取消持久化 RDD【英文标题】:When to persist and when to unpersist RDD in Spark 【发布时间】:2015-11-22 20:40:28 【问题描述】:

假设我有以下几点:

 val dataset2 = dataset1.persist(StorageLevel.MEMORY_AND_DISK) 
 val dataset3 = dataset2.map(.....)

如果您对 dataset2 进行转换,那么您必须将其持久化并将其传递给 dataset3 并取消之前的持久化?

我试图弄清楚何时持久化和取消持久化 RDD。对于创建的每一个新 rdd,我都必须坚持它吗?

谢谢

【问题讨论】:

参考***.com/questions/28981359/…和***.com/questions/29903675/… 没有帮助....我需要专门为此提供答案。谢谢。 RDD 沿袭是一个链接的 RDD 对象的图,每个节点都知道它的依赖关系。缓存打破了血统,在此之后的 RDD “缓存”了它的内容,并且沿血统树的所有相关 RDD 都可以重用该缓存的数据。在您的情况下,根本没有任何影响(线性沿袭) - 所有节点只会被访问一次。所有惰性操作(在您的情况下为映射),包括持久化操作,将仅在实现步骤上进行评估。当您在循环中对您的 rdd 进行“树状”血统或运行操作时,您需要坚持 - 以避免 rdd 重新评估 没错。 map 不是一个动作(惰性求值),foreach 是一个动作并且会触发缓存在 foreach 之前运行。 ***.com/questions/32636822/… 也可以是相关的。一般来说,我建议不要担心持久性。只写代码。然后,如果您需要提高性能,您可以尝试缓存。它可能会提高或降低性能。您需要进行基准测试。 【参考方案1】:

Spark 自动监控每个节点上的缓存使用情况,并以最近最少使用 (LRU) 的方式丢弃旧数据分区。如果您想手动删除 RDD 而不是等待它从缓存中掉出,请使用 RDD.unpersist() 方法。

引用自:http://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-persistence

【讨论】:

以上是关于在 Spark 中何时持久化以及何时取消持久化 RDD的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Flutter 中持久化数据(等效于 onPause)

JPA - 持久化对象时何时使用 getTransaction()

如何检测数字的持久性何时达到一位

何时在 Java 消息传递和队列系统中使用持久性

RabbitMQ 如何决定何时删除消息?

spark何时以及如何在执行器上分配分区