Spark_RDD的容错机制_数据丢失恢复

         我们都知道Spark是弹性分布式数据集,数据会存储在多台机器上,那么如何确保在分布式数据计算中,数据不丢失就是其中的关键的部分。本文主要讲解一下Spark中的容错机制。

        Spark 主要提供了3个层面的数据容错机制。分别是 调度层,RDD血统层, Checkpoint 层。在这3大层面中包括Spark RDD容错的4大核心要点.

  • (调度层)Stage输出失败,上层调度器DAGScheduler重试。
  • (调度层)Spark计算中,Task内部任务失败,底层调度器重试。
  • (血统层)RDD Lineage血统中窄依赖,宽依赖计算。
  • (Checkpoint层)Checkpoint 缓存。

调度层

DAG生成层

Stage 输出失败,上层调度器DAGScheduler 会进行重试

详细源码详见 Spark大数据商业实战三部曲p58

Task计算层

Spark计算过程中,计算内部某个Task任务出现失败,底层调度器会对此Task进行若干次重试(默认4次)

详细源码详见 Spark大数据商业实战三部曲p58

        

血统层

        SparkRDD 实现基于Lineage的容错机制,基于RDD的各项transformation 构成compute chain, 在部分计算结果丢失的时候可以根据Lineage重新恢复计算。

窄依赖 

         在子RDD的分区丢失,需要重算父RDD分区时。父RDD相应分区的所有数据都是子RDD分区的数据,并不存在冗余计算。

宽依赖

        丢失一个RDD分区,重算的每个父RDD的每个分区的所有数据并不是都丢给丢失的RDD的子RDD分区用的,会有一部分数据相当于对应的是未丢失的子RDD分区中需要的数据,这样就会产生冗余计算开销和巨大的性能浪费。

Checkpoint层

        Spark checkpoint 通过将RDD写入Disk作为检查点,是Spark lineage容错的辅助,lineage过长会造成容错成本过高,这时在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage, 就会减少开销。

checkpoint 主要适用于以下两种情况 :

  • DAG中的Lineage过长,如果重算,开销太大,如PageRank, ALS等
  • 尤其适合于在宽依赖上作checkpoint,这个时候就可以避免为Lineage重新计算而带来的冗余计算。

你可能感兴趣的:(Spark,spark,大数据,分布式)