【问题标题】: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


    【解决方案1】:

    如果我们在计算过程中丢失了一些东西怎么办?

    • 依靠 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?

    【讨论】:

      【解决方案2】:

      如果一个节点出现故障,spark只会重新计算这个节点上丢失的RDD分区,但是重新计算过程中需要的数据源是从哪里来的呢?你的意思是当节点失败时它的父RDD还在吗?

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

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

      (来源:RDD paper, beginning of section 2.1

      如果某些 RDD 丢失了,您可以返回血统,直到您到达某个 RDD 或仍然可用的初始数据记录。

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

      就我所读到的Streaming Receivers 而言,接收到的数据似乎也保存在稳定的存储中,因此它的行为与任何其他数据源一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-16
        • 2020-09-18
        • 2016-01-04
        • 2021-02-24
        • 1970-01-01
        • 2016-08-01
        • 2015-06-18
        相关资源
        最近更新 更多