1.driver宕机
(1)如果job运行在client:程序直接挂了
(2)如果job运行在cluster:
-》spark on standalone/mesos:通过spark-submit的参数–supervise可以指定当driver宕机的时候,在其他的节点上重新恢复
-》spark on yarn:自动恢复四次
2.executor宕机
比如executor进程所在机器(worker)宕机、Executor和Driver之间通信超时。则Driver直接把坏掉的executor从Driver列表中移除,然后重新向Resourcemanager/master申请资源,自动在work或者NodeManager上重新启动一个executor重新执行任务
3.task执行失败
Task任务执行过程中产生异常导致Task执行失败,自动进行恢复,最多失败4次
(1)Lineage方式 Task数据恢复/重新运行的机制实质上是RDD的容错机制,即Lineage机制
容错的方式为,当子RDD执行失败的时候,可以直接从父RDD进行恢复操作。
Spark RDD实现基于Lineage的容错机制,基于RDD的各项transformation构成了compute chain,在部分计算结果丢失的时候可以根据Lineage重新恢复计算。
(1)在窄依赖中,在子RDD的分区丢失,要重算父RDD分区时,父RDD相应分区的所有数据都是子RDD分区的数据,并不存在冗余计算。
(2)在宽依赖情况下,丢失一个子RDD分区,重算的每个父RDD的每个分区的所有数据并不是都给丢失的子RDD分区用的,会有一部分数据相当于对应的是未丢失的子RDD分区中需要的数据,整个RDD都要重新计算,这样就会产生冗余计算开销和巨大的性能浪费。所以如果调用链路比较长的话,宽依赖最好做一次Checkpoint。
(2)checkpoint方式 如果Lineage生命线特别长,此时Task执行失败的恢复成本就比较高,需要使用checkpoint和cache来先做缓存,减少执行开销
checkpoint 是把 RDD 保存在 HDFS中, 是多副本可靠存储,所以依赖链就可以丢掉了,就斩断了依赖链, 是通过复制实现的高容错。但是有一点要注意, 因为checkpoint是需要把 job 重新从头算一遍, 最好先cache一下, checkpoint就可以直接保存缓存中的 RDD 了, 就不需要重头计算一遍了, 对性能有极大的提升。



