2017-05-30 68 views
7

私のJavaアプリケーションはマッパー上で動作し、Qubole APIを使って子プロセスを作成します。アプリケーションは、子クォールクエリIDを格納します。終了する前にkillシグナルとシャットダウンの子プロセスを傍受する必要があります。 hadoop job -kill jobIdとコマンドがSIGKILLでジョブを強制終了していますが、シャットダウンの傍受方法がわかりません。何らかの形でジョブの強制終了を傍受するか、正常にシャットダウンするアプリケーションの機会を与えるためにhadoopを設定することは可能ですか?正常にhadoopジョブを殺す方法/ intercept `hadoop job -kill`

アプリケーションは、マッパーコンテナではなくローカルで実行しているときにShutdownHookを使用してシャットダウンを正常に傍受し、子プロセスを強制終了できます。

マッパーで実行中にシャットダウンを中断する方法を教えてください。あるいは何か間違っていますか?

+0

シャットダウンフックが実行されていないことについては、アプリケーションがSIGKILLで強制終了されると予想されます(https://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal- in-java)。私はあなたがSIGKILLを "扱う"ことができるとは思わない、リンクに記載されているように、あなたは仕事の状態を監視することができます。私が知る限り、これまでの仕事の「優雅な停止」を可能にするツールはありません。 – Adonis

答えて

2

SIGKILLは止められず、プロセスはそれをキャッチできません。どちらのJavaアプリケーションも、JVM自体も...実際には、イベントはプロセスに送信されません。遅れずにすべてのプロセスリソースを破壊するためのカーネルへの直接的な命令として、より多くのことを考えてください。 man 7 signalから

シグナルSIGKILLとSIGSTOPは、キャッチブロックされた、または無視することはできません。

これはネイティブのコアカーネル機能です。バイパスすることはできません。次のコマンドの

使用

hadoop job -list 
hadoop job -kill $jobId 

mapred job -list 
mapred job -kill $jobId 
使用することを検討して減価償却される:

Prabhu(2015年7月15日)how to kill hadoop jobs上に従っていることに注意してください

これはApache Hadoop - Deprecated API Documentationにあります。

残念ながら、現在のmapred Command Documentationによれば、ジョブを終了するために送信される信号のタイプを制御できるとは思われません。

+0

したがって、ジョブを終了するために送信される信号のタイプを制御することはできず、正常にシャットダウンできません。 – leftjoin

+0

まあ、私はあなたができないとは言いませんが、明らかにそのようにする方法は標準ではなく、多くのコード/スクリプトを維持する必要があります...おそらくDIYソリューションで終わるでしょう。 – Fabien

関連する問題