2

私はいくつかのストリーミングジョブ(Pythonで書かれたジョブ)を連鎖させようとしています。やりましたが、-Dコマンドに問題があります。これがコードです、

public class OJs extends Configured implements Tool
{
public int run( String[] args) throws Exception
{
    //DOMINATION
    Path domin      = new Path( "diploma/join.txt");
    //dominationm.py
    Path domout     = new Path( "mapkeyout/");
    //dominationr.py

    String[] dom = new String[]
    {
        "-D mapred.reduce.tasks=0",
        "-file"     , "/home/hduser/optimizingJoins/dominationm.py" ,
        "-mapper"   , "dominationm.py"                              ,
        "-file"     , "/home/hduser/optimizingJoins/dominationr.py" ,
        "-reducer"  , "dominationr.py",         
        "-input"    , domin.toString()                              ,
        "-output"   , domout.toString()
    };
    JobConf domConf = new StreamJob().createJob( dom);
    //run domination job
    JobClient.runJob( domConf);
    return 0;
}//end run

public static void main( String[] args) throws Exception
{
    int res = ToolRunner.run( new Configuration(), new OJs(), args);
    System.exit( res);
}//end main
}//end OJs

私の問題はコマンド「-Dmapred.reduce.tasks=0」にあります。このエラーが発生します、

ERROR streaming.StreamJob: Unrecognized option: -D...

ここで、...には、可能な構文の組み合わせが含まれます。

"-D mapred.reduce.tasks=0"
"-Dmapred.reduce.tasks=0"
"-D", "mapred.reduce.tasks=0"
"-D", "mapred.reduce.tasks=", "0"
" -D mapred.reduce.tasks=0"

-Dの前にスペースがある場合、このコマンドは無視されます。指定したレデューサーの数がありません。このスペースがないと、前述のエラーが発生します。

私は何が間違っているのですか?

編集

-Dオプションを-jobconfに置き換えても、問題は解決しません。これが全体のエラー出力です。

 Warning: $HADOOP_HOME is deprecated.

    12/10/04 00:25:02 ERROR streaming.StreamJob: Unrecognized option: -jobconf mapred.reduce.tasks=0
    Usage: $HADOOP_HOME/bin/hadoop jar \
          $HADOOP_HOME/hadoop-streaming.jar [options]

    Options:
   -input    <path>     DFS input file(s) for the Map step

   -output   <path>     DFS output directory for the Reduce step

   -mapper   <cmd|JavaClassName>      The streaming command to run

   -combiner <cmd|JavaClassName> The streaming command to run

   -reducer  <cmd|JavaClassName>      The streaming command to run

   -file     <file>     File/dir to be shipped in the Job jar file

   -inputformat TextInputFormat(default)|SequenceFileAsTextInputFormat|JavaClassName Optional.

   -outputformat TextOutputFormat(default)|JavaClassName  Optional.

   -partitioner JavaClassName  Optional.

   -numReduceTasks <num>  Optional.

   -inputreader <spec>  Optional.

   -cmdenv   <n>=<v>    Optional. Pass env.var to streaming commands

   -mapdebug <path>  Optional. To run this script when a map task fails 

   -reducedebug <path>  Optional. To run this script when a reduce task fails 

   -io <identifier>  Optional.

   -verbose

   Generic options supported are

   -conf <configuration file>     specify an application configuration file

   -D <property=value>            use value for given property

   -fs <local|namenode:port>      specify a namenode

   -jt <local|jobtracker:port>    specify a job tracker

   -files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster

   -libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.

   -archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.

   The general command line syntax is
   bin/hadoop command [genericOptions] [commandOptions]


   For more details about these options:

   Use $HADOOP_HOME/bin/hadoop jar build/hadoop-streaming.jar -info

   Exception in thread "main" java.lang.IllegalArgumentException: 
    at org.apache.hadoop.streaming.StreamJob.fail(StreamJob.java:549)
    at org.apache.hadoop.streaming.StreamJob.exitUsage(StreamJob.java:486)
    at org.apache.hadoop.streaming.StreamJob.parseArgv(StreamJob.java:246)
    at org.apache.hadoop.streaming.StreamJob.createJob(StreamJob.java:143)
    at OJs.run(OJs.java:135)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at OJs.main(OJs.java:183)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:156)

