首页 > 解决方案 > 火花非确定性和重新计算安全

问题描述

有人声称,由于重新计算和容错,Spark RDD 必须是其输入的确定性函数,但也有认可的非确定性 RDD,例如在SparkSQLSparkML中。是否有关于如何安全使用非确定性的正式指导?

考虑这个带有菱形 DAG 的 Spark 作业。

val bar = (rdd map f) zip (rdd map g)
bar.saveAsTextFile("outfile")

如果rdd是不确定的(例如,随机或时间戳),是否会outfile包含一致的数据?是否有可能重新计算 zip 的一个组件而另一个组件不会?如果我们检查点或坚持,是否能保证安全rdd本地检查站就足够了吗?

标签: apache-spark

解决方案


一般的

以下是我在实践层面的一些看法和经验:

  • 如果您从 Hive 中的表/文件中读取,那么 Spark 将列出所有使用的文件以及哪个节点证明了该列表的一部分,因此如果它一直回到开始,重新计算将是一致的,即读取从 HDFS / Hive 获取该数据子集。

  • 如果你使用随机函数,那么我 .cache 或 .persist 以避免使用不同的路径逻辑重新计算。当然,结合上述情况,如果在读取并必须从源中获取数据后使用随机函数,您会得到不同的结果。见下文。

  • 如果在处理的同时允许更新 JDBC 源并且 DAG 从它们重新计算,则从 JDBC 源读取将无法保证一致性/确定性结果。

检查点的效果

万一由于某种原因失败,从 DAG 一直返回源的计算成本很高。在给定阶段采取的检查点将数据存储到磁盘 - 本地或 HDFS,如果随后出现故障,则从该点开始重新计算,从而节省时间。DAG 血统已损坏。

最后的笔记

如果重新计算从 JDBC 源或在 Stage 中处理时使用的随机函数开始可能会影响随后已处理的分区,该怎么办?我无法轻易证明这一点,但我认为那些不适合“当前节点”重新处理的结果将被丢弃。否则这是不切实际的,这是我的看法。

关于作者自己的回答,火花检查点和持久化到磁盘有什么区别,应注意以下几点:“......几乎没有重要的区别,但基本的区别是血统发生了什么。持久化/缓存保持血统完好无损而检查点打破血统......”。其他答案中的陈述不正确。


推荐阅读