对火花RDD容错的误解

时间:2017-09-06 05:56:28

标签: apache-spark spark-streaming rdd distributed-computing fault-tolerance

许多人说:

Spark不会在hdfs中复制数据。

Spark在DAG图中安排操作.Spark构建RDD谱系。如果RDD丢失,可以在谱系图的帮助下重建它们。 因此不需要数据复制,因为可以从谱系图重新计算RDDS。

我的问题是:

如果节点出现故障,spark只会重新计算在此节点上丢失的RDD分区,但重新计算过程中所需的数据源来自何处?你的意思是它的父RDD在节点出现故障时仍然存在吗?如果丢失某些分区的RDD没有父RDD(如RDD来自火花流接收器)怎么办?

2 个答案:

答案 0 :(得分:2)

  

如果我们在计算中失去某些东西怎么办?

  • 依靠MR的关键见解!确定性提供安全的重新计算。
  • 跟踪'沿袭'每个RDD。如果需要,可以从父母那里重新计算。
  • 有趣的是:只需记录微小的状态即可进行重新计算。

    Need parent pointer, function applied, and a few other bits.
    Log 10 KB per transform rather than re-output 1 TB -> 2 TB
    

Source

子RDD是描述如何从父RDD计算RDD的元数据。阅读What is RDD dependency in Spark?

中的更多内容

答案 1 :(得分:0)

  

如果节点发生故障,spark将仅重新计算在该节点上丢失的RDD分区,但是重新计算过程中所需的数据源从何而来?您是说节点发生故障时,其父RDD仍然存在吗?

核心思想是您可以使用沿袭来恢复丢失的RDD,因为RDD是

  • 从另一个RDD或
  • 构建
  • 由稳定存储中的数据构建。

(来源:RDD paper, beginning of section 2.1

如果某些RDD丢失了,您可以返回沿袭,直到达到某些RDD或仍可用的初始数据记录为止。

稳定存储中的数据跨多个节点复制,因此不太可能丢失。

据我所了解的Streaming Receivers来看,接收到的数据似乎也保存在稳定的存储中,因此其行为与其他任何数据源一样。