Rdd 持久性如何支持容错



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

假设我的集群中有 3 个节点,即 N1、N2、N3。我正在执行火花任务(转换映射)作为 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 会保留然后 Rdd1 在 N3 上的分区 丢失)。它可能适用于所有以前的 Rdds。当一个节点出现故障时,该节点上任何先前 Rdd 的数据跟踪也会丢失,那么它总是从头开始重新计算(加载文件)吗?

请说清楚,谢谢。 请不要投反对票****

我想

了解,spark的rdd持久性如何帮助容错。

Spark的缓存不会增强其容错能力。相反,Spark RDD,无论是缓存的还是未缓存的,都是容错的。

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

是的。Spark将根据需要追溯RDD的血统,以重新创建丢失的数据。以前缓存的前体RDD理论上可以用来重新创建分区。但是,数据不会在节点之间不必要地打乱,因此丢失的分区数据不会位于其他节点上。因此,重新计算RDD几乎肯定意味着从头开始重新计算并重新加载原始数据。

最新更新