如何终止 hadoop 作业 gracefully/intercept `hadoop job -kill`

How to kill hadoop job gracefully/intercept `hadoop job -kill`

我的 Java 应用程序在映射器上运行并使用 Qubole API 创建子进程。应用程序存储子 qubole queryID。我需要在退出前拦截终止信号并关闭子进程。 hadoop job -kill jobIdyarn application -kill applicationId 命令正在以 SIGKILL 方式杀死作业,我不知道如何拦截关机。是否有可能以某种方式拦截作业终止或配置 hadoop 以使应用程序有机会正常关闭?

应用程序在 运行 本地时使用 ShutdownHook 成功拦截关闭,而不是在映射器容器中并且能够终止它的子进程。

请建议如何在映射器中 运行 时拦截关机,或者我做错了什么?

SIGKILL 是不可阻挡的,没有进程可以捕获它。无论是您的 Java 应用程序,还是 JVM 本身……实际上,它都不是发送到进程的事件。将其更多地视为直接命令内核立即销毁所有进程资源。

来自man 7 signal

the signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

这是本机核心内核功能,您无法绕过它。

另请注意,根据Prabhu (2015-07-15) on how to kill hadoop jobs

Use of following command is depreciated

hadoop job -list
hadoop job -kill $jobId

consider using

mapred job -list
mapred job -kill $jobId

这已在 Apache Hadoop - Deprecated API Documentation

上验证

遗憾的是,根据当前 mapred Command Documentation 看来您无法控制发送的终止作业的信号类型。