5

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

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

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

4

1 回答 1

3

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 - Deprecated API Documentation上得到验证

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

于 2017-07-19T17:07:32.037 回答