すべてのHadoopジョブには固有のjobidがあります。jobidを使用して、ジョブステータスまたはジョブカウンターを取得できます。問題は、スクリプトから実行したばかりのジョブのjobidを取得するにはどうすればよいですか?そしてもちろん、私はこれを信頼できる簡単な方法で(可能であれば)やりたいと思っています。
例:
1)実行するスクリプトから:
hadoop jar ${HADOOP_STREAMING} \
-D mapred.job.name="$NAME" \
-D mapred.reduce.tasks=$NREDUCERS\
-mapper "cat" \
-file ./reducer.py \
-reducer "python ./reducer.py" \
-input hdfs:/logs/2012-06-25/*.bz2 \
-output hdfs:/tmp/test
2)起動されたタスクのジョブIDをどうにかして取得したいと思います。
3)jobidがある場合、hadoopjob-statusおよびhadoopjob-counterクエリを実行できます。
アップデート:
同期ケース(完了するまで待機し、jobidを取得してから、ステータス/カウンターを要求する)が最低限必要なようですが、使用するのが不便な場合もあります。いくつかのHadoopストリーミングジョブを(バックグラウンドタスクとして)同時に実行したい場合や、ワークフロー分析などで後で使用できるすべてのジョブIDを記憶したい場合があります。
実際、私はいくつかの解決策を見つけましたが、それはハックだと思います。それは私を非常に悩ませます。誰かが私にもっとエレガントな解決策を見せてくれたらありがたいです。解決策は次のとおりです。
1)Hadoopストリーミングジョブを実行するときは、出力hdfsディレクトリを指定する必要があります。
2)このディレクトリを使用して、hdfsのジョブ構成ファイルにアクセスできます。
CONF_FILE_PATH=`hadoop fs -stat hdfs:<output_dir_path>/_logs/history/*.xml | awk '{print $NF}'`
3)最後に、構成ファイルの名前からジョブIDを抽出できます