1

すべての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を抽出できます

4

2 に答える 2

1

ユーザー定義の名前をジョブに割り当てるオプションがあります。

|-D mapred.job.name="unique_name_within_the_user" \

その後、Hadoop YARN REST API の応答から job_id を特定します。

curl -H "Accept: application/json" -X GET "http://host.domain.com:8088/ws/v1/cluster/apps"
于 2015-10-17T10:49:06.797 に答える
0

現在の「ハック」以外に 2 つのオプションがあります (そのうちの 1 つは別の「ハック」です!)

  1. 実行中のプロセスの標準エラーをキャプチャします。ジョブ ID は最初の (数行) 行に出力され、次のような形式になりますRunning job: <jobid>

  2. ストリーミング contrib フォルダーのStreamJob.javaソース コード (行 917 あたり) を変更して、ジョブ ID を tmp ファイルに出力します (シェルからの迅速な検出のために、プロセス ID の前に / サフィックスが付いている場合があります)。

于 2012-06-26T10:32:00.543 に答える