我的Java应用程序在mapper上运行,并使用Qubole API创建子进程。应用程序存储子qubole queryIDs。我需要在退出之前拦截kill信号并关闭子进程。 hadoop job -kill jobId
和yarn application -kill applicationId
命令以SIGKILL方式查杀,我不知道如何拦截关机。是否有可能以某种方式拦截作业终止或配置hadoop以给予应用程序机会优雅地关闭?
应用程序在本地运行时使用ShutdownHook
成功拦截关闭,而不是在mapper容器中并且能够杀死它的子进程。
请建议如何在mapper中运行时拦截关机,或者我做错了什么?
答案 0 :(得分:2)
SIGKILL势不可挡,任何流程都无法抓住它。既不是你的Java应用程序,也不是JVM本身......事实上,它并不是发送给进程的事件。将其视为内核的直接命令,可以毫不拖延地销毁所有进程资源。
来自man 7 signal
:
无法捕获,阻止或忽略信号SIGKILL和SIGSTOP。
这是本机核心内核功能,您无法绕过它。
另请注意,根据Prabhu上的how to kill hadoop jobs (2015-07-15):
使用以下命令已弃用
hadoop job -list hadoop job -kill $jobId
考虑使用
mapred job -list mapred job -kill $jobId
这已在Apache Hadoop - Deprecated API Documentation
上验证不幸的是,根据当前mapred
Command Documentation,您似乎无法控制发送的终止作业的信号类型。