【问题标题】:Misunderstanding of spark RDD fault tolerantspark RDD容错的误区
【发布时间】:2018-02-14 12:07:30
【问题描述】:
很多人说:
Spark 不会在 hdfs 中复制数据。
Spark 将操作安排在 DAG 图中。Spark 构建 RDD 沿袭。如果 RDD 丢失,可以借助沿袭图重建它们。
因此不需要数据复制,因为可以从谱系图重新计算 RDDS。
我的问题是:
如果一个节点出现故障,spark只会重新计算这个节点上丢失的RDD分区,但是重新计算过程中需要的数据源是从哪里来的呢?你的意思是当节点失败时它的父RDD还在吗?如果丢失了一些分区的RDD没有父RDD怎么办(比如RDD来自spark流接收器)?
【问题讨论】:
标签:
apache-spark
spark-streaming
rdd
distributed-computing
fault-tolerance
【解决方案2】:
如果一个节点出现故障,spark只会重新计算这个节点上丢失的RDD分区,但是重新计算过程中需要的数据源是从哪里来的呢?你的意思是当节点失败时它的父RDD还在吗?
核心思想是可以使用lineage来恢复丢失的RDD,因为RDD是
- 从另一个 RDD 构建或
- 根据稳定存储中的数据构建。
(来源:RDD paper, beginning of section 2.1)
如果某些 RDD 丢失了,您可以返回血统,直到您到达某个 RDD 或仍然可用的初始数据记录。
稳定存储中的数据跨多个节点复制,因此不太可能丢失。
就我所读到的Streaming Receivers 而言,接收到的数据似乎也保存在稳定的存储中,因此它的行为与任何其他数据源一样。