有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何优雅地杀死hadoop作业/intercept`hadoop作业杀死`

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

应用程序在本地运行时使用ShutdownHook成功拦截关机,而不是在映射器容器中运行,并且能够终止其子进程

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


共 (1) 个答案

  1. # 1 楼答案

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

    man 7 signal

    the signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

    这是一个本机核心内核特性,您不能绕过它

    还请注意,根据Prabhu(2015-07-15)关于how to kill hadoop jobs

    Use of following command is depreciated

    hadoop job -list
    hadoop job -kill $jobId
    

    consider using

    mapred job -list
    mapred job -kill $jobId
    

    这在Apache Hadoop - Deprecated API Documentation上得到了验证

    不幸的是,根据当前的^{} Command Documentation,似乎无法控制为终止作业而发送的信号类型