Hadoop命令行-D选项不工作



我试图通过一个变量(不是属性)使用-D命令行选项在hadoop像-Dmapred.mapper.mystring=somexyz。我能够在驱动程序中设置一个配置属性,并在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("调试:在工具类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"); 

正如Thomas所写的,你错过了空格。您还在CLI中传递变量mapred.mapper.mystring,但在代码中您试图获得mapred.mapper.regex。如果您想使用-D参数,您应该使用工具接口。更多的信息在这里- Hadoop:实现MapReduce驱动的工具接口。

或者你可以这样解析你的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

希望有所帮助

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

hadoop jar {hadoop-jar-file-path} {job-main-class} -D{通用选项}{输入目录}{输出目录}

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

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

相关内容

  • 没有找到相关文章

最新更新