【问题标题】:Spark fault tolerance for wide dependencies广泛依赖的 Spark 容错
【发布时间】:2017-04-18 08:46:22
【问题描述】:

我有兴趣了解 Spark 如何实现容错。在他们的paper 中,他们描述了他们如何为“狭窄的依赖关系”做这件事,比如相当直截了当的 map。但是,我没有说明如果节点在广泛依赖(如排序操作)后崩溃时会做什么。我唯一能找到的是:

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

这还不足以理解正在发生的事情。

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

【问题讨论】:

    标签: apache-spark distributed-computing fault-tolerance


    【解决方案1】:

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

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

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

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

    只有 R3 中的那些分区应该是从那些失败的 x 执行器的数据创建的受到影响。并且只有那些 x 分区被重新创建

    更详细的视觉解释可here

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

    【讨论】:

    • 回到我开始的例子:排序。如果通过排序 R1 创建的 RDD R2 的一个分区丢失了,有没有办法避免对 整个 RDD R1 排序以获得 R2 丢失的分区?或者从您链接的示例中:如果 G 的一个分区丢失,这里重新计算究竟是什么?如果在 groupBy 和 join 期间不存储一些额外的信息,我猜 everything 必须重新计算?
    • 你是对的!但是 spark 确实会跟踪每个分区和 RDD 的整个沿袭,因此没有必要重新执行所有未触及的分区。我对排序的情况持怀疑态度。这就是 Spark 的缓存和持久性发挥作用的地方。避免在失败的情况下对 RDD 进行不必要的重新计算。
    • 那么Spark确实缓存了一些排序后可以用来恢复分区的数据?你知道我在哪里可以找到这方面的信息吗?
    • 我已经用有用的资源更新了答案。让我知道这些裁​​判是否足够
    • 谢谢!如果排序后的 RDD 使用“_2”存储级别之一进行持久化,Spark 可以在排序后从故障中恢复。所以我猜这意味着如果用户不采取任何行动,Spark 将不得不重新计算所有导致排序 RDD 的 RDD。
    猜你喜欢
    • 2018-02-27
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2016-11-09
    • 2013-04-30
    • 2016-08-22
    相关资源
    最近更新 更多