Spark是否可以自动检测不确定的结果并相应地调整故障恢复?

时间:2018-10-24 19:13:11

标签: apache-spark

如果不确定性代码在Spark上运行,则当需要从节点故障中恢复时,这可能会引起问题,因为新的输出可能与旧的输出不完全相同。我的解释是,在这种情况下,可能需要重新运行整个作业,因为否则输出数据可能与自身不一致(因为在不同时间产生了不同的数据)。至少,恢复节点下游的任何节点都可能需要从头开始重新启动,因为它们已经处理了可能现在更改的数据。无论如何,这就是我对情况的理解,如果我错了,请纠正我。

我的问题是Spark是否可以以某种方式自动检测代码是否不确定(例如,通过将旧输出与新输出进行比较)并相应地调整故障恢复。如果可能的话,它将使应用程序开发人员摆脱了编写非确定性代码的要求,这有时可能具有挑战性,并且在任何情况下都可以轻易忘记此要求。

2 个答案:

答案 0 :(得分:0)

不。如果发生故障,Spark将无法处理不确定的代码。 Spark,RDD的基本数据结构不仅不可变,而且不可变 还应该是其输入的确定性函数。这是必要的,否则在以下情况下,Spark框架将无法重新计算部分RDD(分区) 失败。如果重新计算的分区不是确定性的,则必须重新在沿袭的完整RDD上重新运行转换。我认为Spark不适合 非确定性代码框架。

如果在这种用例中必须使用Spark,则应用程序开发人员必须小心地编写代码,以保持输出的一致性。可以通过仅使用RDD(不使用datframe或数据集)并在每次执行不确定的代码的转换后保留输出来完成此操作。如果需要考虑性能,则可以将中间RDD保留在Alluxio上。

一种长期的方法是在Apache Spark Jira中打开功能请求。但是我对功能的接受不太满意。语法上的一些提示可知道是否确定代码是否是确定性的,并且框架可以切换为部分或全部恢复RDD。

答案 1 :(得分:0)

在故障恢复中未检测到非确定性结果并对其进行解释(至少在我使用的 spark 2.4.1 中)。

我在 spark 上遇到过几次这样的问题。例如,假设我使用窗口函数: first_value(field_1) over (partition by field_2 order by field_3)

如果 field_3 不是唯一的,则结果是不确定的,并且每次运行该函数时都可能不同。如果一个 spark 执行器在计算这个窗口函数时死掉并重新启动,你实际上可以为同一个 field_2 分区输出两个不同的 first_value 结果。