我的java应用程序在mapper上运行,并使用quboleapi创建子进程。应用程序存储子查询ID。我需要截获kill信号并在退出前关闭子进程。 hadoop job -kill jobId
以及 yarn application -kill applicationId
命令是以sigkill方式杀死job的,我不知道如何拦截关机。有没有可能以某种方式截获job kill,或者配置hadoop让应用程序有机会正常关闭?
应用程序使用成功截获关机 ShutdownHook
在本地运行时,不在Map器容器中,并且能够终止其子进程。
请建议如何截获关机时,运行在Map,或者我可能做了一些错误的事情?
1条答案
按热度按时间cuxqih211#
sigkill是不可阻挡的,任何进程都无法抓住它。无论是java应用程序还是jvm本身。。。事实上,它不是发送到进程的事件。把它看作是直接命令内核立即销毁所有进程资源。
从
man 7 signal
:sigkill和sigstop信号不能被捕获、阻止或忽略。
这是一个本机核心内核特性,您不能绕过它。
另请注意,根据prabhu(2015-07-15)关于如何杀死hadoop作业的内容:
以下命令的使用已折旧
考虑使用
这在ApacheHadoop不推荐使用的api文档中得到了验证
不幸的是,根据目前的情况
mapred
命令文档您似乎无法控制为终止作业而发送的信号类型。