2017-05-30 72 views
7

我的Java應用程序在mapper上運行,並使用Qubole API創建子進程。應用程序存儲兒童qubole queryID。我需要在退出之前攔截終止信號並關閉子進程。 hadoop job -kill jobIdyarn application -kill applicationId命令都以SIGKILL方式查殺作業,我不知道如何攔截關機。是否有可能以某種方式攔截作業殺手或配置hadoop讓應用程序有機會正常關機?如何優雅地殺掉hadoop工作/攔截hadoop job -kill`

當本地運行時,應用程序使用ShutdownHook成功攔截關閉,而不是在映射容器中並且能夠終止其子進程。

請建議如何在mapper中運行時攔截關機,或者我做錯了什麼?

+0

關於ShutdownHooks未被執行,預計應用程序是否被SIGKILL殺死(請參閱:https://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal-在-JAVA)。我不相信你能「處理」SIGKILL,正如鏈接中提到的那樣,你可以監控工作的狀態。據我所知,目前爲止還沒有工具可以「正常關機」工作。 – Adonis

回答

2

SIGKILL是不可阻擋的,任何進程都無法捕捉到它。無論是Java應用程序,也不是JVM本身......事實上,事件並不是發送給進程的。把它看作是直接向內核發出命令,立即銷燬所有進程資源。

man 7 signal

信號SIGKILL和SIGSTOP不能被捕獲,阻止或忽略。

這是一個本地核心內核功能,你不能繞過它。

另外要注意的是,根據Prabhu(2015年7月15日)how to kill hadoop jobs

使用以下命令的折舊

hadoop job -list 
hadoop job -kill $jobId 

考慮使用

mapred job -list 
mapred job -kill $jobId 

這在Apache Hadoop - Deprecated API Documentation

驗證不幸的是,根據目前的mapred Command Documentation它似乎並不表明您可以控制發送信號的類型來終止工作。

+0

所以我無法控制發送信號的類型來終止一項工作,並且無法正常關機。 – leftjoin

+0

嗯,我並不是說你不能這樣做,但顯然這樣做的方式不是標準,並且會涉及(很多)更多的代碼/腳本來維護......最有可能以DIY解決方案結束。 – Fabien