Spark Transformation - 为啥它是懒惰的,有啥优势?

Posted

技术标签:

【中文标题】Spark Transformation - 为啥它是懒惰的,有啥优势?【英文标题】:Spark Transformation - Why is it lazy and what is the advantage?Spark Transformation - 为什么它是懒惰的,有什么优势? 【发布时间】:2016-10-27 22:16:21 【问题描述】:

Spark Transformations 被延迟评估 - 当我们调用该操作时,它会根据沿袭图执行所有转换。

懒惰地评估转换有什么好处?

与热切评估相比,它会改善performance 并减少memory consumption 的数量吗?

懒惰地评估转换有什么缺点吗?

【问题讨论】:

【参考方案1】:

对于转换,Spark 将它们添加到计算的 DAG 中,并且只有当驱动程序请求一些数据时,该 DAG 才会真正执行。

这样做的一个好处是,Spark 可以在有机会全面查看 DAG 后做出许多优化决策。如果它一得到它就执行一切,这是不可能的。

例如——如果你急切地执行每一个转换,那意味着什么?嗯,这意味着你必须在内存中实现那么多中间数据集。这显然效率不高——一方面,它会增加你的 GC 成本。 (因为你真的对这些中间结果不感兴趣。这些只是你在编写程序时方便的抽象。)所以,你要做的是——你告诉 Spark 你感兴趣的最终答案是什么,并且它找出了到达那里的最佳方式。

【讨论】:

【参考方案2】:

考虑一个 1 GB 的日志文件,其中包含错误、警告和信息消息,并且它在 HDFS 中以 64 或 128 MB 的块形式存在(在这种情况下无关紧要)。首先创建一个名为“输入”的 RDD这个文本文件的。然后,通过在“输入”RDD 上应用过滤器来创建另一个名为“错误”的 RDD,以仅获取包含错误消息的行,然后在“错误”RDD 上调用操作 first()。 Spark 将在此处优化日志文件的处理,方法是在任何分区中发现第一次出现错误消息时立即停止。如果在急切评估中重复相同的场景,即使您只对第一条错误消息感兴趣,Spark 也会过滤日志文件的所有分区。

【讨论】:

【参考方案3】:

来自https://www.mapr.com/blog/5-minute-guide-understanding-significance-apache-spark

惰性求值意味着,如果你告诉 Spark 对一组数据进行操作,它会听你要求它做什么,为它写一些简写,这样它就不会忘记,然后什么也不做。它会继续什么都不做,直到你问它最后的答案。 [...]

它会一直等到你给它操作符,只有当你要求它给你最终答案时它才会评估,它总是看起来限制它必须做的工作量。

它可以节省时间和不需要的处理能力。

【讨论】:

以上是关于Spark Transformation - 为啥它是懒惰的,有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章

Spark学习之路 Spark Transformation和Action[转]

Spark的transformation 和 action的操作学习笔记

Spark常用的Transformation算子的简单例子

spark记录spark算子之Transformation

Spark RDD Transformation 简单用例

Spark RDD Transformation 简单用例