Spark Transformation - 为什么它很懒,有什么优势?

Spark Transformation - Why is it lazy and what is the advantage?

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

延迟评估转换有什么优势?

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

延迟评估转换有什么缺点吗?

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

这样做的一个好处是,Spark 在有机会完整地查看 DAG 后可以做出许多优化决策。如果它一拿到它就执行所有事情,这是不可能的。

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

考虑一个 1 GB 的日志文件,其中包含错误、警告和信息消息,它以 64 或 128 MB 的块形式存在于 HDFS 中(在此上下文中无关紧要)。您首先创建一个名为 "input" 这个文本文件。然后,您通过在 "input" RDD 上应用过滤器来创建另一个名为 "errors" 的 RDD,以仅获取包含错误消息的行,然后在 "error" RDD 上调用 action first()。 Spark 将在这里优化日志文件的处理,只要它在任何分区中发现第一次出现错误消息就停止。如果在 Eager Evaluation 中重复相同的场景,即使您只对第一条错误消息感兴趣,Spark 也会过滤日志文件的所有分区。

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

Lazy evaluation means that if you tell Spark to operate on a set of data, it listens to what you ask it to do, writes down some shorthand for it so it doesn’t forget, and then does absolutely nothing. It will continue to do nothing, until you ask it for the final answer. [...]

It waits until you’re done giving it operators, and only when you ask it to give you the final answer does it evaluate, and it always looks to limit how much work it has to do.

它节省了时间和不必要的处理能力。

考虑当 Spark 不懒惰时..

例如:我们将 1GB 的文件从 HDFS 加载到内存中 我们正在进行

这样的转变

rdd1 = 从 HDFS 加载文件

rdd1.println(第 1 行)

在这种情况下,当第一行被执行时,条目将被添加到 DAG 中,并且 1GB 的文件将被加载到内存中。在第二行中,灾难是为了打印文件的第 1 行,整个 1GB 的文件都被加载到内存中。

考虑 Spark 何时懒惰

rdd1 = 从 HDFS 加载文件

rdd1.println(第 1 行)

在这种情况下,第 1 行执行的 anf 条目已进入 DAG,并构建了整个执行计划。 spark 做内部优化。而不是加载整个 1GB 文件,只加载和打印文件的第一行..

这有助于避免过多的计算并为优化腾出空间。