2012-09-29 133 views
2

我试图链接一些流式作业(用Python编写的作业)。我做到了,但是我有-D命令的问题。下面是代码,Hadoop Streaming 1.0.3无法识别-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 

我的问题是与命令 “-D mapred.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前的空间,那么这个命令忽略。我没有指定的减速器数量。当我没有这个空间时,我得到了我提到的错误。

我在做什么错?

编辑

代与-jobconf -D选项不解决问题。这里是整个错误输出,

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选项识别失败。 Streaming的问题还是sun.reflect的问题? Ubuntu中的sun.reflect软件包在哪里?

回答

1

首先,行

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

应写为

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

这是标准模式的命令,

"-commandname", "value" 

要继续,程序一般可以接受或不接受一些参数。 Hadoop上下文中的这些参数称为选项。有两种类型,通用和流媒体,特定作业。 generic optionsGenericOptionsParser处理。 Hadoop Streaming上下文中的Job specific options是从StreamJob处理的。

所以,在初始问题的代码中设置-D选项的方式是错误的。这是因为-D是一个通用选项。 StreamJob无法处理通用选项。然而,StreamJob可以处理-jobconf,这是一个特定于工作的选项。太行

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

正确writtern为

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

随着-jobconf此警告升高,

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

要避免此警告-D选项需要以及因此GenericOptionsParser是需要解析-D选项。

继续前进,当有人运行使用命令

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类使用两个参数调用ToolRunner.run()。第一个参数是一个新的StreamJob对象,第二个参数包含所有命令行选项,即[通用选项]和[流式(特定于作业)选项]。 GenericOptionsParser通过仅分析通用选项来分离泛型和作业特定选项。然后,GenericOptionsParser返回其他选项,即从StreamJob()解析的特定作业。 StreamJob通过Tool.run([job specific args])调用,其中Tool = StreamJob。见thisthis有一个直观的为什么工具= StreamJob。

总之,

GenericOptionsParser - >通用选项,

StreamJob - >流(作业专用)选项。

2

看起来像StreamJob不支持-Dkey=value通用配置选项。

http://wiki.apache.org/hadoop/HadoopStreaming,但看起来像你需要使用(并明确调用了该网页上的例子):

-jobconf mapred.reduce.tasks=0 
+1

你最终解决了这个问题。我错误地使用jobconf。尽管如此,我发现了很多其他有趣和重要的事情。我在回答中谈论他们。谢谢! – vpap