2017-04-18 61 views
2

我很想了解Spark如何实现容错。在他们的paper中,他们描述了他们如何为像地图这样相当简单的“狭义依赖性”做到这一点。但是,如果一个节点在像排序操作这样的广泛依赖之后崩溃,他们不会说明他们做了什么。我能找到的唯一的事情是这样的:广泛依赖关系的Spark容错

相比之下,具有广泛的依赖关系的谱系图,一个失败的节点可能会导致某些分区的损失从RDD的所有祖先,需要一个完整的重执行。

这对于理解发生的事情并不足够。

排序后,没有办法知道存储在崩溃节点上的数据来自何处,而无需存储一些附加信息。因此,如果在排序后发生崩溃,整个血统是否会重新执行,或者是否存在一些减少计算开销的机制?那么其他广泛的依赖关系呢?

回答

1

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

A 宽依赖性表示创建分区所需的数据是从多个分区(来自相同或不同的RDD)获得的。 每个分区分配一个执行器。

现在假设,我们将两个RDDS R1和R2分别具有Ñ分区。同样,为了简单起见,我们假设R1和R2都是由不同的执行者计算出来的。 我们将通过加入R1和R2来创建第三个RDD R3。

当正在计算R3,假设含有X执行人一个节点(在(n×m个)执行人)由于某种原因失败。 它不影响其他节点上的剩余执行程序及其数据。只有

这被认为是从那些创造了R3 这些分区失败X执行程序的数据都受到影响。只有那些x分区被重新创建

更详细的可视化解释可以here

更新:关于星火缓存 下面的网址应该帮助你理解星火

+0

回到我开始的例子:排序。如果通过排序R1创建的RDD R2的分区丢失,是否有任何方法可以避免对整个** RDD R1进行排序以获取R2的缺失分区? 或者您链接的例子:如果一个G的分区丢失了,那么究竟是什么**在这里重新计算?没有在groupBy和join中存储一些额外的信息,我想**所有**都必须重新计算? – Dezi

+0

你是对的!但是spark会跟踪每个分区和RDD的整个谱系,因此不必重新执行所有未触及的分区。虽然排序的情况下,我怀疑。这就是Spark的缓存和持久性的地方。在发生故障时避免不必要的RDD重新计算。 – code

+0

因此,Spark在分类后会缓存一些可用于恢复分区的数据吗?你知道我在哪里可以找到有关这方面的信息吗? – Dezi