Hadoop命令行-D选项不起作用

时间:2014-07-08 12:39:54

标签: hadoop mapreduce hadoop2

我正在尝试使用像-Dmapred.mapper.mystring=somexyz这样的hadoop中的-D命令行选项传递变量(不是属性)。我可以在Driver程序中设置conf属性并在mapper中读回。 所以我可以用它来传递我的字符串作为附加参数并在Driver中设置它。但是我想看看-D选项是否可以用来做同样的

我的命令是:

$HADOOP_HOME/bin/hadoop jar  /home/hduser/Hadoop_learning_path/toolgrep.jar /home/hduser/hadoopData/inputdir/ /home/hduser/hadoopData/grepoutput -Dmapred.mapper.mystring=somexyz

驱动程序

String s_ptrn=conf.get("mapred.mapper.regex");

System.out.println(“debug:in Tool Class mapred.mapper.regex”+ s_ptrn +“\ n”); 给出空白

但这有效

conf.set("DUMMYVAL","100000000000000000000000000000000000000"); in driver is read properly in mapper by get method. 

我的问题是,如果所有互联网都说我可以使用-D选项那么为什么我不能?这是不是可以用于任何参数,只用于属性?我们可以通过putitng读取文件,我应该在驱动程序中读取然后使用它吗?

这样的东西
Configuration conf = new Configuration();
conf.addResource("~/conf.xml"); 

在驱动程序中,这是唯一的方法。

2 个答案:

答案 0 :(得分:4)

托马斯写道,你错过了这个空间。您还在CLI中传递变量mapred.mapper.mystring,但在您尝试获取mapred.mapper.regex的代码中。如果要使用-D参数,则应使用Tool接口。有关它的更多信息 - Hadoop: Implementing the Tool interface for MapReduce driver

或者你可以像这样解析你的CLI参数:

@Override
public int run(String[] args) throws Exception {
Configuration conf = this.getConf();

String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
while (i<otherArgs.length) {
        if (otherArgs[i].equals("-x")) {
            //Save your CLI argument
            yourVariable = otherArgs[++i];
}
//then save yourVariable into conf for using in map phase

比你的命令可以是这样的:

$HADOOP_HOME/bin/hadoop jar /home/hduser/Hadoop_learning_path/toolgrep.jar /home/hduser/hadoopData/inputdir/ /home/hduser/hadoopData/grepoutput -x yourVariable

希望有所帮助

答案 1 :(得分:0)

要在 hadoop jar 命令中正确使用 -D 选项,应使用以下语法:

hadoop jar {hadoop-jar-file-path} {job-main-class} -D {generic options} {input-directory} {output-directory}

因此 -D 选项应该放在作业主类名称之后,即在第三个位置。因为当我们发出 hadoop jar 命令时,hadoop 脚本会调用 RunJar 类 main()。这个 main() 解析第一个参数以在 classpath 中设置 Job Jar 文件,并使用第二个参数来调用作业类 main()。

一旦 Job 类 main () 被调用,然后控制被转移到 GenericOptionsParser,它首先解析通用命令行参数(如果有)并将它们设置在 Job 的配置对象中,然后使用剩余的参数(即输入)调用 Job 类的 run()和输出路径)