一、概念
RDD 任务运行过程中,如果出错,spark会有相应的机制去进行错误修复,从而保证任务持续执行,即RDD容错机制。
二、具体容错分类
1.driver宕机
(1)如果job运行在client:程序直接挂了
(2)如果job运行在cluster:
-》spark on standalone/mesos:通过spark-submit的参数--supervise可以指定当driver宕机的时候,在其他的节点上重新恢复.
[root@hadoop spark-2.1.0-bin-2.6.0-cdh5.7.0]# bin/spark-submit
Usage: spark-submit [options] <app jar | python file> [app arguments]
Usage: spark-submit --kill [submission ID] --master [spark://...]
Usage: spark-submit --status [submission ID] --master [spark://...]
Usage: spark-submit run-example [options] example-class [example args]
Options:
......
Spark standalone or Mesos with cluster deploy mode only:
--supervise If given, restarts the driver on failure.
--kill SUBMISSION_ID If given, kills the driver specified.
--status SUBMISSION_ID If given, requests the status of the driver specified.
......
-》spark on yarn:自动恢复四次
2.executor宕机
比如executor进程所在机器(worker)宕机、Executor和Driver之间通信超时。则Driver直接把坏掉的executor从Driver列表中移除,然后重新向Resourcemanager/master申请资源,自动在work或者NodeManager上重新启动一个executor重新执行任务
3.task执行失败
Task任务执行过程中产生异常导致Task执行失败,自动进行恢复,最多失败4次
(1)Task数据恢复/重新运行的机制实质上是RDD的容错机制,即Lineage机制
容错的方式为:rdd ineage(生命线)==>RDD的依赖,即提供的一种容错机制,当子RDD执行失败的时候,可以直接从父RDD进行恢复操作。
(a)如果父RDD的执行结果进行了缓存操作,子RDD直接从缓存位置获取结果数据;
(b)如果cache的不是全部数据的话,那么部分数据从缓存中读取,其它数据从父RDD的数据来源读取(会存在父RDD的代码逻辑的执行);
(c)如果子RDD失败的是单个分区
-》如果父rdd和子rdd的关系是窄依赖,需要恢复父rdd对应分区的数据即可
-》如果父rdd和子rdd的关系是宽依赖,需要将所有父rdd的数据都执行一遍
(2)如果Lineage生命线特别长,此时Task执行失败的恢复成本就比较高,需要使用checkpoint和cache来先做缓存,减少执行开销