Hadoop命令行中的-D选项无效

8

我正在尝试在Hadoop中使用-D命令行选项传递一个变量(而不是属性),例如-Dmapred.mapper.mystring=somexyz。我可以在Driver程序中设置一个配置属性,并在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: 在Tool类中mapred.mapper.regex "+s_ptrn + "\n"); 输出NULL

但是这个可以正常工作

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

我的问题是,如果整个互联网都在说我可以使用-D选项,那么为什么我不能使用?是因为这不能用于任何参数,只能用于属性吗?我们可以把它放在文件中读取,然后在驱动程序中使用吗?
类似下面的内容:
Configuration conf = new Configuration();
conf.addResource("~/conf.xml"); 

在驱动程序中,这是唯一的方法。
2个回答

4

正如Thomas所写的那样,您缺少空格。您还在CLI中传递了变量mapred.mapper.mystring,但在代码中您正在尝试获取mapred.mapper.regex。如果要使用-D参数,则应该使用Tool接口。更多信息请参见此处 - Hadoop:实现MapReduce驱动程序的Tool接口

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

希望有所帮助。

Radek,我正在使用工具界面,这不是问题。我已经通过CLI实现了类似的东西来传递参数,但我想知道-D的意义。此外,我试图提供示例代码,因此您看到了不同名称@ commandline和解析代码,但我已在代码中处理好了。干得好。 - vivek ashodha
还有一件事,你应该在你的jar后面使用-D,在你的情况下:$HADOOP_HOME/bin/hadoop jar /home/hduser/Hadoop_learning_path/toolgrep.jar -D mapred.mapper.mystring=something /home/hduser/hadoopData/inputdir/ /home/hduser/hadoopData/grepoutput - Radek Tomšej
1
我在另一个帖子中解决了问题,它被嵌入到用户的回复中而不是被选中的答案中。-D属性=值需要成为MR的第一个参数。不确定为什么会强制执行这样的要求。同时我也学到了-D的重要性。使用-D,main函数看到4个参数,但是Tool runners run方法只传递没有-D的参数,所以我们可以通过getter访问那些参数[n]和-D。任何其他字母除了-D,我们都必须将它们处理为常规CLI参数-吸取教训! - vivek ashodha
我在发布后看到了您的评论,但那就是问题所在。命令中“-D”的位置不对,谢谢您的回复,收到我的投票支持。 - vivek ashodha

2
为了正确使用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()方法解析第一个参数以将Job Jar文件设置在类路径中,并使用第二个参数调用作业类的main()方法。
一旦调用作业类的main()方法,则控制权转移到GenericOptionsParser,该解析器首先解析通用命令行参数(如果有),并将它们设置在Job的配置对象中,然后使用剩余的参数(即输入和输出路径)调用Job类的run()方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接