【发布时间】:2015-11-22 20:40:28
【问题描述】:
假设我有以下几点:
val dataset2 = dataset1.persist(StorageLevel.MEMORY_AND_DISK)
val dataset3 = dataset2.map(.....)
如果您对 dataset2 进行转换,那么您必须将其持久化并将其传递给 dataset3 并取消之前的持久化?
我试图弄清楚何时持久化和取消持久化 RDD。对于创建的每一个新 rdd,我都必须坚持它吗?
谢谢
【问题讨论】:
-
没有帮助....我需要专门为此提供答案。谢谢。
-
RDD 沿袭是一个链接的 RDD 对象的图,每个节点都知道它的依赖关系。缓存打破了血统,在此之后的 RDD “缓存”了它的内容,并且沿血统树的所有相关 RDD 都可以重用该缓存的数据。在您的情况下,根本没有任何影响(线性沿袭) - 所有节点只会被访问一次。所有惰性操作(在您的情况下为映射),包括持久化操作,将仅在实现步骤上进行评估。当您在循环中对您的 rdd 进行“树状”血统或运行操作时,您需要坚持 - 以避免 rdd 重新评估
-
没错。 map 不是一个动作(惰性求值),foreach 是一个动作并且会触发缓存在 foreach 之前运行。
-
stackoverflow.com/questions/32636822/… 也可以是相关的。一般来说,我建议不要担心持久性。只写代码。然后,如果您需要提高性能,您可以尝试缓存。它可能会提高或降低性能。您需要进行基准测试。
标签: scala hadoop apache-spark rdd