Executor在启动和执行计算任务过程中都有可能遇到错误或者异常,会遇到哪些错误呢?看一下Executor的run方法就知道了,在run方法中通过try-catch语句捕获了常见的异常,这些异常包括FetchFailedException、TaskKilledException、CommitDeniedException、任何可Throwable的异常。Executor中是如何处理异常的呢?看一下源代码吧,下面是捕获异常的代码。
上面代码中,遇到异常分别做以下处理。
·FetchFailedException:抓取shuffle Block时发生异常。捕获到这个异常之后,将会传递给DAGScheduler,并且DAGScheduler将重新提交前一个Stage。捕获到该异常后,会调用CoarseGrainedExecutorBackend的statusUpdate方法,这个方法将向Driver发送Sta-tusUpdate消息,消息中包括taskId、executorId、taskState,以及捕获的异常堆栈信息。Driver匹配到StatusUpdate消息,调用TaskSchedulerImpl的statusUpdate方法,完成更新任务相关登记信息并重新调度资源执行失败任务。
·TaskKilledException:当一个任务被显式地结束时抛出该异常,例如:任务失败,线程被中断。当捕获到该异常时,会执行execBackend.statusUpdate(taskId,TaskState. KILLED,ser.serialize(TaskKilled)),该语句调用了CoarseGrainedExecutorBackend的statusUpdate方法,并将taskId、TaskState.KILLED及错误信息传入该方法,最后通过driverRef.send(msg)的方式将StateUpdate(executorId,tasked,state,data)消息发送到CoarseGrainedExecutorBackend中,在CoarseGrainedExecutorBackend的receive方法中匹配到StatusUpdate(executorId,taskId,state,data)消息,将会执行与FetchFailedExcep-tion类似的操作,即更新登记信息表并重新调度资源运行任务。(www.xing528.com)
·CommitDeniedException:当task尝试向HDFS写出任务但被Driver拒绝时抛出该异常。该异常的处理与FetchFailedException完全一样。
·Throwable:其他类型的异常,将终止Executor,并重新调度资源。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。