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重新计算而带来的冗余计算。