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

时间:2017-05-30 19:16:55

标签: java hadoop mapreduce qubole

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

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

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

1 个答案:

答案 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,您似乎无法控制发送的终止作业的信号类型。