广泛依赖的 Spark 容错
Spark fault tolerance for wide dependencies
我有兴趣了解 Spark 如何实现容错。在他们的 paper 中,他们描述了他们如何为 "narrow dependencies" 做这件事,就像相当简单的地图。但是,我没有说明如果节点在像排序操作这样的广泛依赖性之后崩溃时他们会做什么。我唯一能找到的是:
In contrast, in a lineage graph with wide dependencies, a single failed node might cause the loss of some partition from all the ancestors of an RDD, requiring a complete re-execution.
这还不足以理解正在发生的事情。
排序后,如果不存储一些附加信息,就无法判断存储在崩溃节点上的数据来自何处。因此,如果在排序后发生崩溃,是重新执行整个沿袭还是有某种机制可以减少计算开销?那么其他广泛的依赖关系呢?
RDD 依赖实际上是指分区以及它们是如何从其他 RDD 的分区创建的。
wide dependency意味着创建分区所需的数据是从多个分区(来自相同或不同的RDD)中获取的。
每个分区分配一个执行器。
现在假设,我们正在加入两个分别具有 n 和 m 分区的 RDD R1 和 R2。另外,为了简单起见,我们假设 R1 和 R2 都是由 (n x m) 不同的执行者计算的。
我们将通过加入 R1 和 R2 来创建第三个 RDD R3。
在计算 R3 时,假设包含 x 个执行程序的节点(在 (n x m) 个执行程序中)由于某种原因失败。 不影响其他节点上剩余的执行器及其数据。
只有 R3 中本应根据失败的 x 执行程序数据创建的那些分区会受到影响。并且只重新创建 x 个分区.
更详细的视觉解释可用here
已更新:关于 Spark 缓存
下面的 URL 应该可以帮助您了解 Spark
的整个持久化特性
我有兴趣了解 Spark 如何实现容错。在他们的 paper 中,他们描述了他们如何为 "narrow dependencies" 做这件事,就像相当简单的地图。但是,我没有说明如果节点在像排序操作这样的广泛依赖性之后崩溃时他们会做什么。我唯一能找到的是:
In contrast, in a lineage graph with wide dependencies, a single failed node might cause the loss of some partition from all the ancestors of an RDD, requiring a complete re-execution.
这还不足以理解正在发生的事情。
排序后,如果不存储一些附加信息,就无法判断存储在崩溃节点上的数据来自何处。因此,如果在排序后发生崩溃,是重新执行整个沿袭还是有某种机制可以减少计算开销?那么其他广泛的依赖关系呢?
RDD 依赖实际上是指分区以及它们是如何从其他 RDD 的分区创建的。
wide dependency意味着创建分区所需的数据是从多个分区(来自相同或不同的RDD)中获取的。 每个分区分配一个执行器。
现在假设,我们正在加入两个分别具有 n 和 m 分区的 RDD R1 和 R2。另外,为了简单起见,我们假设 R1 和 R2 都是由 (n x m) 不同的执行者计算的。 我们将通过加入 R1 和 R2 来创建第三个 RDD R3。
在计算 R3 时,假设包含 x 个执行程序的节点(在 (n x m) 个执行程序中)由于某种原因失败。 不影响其他节点上剩余的执行器及其数据。
只有 R3 中本应根据失败的 x 执行程序数据创建的那些分区会受到影响。并且只重新创建 x 个分区.
更详细的视觉解释可用here
已更新:关于 Spark 缓存 下面的 URL 应该可以帮助您了解 Spark
的整个持久化特性