Apache spark 广泛依赖的Spark容错

Apache spark 广泛依赖的Spark容错,apache-spark,distributed-computing,fault-tolerance,Apache Spark,Distributed Computing,Fault Tolerance,我很想知道Spark是如何实现容错的。在他们的文章中,他们描述了如何为“狭隘的依赖关系”做这件事,比如map,它是相当直接的。但是,我不知道如果一个节点在像排序操作这样的广泛依赖性之后崩溃,它们会做什么。我唯一能找到的是: 相反,在具有广泛依赖关系的沿袭图中,单个失败节点可能会导致RDD所有祖先的某些分区丢失,需要完全重新执行 这还不足以理解发生了什么 排序之后,如果不存储一些附加信息,就无法判断崩溃节点上存储的数据来自何处。因此,如果在排序之后发生崩溃,是重新执行整个沿袭,还是有某种机制减少计

我很想知道Spark是如何实现容错的。在他们的文章中,他们描述了如何为“狭隘的依赖关系”做这件事,比如map,它是相当直接的。但是,我不知道如果一个节点在像排序操作这样的广泛依赖性之后崩溃,它们会做什么。我唯一能找到的是:

相反,在具有广泛依赖关系的沿袭图中,单个失败节点可能会导致RDD所有祖先的某些分区丢失,需要完全重新执行

这还不足以理解发生了什么


排序之后,如果不存储一些附加信息,就无法判断崩溃节点上存储的数据来自何处。因此,如果在排序之后发生崩溃,是重新执行整个沿袭,还是有某种机制减少计算开销?那么其他广泛的依赖关系呢?

RDD依赖关系实际上是分区,以及如何从其他RDD的分区创建它们

一个广泛的依赖关系意味着创建一个分区所需的数据是从多个分区(从相同或不同的RDD)获得的。 每个分区都分配了一个执行器

现在假设,我们将连接两个分别有n个和m个分区的RDDR1和R2。此外,为了简单起见,让我们假设R1和R2都是由(nx m)不同的执行器计算的。 我们将通过加入R1和R2来创建第三个RDD R3

在计算R3时,假设包含x个执行器(n x m个执行器中的)的节点由于某种原因失败它不会影响其余的执行者及其在其他节点上的数据。

只有R3中那些应该从失败的x executor数据创建的分区受到影响。并且仅重新创建这些x分区

可提供更详细的视觉解释

更新:关于Spark缓存 下面的URL将帮助您了解Spark的整个持久性功能


回到我开始的示例:排序。如果通过排序R1创建的RDD R2的某个分区丢失,有没有办法避免对整个RDD R1进行排序以获得丢失的R2分区?或者从您链接的示例来看:如果G的一个分区丢失,那么这里重新计算的是什么?在groupBy和join过程中,如果没有存储一些额外的信息,我想一切都必须重新计算?你说得对!但是spark会跟踪每个分区和RDD的整个沿袭,因此不需要重新执行所有未触及的分区。不过,我对分类的情况表示怀疑。这就是Spark的缓存和持久性。为了避免在出现故障时不必要地重新计算RDD,Spark会缓存一些数据,这些数据在排序后可以用来恢复分区吗?你知道我在哪里可以找到这方面的信息吗?我已经用有用的资源更新了答案。让我知道那些裁判是否足够谢谢!如果使用一个“_2”存储级别持久化已排序的RDD,则Spark可以在排序后从故障中恢复。所以我猜这意味着如果用户不采取任何行动,Spark将不得不重新计算所有导致排序RDD的RDD。