Rdd持久性如何工作以支持容错

时间:2018-01-30 17:36:32

标签: apache-spark pyspark

我想了解,spark的rdd Persistence如何帮助容错。

让我们说,我的群集中有3个节点,即N1,N2,N3。我正在执行spark任务(转换 - 映射)为Rdd1-> Rdd2-> Rdd3。我坚持使用rdd2(在rdd3上算是第一次成功)。在持久性方面,我们假设它有6个分区,每个节点都有2个分区,并且在持久性上将它们放入RAM(内存中)。

现在第二次调用Rdd3.count()时,N3会变低,在这种情况下Spark如何计算Rdd3计数?

根据文档:“Spark的缓存是容错的 - 如果RDD的任何分区丢失,它将自动使用最初创建它的转换重新计算。”

现在当N3失败时,spark将尝试从Rdd2重新创建Rdd3,如Rdd3 = rdd2.map()。但根据我的理解,如果N3失败,那么N3上Rdd2的所有内存数据/分区也将丢失(N3中Rdd2的2个数据分区)。

即使spark尝试重新创建Rdd2(Rdd1.map),也必须从头开始重新计算(因为id为Rdd1会持续bben,然后是Nd上的Rdd1分区  迷路了)它可能适用于所有以前的Rdds。当节点发生故障时,该节点上任何先前Rdd的数据跟踪也将丢失,那么它是否始终从开始重新计算(加载文件)?

请说清楚,谢谢。 **** Donot Downvote please ****

1 个答案:

答案 0 :(得分:4)

  

我想了解,spark的rdd Persistence如何帮助容错。

Spark的缓存不会增强其容错能力。相反,缓存和未缓存的Spark RDD都具有容错能力。

  

当节点发生故障时,该节点上任何先前RDD的数据跟踪也将丢失,那么它始终是从开始重新计算(加载文件)吗?

是。 Spark将根据需要返回到RDD的谱系中,以重新创建丢失的数据。以前缓存的前体RDD理论上可用于重新创建分区。但是,数据不会在节点之间不必要地进行混洗,因此丢失的分区数据将不会出现在其他节点上。因此,重新计算RDD几乎肯定意味着从头开始重新计算。重新加载原始数据。