0

仕事で Hadoop ストリーミングを使用しています。

私のマッパーはbashで書かれています。job_id を使用します。

mapred_job_id=`echo "$mapred_job_id" | awk -F "_" '{print $NF}'`

ジョブをクラッシュさせる次の行ができるまで、正常に動作します (デバッグ目的で愚かなワードカウント マッパー操作を起動します)。

mapred_job_id=`expr $mapred_job_id \* 2`

エラーは次のとおりです。

INFO mapreduce.Job: Task Id : attempt_1432766867252_0019_m_000007_0, Status : FAILED
Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 2
at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:330)
at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:543)
at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:81)
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:432)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:170)

なぜそれが機能しないのですか?コマンドラインで直接実行します。また、ダミーという名前の別の変数を使用しようとしました。同じエラー。

注: この行は、ID を取得する必要があり、前のジョブの ID と競合できないマッパーの別のジョブが後で必要になるためです。allreduce で動作する vowpal wabbit クラスターの実装を取得しようとしています。

4

1 に答える 1

1

問題が何であるかがわかりました。bash スクリプトは、次のコマンドで Hadoop ストリーミング環境変数を取得できませんでした。

mapper=`printenv mapred_task_id'

または、たとえば呼び出して直接

$mapreduce_output_fileoutputformat_outputdir

github にある Vowpal Wabbit クラスター ディレクトリのスクリプトで行われたように。を使用してこれらの変数を取得できる python スクリプトを作成することで、この問題を回避しましたos.environos.environHadoop ストリーミングのすべての環境変数を含む辞書を返します。mapreduce のさまざまなバージョン間で変数の名前が変更されているため、これは非常に便利でした。Cloudera が提供する辞書は、私自身のバージョンと矛盾していました。必要な変数を取得したスクリプトは次のとおりです。

#!/usr/bin/env python

import sys
import os
import subprocess

nmappers=os.environ["mapreduce_job_maps"]
submit_host=os.environ["mapreduce_job_submithostname"]
output_dir=os.environ["mapreduce_output_fileoutputformat_outputdir"]
mapred_job_id=os.environ["mapreduce_job_id"].split("_")[-1]
mapper=os.environ["mapreduce_task_id"].split("_")[4]

print nmappers, submit_host, output_dir, mapred_job_id, mapper

bash で記述されたマッパーからこのスクリプトを呼び出すと、次のコマンドを使用できます。

mapred_job_id=`expr $mapred_job_id \* 2`

これは、John Langford によって実装された vowpal wabbit の並列化のために、必要に応じてジョブ ID を変更します ( https://github.com/JohnLangford/vowpal_wabbit/blob/master/cluster/を参照)。

于 2015-06-04T10:20:16.350 に答える