我正在尝试链接一些流式作业(用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
我的问题是命令“-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)
此外,我无法理解,为什么当我直接使用Streaming工作时,Streaming识别-D选项,但是当我通过JobClient运行Streaming的作业时,-D选项识别失败。是Streaming的问题还是sun.reflect的问题?在Ubuntu中sun.reflect包在哪里?
答案 0 :(得分:2)
看起来StreamJob不支持-Dkey=value
通用配置选项。
请参阅http://wiki.apache.org/hadoop/HadoopStreaming,但看起来您需要使用(并在该页面上明确地将其作为示例调用):
-jobconf mapred.reduce.tasks=0
答案 1 :(得分:1)
首先,行
..."-D mapred.reduce.tasks=0"...
应该写成
..."-D", "mapred.reduce.tasks=0"...
这是命令的标准模式,
"-commandname", "value"
要继续,程序通常可以接受或不接受某些参数。 Hadoop上下文中的这些参数称为选项。它们有两种,通用和流媒体,特定于工作。 generic options由GenericOptionsParser处理。 Hadoop Streaming环境中的Job specific options是从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选项,因此需要使用GenericOptionsParser来解析-D选项。
当有人使用命令
运行流媒体作业时,继续前进bin/hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-*.jar [ generic options] [ streaming( job specific) options]
究竟发生了什么?为什么在这种情况下没有问题?在这种情况下,正确解析通用和特定于作业的选项。这是可能的,因为Tool接口通过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。请参阅this和this,了解Tool = StreamJob。
的直觉总之,
GenericOptionsParser - &gt;通用选项,
StreamJob - &gt;流媒体(特定于工作)选项。