我想了解spark的rdd持久性是如何帮助容错的。
假设我的集群中有3个节点,即N1、N2、N3。我以Rdd1->Rdd2->Rdd3的形式执行spark任务(转换映射)。我已经持久化了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,那么rdd1在N3上的分区就会丢失)。它可能适用于所有以前的Rdds。当一个节点关闭时,该节点上任何以前的Rdd的数据跟踪也将丢失,那么它总是从头开始重新计算(加载文件)吗?
请给我一些启发,谢谢。*请不要投反对票*
发布于 2018-01-31 01:53:33
我想知道spark的
持久性是如何帮助容错的。
Spark的缓存不会增强其容错性。相反,Spark RDDs,无论是缓存的还是未缓存的,都是容错的。
当一个节点关闭时,该节点上以前的任何RDD的数据跟踪也将丢失,因此它总是从头开始重新计算(加载文件)吗?
是。Spark将根据需要追溯到RDD的谱系中,以重新创建丢失的数据。理论上,先前缓存的前身RDDs可用于重新创建分区。但是,数据不会在节点之间进行不必要的混洗,因此丢失的分区数据不会在其他节点上。因此,重新计算RDD几乎肯定意味着从头开始重新计算&重新加载原始数据。
https://stackoverflow.com/questions/48527357
复制相似问题