如果一个分区丢失了,我们可以使用lineage来重建它。会再次加载基础RDD吗?
If the one partition is lost, we can use lineage to reconstruct it. Will the base RDD be loaded again?
我读了论文"Resilient Distributed Datasets A Fault-Tolerant Abstraction for In-Memory Cluster Computing"。作者说如果一个partition丢失了,我们可以用lineage来重建。但是,原始 RDD 现在不存在于内存中。
那么会不会再次加载base RDD来重建丢失的RDD分区呢?
是的,正如您提到的,如果用于创建分区的 RDD 不再在内存中,则必须从磁盘重新加载并重新计算。如果用于创建当前分区的原始 RDD 也不存在(既不在内存中也不在磁盘上),那么 Spark 将不得不退后一步并重新计算之前的 RDD。在最坏的情况下,Spark 将不得不一路返回到原始数据。
如果您的沿袭链很长,如上文所述,最坏情况,这可能意味着重新计算时间较长,此时您应该考虑使用 checkpointing 将中间结果存储在可靠的存储(如 HDFS)中,这将防止 Spark 一直返回到原始数据源并使用检查点数据代替。
@Comment:我在寻找任何官方参考文献时遇到问题 material 但据我所知,他们的代码库中 Spark 仅重新创建了丢失的数据部分。
我读了论文"Resilient Distributed Datasets A Fault-Tolerant Abstraction for In-Memory Cluster Computing"。作者说如果一个partition丢失了,我们可以用lineage来重建。但是,原始 RDD 现在不存在于内存中。 那么会不会再次加载base RDD来重建丢失的RDD分区呢?
是的,正如您提到的,如果用于创建分区的 RDD 不再在内存中,则必须从磁盘重新加载并重新计算。如果用于创建当前分区的原始 RDD 也不存在(既不在内存中也不在磁盘上),那么 Spark 将不得不退后一步并重新计算之前的 RDD。在最坏的情况下,Spark 将不得不一路返回到原始数据。
如果您的沿袭链很长,如上文所述,最坏情况,这可能意味着重新计算时间较长,此时您应该考虑使用 checkpointing 将中间结果存储在可靠的存储(如 HDFS)中,这将防止 Spark 一直返回到原始数据源并使用检查点数据代替。
@Comment:我在寻找任何官方参考文献时遇到问题 material 但据我所知,他们的代码库中 Spark 仅重新创建了丢失的数据部分。