Как убить работу 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 В документации команд не видно, что вы можете управлять типом сигнала, посылаемого для завершения задания.

Другие вопросы по тегам