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

Hadoop命令行-D选项不起作用,hadoop,mapreduce,hadoop2,Hadoop,Mapreduce,Hadoop2,我试图在hadoop中使用-D命令行选项传递变量(而不是属性),比如-Dmapred.mapper.mystring=somexyz。我能够在驱动程序中设置conf属性,并在mapper中读取它。 所以我可以用它来传递字符串作为附加参数,并在驱动程序中设置它。但是我想看看-D选项是否也可以用来做同样的事情 我的命令是: $HADOOP_HOME/bin/hadoop jar /home/hduser/Hadoop_learning_path/toolgrep.jar /home/hduser/

我试图在hadoop中使用-D命令行选项传递变量(而不是属性),比如
-Dmapred.mapper.mystring=somexyz
。我能够在驱动程序中设置conf属性,并在mapper中读取它。 所以我可以用它来传递字符串作为附加参数,并在驱动程序中设置它。但是我想看看-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(“调试:在工具类mapred.mapper.regex”+s_ptrn+“\n”); 给空

但这是有效的

conf.set("DUMMYVAL","100000000000000000000000000000000000000"); in driver is read properly in mapper by get method. 
我的问题是,如果所有的互联网都说我可以使用-D选项,那么为什么我不能呢?这是否不能用于任何参数,而只能用于属性?我们可以通过在文件中输入我应该在驱动程序中读取然后使用它来读取哪些内容

差不多

Configuration conf = new Configuration();
conf.addResource("~/conf.xml"); 

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

正如托马斯所写,您缺少空间。您还在CLI中传递变量
mapred.mapper.mystring
,但在代码中您试图获取
mapred.mapper.regex
。如果要使用-D参数,则应使用工具接口。更多关于它的信息在这里-

或者,您可以像这样解析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

希望正确地将-D选项与hadoop jar命令结合使用会有所帮助,因为应该使用以下语法:

hadoop jar{hadoop jar文件路径}{job main class}-D{generic options}{input directory}{output directory}

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


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

Radek,我使用的工具界面不是问题所在。我已经用CLI实现了类似的东西来传递值。但是我想知道-D的意义。我也尝试给出示例代码,因此您看到了不同的名称@commandline和代码解析,但我在代码中处理了它。好主意。还有一件事,你应该在罐子后面用-D,在您的例子中:
$HADOOP\u HOME/bin/HADOOP jar/HOME/hduser/HADOOP\u learning\u path/toolgrep.jar-D mapred.mapper.mystring=something/HOME/hduser/hadoopData/inputdir//HOME/hduser/hadoopData/grepoutput
我在这里的另一篇帖子中解决了这个问题,它嵌入到用户响应中,而不是所选的答案--D property=value需要是首先,博伊先生不知道为什么要强制执行这些要求。我还学到了-D的重要性。对于-D main,可以看到4个参数,但是工具运行器run方法只传递没有-D的参数,所以我们可以通过getter访问这些带有参数[n]和-D的参数。任何其他字母thne-D我们必须将其作为常规CLI参数处理-经验教训!我看到你的评论后,我的帖子,但这是它的位置-D的命令是问题,谢谢你得到我的投票