Spark转换 - 为什么它是惰性的,有什么优势?

26

Spark Transformations是惰性评估的 - 当我们调用操作时,它会根据血统图执行所有转换。

什么是惰性评估的优点?

与急切评估相比,它是否会提高性能并减少内存消耗的数量?

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

5个回答

41

对于转换,Spark将其添加到计算DAG中,只有当驱动程序请求一些数据时,该DAG才会实际执行。

这种方法的一个优点是,Spark可以在完整查看DAG后做出许多优化决策。如果它在收到一切就立即执行所有操作,这是不可能的。

例如 - 如果您急切地执行每个转换,那意味着什么?嗯,这意味着您必须在内存中材料化许多中间数据集。这显然是不高效的 - 首先,它会增加GC成本。(因为您实际上并不关心那些中间结果。那些只是您编写程序时方便的抽象。) 所以,您需要告诉Spark您感兴趣的最终答案,并找出到达那里的最佳方式。


12
考虑一个大小为1 GB的日志文件,其中包含错误、警告和信息消息,并且以64或128 MB的块形式存在于HDFS中(在此上下文中无所谓)。首先,您需要创建一个名为“input”的RDD来表示这个文本文件。然后,您可以应用筛选器在“input” RDD上创建另一个名为“errors”的RDD,以获取只包含错误消息的行,并调用“error” RDD上的first()操作。Spark将通过尽早发现任何分区中第一个错误消息的出现而优化处理日志文件。如果在急切评估中重复相同的情况,Spark将过滤日志文件的所有分区,即使您只对第一个错误消息感兴趣。

9

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

惰性评估意味着如果您告诉Spark操作一组数据,它会听取您要求它执行的操作,为此写下一些简写以便不会忘记,然后什么都不做。它将继续什么都不做,直到您要求它给出最终答案为止。[...]

它会等待您完成所有操作符的输入,只有在您请求最终答案时才进行评估,并且它总是尽量减少其需要完成的工作量。

这可以节省时间和不必要的处理能力。


2

考虑Spark不是惰性的情况...

例如:我们从HDFS加载了1GB文件到内存中,然后进行转换。

rdd1 = load file from HDFS
rdd1.println(line1) 

在这种情况下,当执行第一行时,会将条目添加到DAG,并将1GB文件加载到内存中。在第二行中,灾难是为了打印文件的第一行,整个1GB文件都被加载到内存中。
考虑Spark的惰性。
rdd1 = load file from HDFS
rdd1.println(line1)

在这种情况下,第一行被执行并进入DAG,整个执行计划被构建。Spark进行内部优化。而不是加载整个1GB文件,只加载和打印文件的第一行。
这有助于避免过多的计算,并为优化铺平道路。

0

优点:

  • "Spark允许程序员使用有向无环图(DAG)模式开发复杂的多步数据管道" - [Khan15]
  • "由于Spark基于DAG,它可以从子节点到父节点沿着链条获取任何值,如遍历" - [Khan15]
  • "DAG支持容错" - [Khan15]

描述:
(根据“ Apache Spark 上的大数据分析”[SA16][Khan15]

  • "Spark只有在调用操作时才会计算RDD。" - [SA16]
  • 操作示例:
    reduce(func), collect(), count(), first(), take(n), ... [APACHE]

  • "Spark跟踪转换的血统图,用于按需计算每个RDD并恢复丢失的数据。" - [SA16]
  • 转换示例:
    map(func), filter(func), filterMap(func), groupByKey([numPartitions]), reduceByKey(func, [numPartitions]), ... [APACHE]

Programming Model


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接