我试图通过一个变量(不是属性)使用-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()与剩余的参数(即输入和输出路径)