Пусть говорят, что у меня есть NewHadoopRDD
и одно из его разбиений терпит неудачу во время вычисления. Обладая местным бегуном, я легко вижу все этапы этого процесса.
Я вижу неудачу задачи, но планировщик запускает следующую задачу и только после этого сбоя задачи уведомлений.
15/02/19 20:58:58 INFO scheduler.TaskSetManager: Starting task 1.0 in stage 0.0 (TID 1, localhost, PROCESS_LOCAL, 1347 bytes)
15/02/19 20:58:58 INFO executor.Executor: Running task 1.0 in stage 0.0 (TID 1)
15/02/19 20:58:58 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, localhost): java.lang.RuntimeException: java.sql.SQLException:
...
15/02/19 20:58:58 ERROR scheduler.TaskSetManager: Task 0 in stage 0.0 failed 1 times; aborting job
Теперь этап отменяется
15/02/19 20:58:58 ERROR scheduler.TaskSetManager: Task 0 in stage 0.0 failed 1 times; aborting job
15/02/19 20:58:58 INFO scheduler.TaskSchedulerImpl: Cancelling stage 0
15/02/19 20:58:58 INFO executor.Executor: Executor is trying to kill task 1.0 in stage 0.0 (TID 1)
15/02/19 20:58:58 INFO scheduler.TaskSchedulerImpl: Stage 0 was cancelled
И контроль даже переходит в контекст близко...
15/02/19 20:58:58 INFO ui.SparkUI: Stopped Spark web UI at http://node4.hbase.vitech.com.ua:4040
Но затем я вижу выход журнала из задачи следующего этапа.
15/02/19 20:58:58 INFO rdd.NewHadoopRDD: Input split: 0+0 ...
И только при остановке планировщика я вижу, что задача убита (на statusUpdate!).
15/02/19 20:58:58 INFO scheduler.DAGScheduler: Stopping DAGScheduler
15/02/19 20:58:58 INFO executor.Executor: Executor killed task 1.0 in stage 0.0 (TID 1)
15/02/19 20:58:58 ERROR scheduler.TaskSchedulerImpl: Exception in statusUpdate
Могу ли я сделать что-то, чтобы быстрее очистить все ресурсы RDD? unpersist()
здесь не помогает. Я вижу, что он записывается до завершения регистрации контекста. Но в любом случае я вижу следующие журналы задач.
Невозможно быстрее восстановиться. Как только задача будет запущена, она либо закончит, либо завершит свою работу самостоятельно. Сбой или отмена этапа не прервет выполнение задачи.
Я думаю, причина в том, что в основном потоки не могут быть насильственно убиты на Java. Если это проблема, вы можете пойти на большее количество разделов. Меньшие задачи заканчиваются быстрее.