如何优雅地杀死hadoop工作/拦截`hadoop job -kill`

lef*_*oin 6 java hadoop mapreduce qubole

我的Java应用程序在mapper上运行,并使用Qubole API创建子进程.应用程序存储子qubole queryIDs.我需要在退出之前拦截kill信号并关闭子进程.hadoop job -kill jobIdyarn application -kill applicationId命令以SIGKILL方式查杀,我不知道如何拦截关机.是否有可能以某种方式拦截作业终止或配置hadoop以给予应用程序机会优雅地关闭?

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

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

Fab*_*ien 4

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

man 7 signal

信号 SIGKILL 和 SIGSTOP 无法被捕获、阻止或忽略。

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

另请注意,根据Prabhu (2015-07-15)关于如何终止 hadoop jobs 的说法

不推荐使用以下命令

hadoop job -list
hadoop job -kill $jobId
Run Code Online (Sandbox Code Playgroud)

考虑使用

mapred job -list
mapred job -kill $jobId
Run Code Online (Sandbox Code Playgroud)

这已在Apache Hadoop 上得到验证 - 已弃用的 API 文档

不幸的是,根据当前的mapred命令文档,您似乎无法控制发送来终止作业的信号类型。