さらに、ストリーミングを使用してジョブを直接実行すると、ストリーミングが-Dオプションを認識しますが、JobClientを介してストリーミングを使用してジョブを実行すると、-Dオプションの認識が失敗する理由がわかりません。ストリーミングの問題ですか、それともsun.reflectの問題ですか?Ubuntuのsun.reflectパッケージはどこにありますか?

4

2 に答える 2

3

StreamJobは-Dkey=value一般的な構成オプションをサポートしていないようです。

http://wiki.apache.org/hadoop/HadoopStreamingを参照してください。ただし、使用する必要があるようです(このページでは、例として明示的に呼び出されています)。

-jobconf mapred.reduce.tasks=0
于 2012-10-02T00:53:53.447 に答える
1

そもそも、

..."-D mapred.reduce.tasks=0"...

次のように書く必要があります

..."-D", "mapred.reduce.tasks=0"...

これはコマンドの標準パターンです。

"-commandname", "value"

続行するために、プログラムは通常、いくつかの引数を受け入れるかどうかを決定します。Hadoopコンテキストでのこれらの引数は、オプションと呼ばれます。それらには、汎用とストリーミングの2種類があり、ジョブ固有です。汎用オプションGenericOptionsParserから処理されます。Hadoopストリーミングのコンテキストでのジョブ固有のオプションは、StreamJobから処理されます。

したがって、最初の質問のコードで-Dオプションを設定する方法は間違っています。これは、-Dが汎用オプションであるためです。StreamJobは一般的なオプションを処理できません。StreamJobは-jobconfを処理できますが、これはジョブ固有のオプションです。だからライン

..."-D", "mapred.reduce.tasks=0"...

正しく書かれている

..."-jobconf", "mapred.reduce.tasks=0"...

-jobconfを使用すると、この警告が発生します。

WARN streaming.StreamJob: -jobconf option is deprecated, please use -D instead.

この警告を回避するには、-Dオプションが必要であり、その結果、-Dオプションを解析するためにGenericOptionsParserが必要です。

次に進むには、誰かがコマンドを使用してストリーミングジョブを実行したとき

bin/hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-*.jar [ generic options] [ streaming( job specific) options]

本当に何が起こりますか?この場合、なぜ問題がないのですか?この場合、汎用オプションとジョブ固有のオプションの両方が適切に解析されます。これが可能なのは、GenericOptionsParserを介して汎用オプションを処理するツールインターフェイスがあるためです。ジョブ固有のオプションは、hadoop-streaming-*。jar内のStreamJob()から処理されます。

実際、hadoop-streaming-*。jarには、上記の方法で送信されたジョブを担当するファイル「HadoopStreaming.java」があります。HadoopStreamingクラスは、2つの引数を使用してToolRunner.run()を呼び出します。最初の引数は新しいStreamJobオブジェクトであり、2番目の引数はすべてのコマンドラインオプション、つまり[汎用オプション]と[ストリーミング(ジョブ固有)オプション]で構成されます。GenericOptionsParserは、一般的なオプションのみを解析することにより、一般的なオプションとジョブ固有のオプションを分離します。次に、GenericOptionsParserは、残りのオプション、つまりStreamJob()から解析されるジョブ固有のオプションを返します。StreamJobは、Tool.run([ジョブ固有の引数])を介して呼び出されます。ここで、Tool=StreamJobです。Tool = StreamJobである理由を直感的に理解するには、これこれを参照してください。

結論は、

GenericOptionsParser->汎用オプション、

StreamJob->ストリーミング(ジョブ固有)オプション。

于 2012-10-09T10:03:21.047 に答える