Как убить работу hadoop изящно / перехватить `hadoop job -kill`
Мое Java-приложение работает на mapper и создает дочерние процессы, используя Qubole API. Приложение хранит дочерние quoble queryIDs. Мне нужно перехватить сигнал уничтожения и закрыть дочерние процессы перед выходом. hadoop job -kill jobId
а также yarn application -kill applicationId
Команды убивают работу в манере SIGKILL, я не знаю, как перехватить выключение. Можно ли каким-то образом перехватить уничтожение задания или настроить hadoop, чтобы приложение могло корректно завершить работу?
Приложение успешно перехватывает завершение работы с помощью ShutdownHook при локальном запуске, а не в контейнере mapper и может завершить дочерние процессы.
Подскажите пожалуйста как перехватить выключение при работе в маппере, или может я что-то не так делаю?
1 ответ
SIGKILL невозможно остановить, и ни один процесс не может его поймать. Ни ваше Java-приложение, ни сама JVM... На самом деле это не событие, отправленное процессу. Считайте, что это скорее прямой приказ ядру уничтожить все ресурсы процесса без промедления.
От man 7 signal
:
сигналы SIGKILL и SIGSTOP не могут быть пойманы, заблокированы или проигнорированы.
Это функция ядра ядра, вы не можете ее обойти.
Также обратите внимание, что в соответствии с Prabhu (2015-07-15) о том, как убить задания Hadoop:
Использование следующей команды не рекомендуется
hadoop job -list hadoop job -kill $jobId
рассмотреть возможность использования
mapred job -list mapred job -kill $jobId
Это проверено в Apache Hadoop - Устаревшая документация по API
К сожалению, согласно нынешним mapred
В документации команд не видно, что вы можете управлять типом сигнала, посылаемого для завершения задания.