我正在尝试使用像-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");
在驱动程序中,这是唯一的方法。
答案 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()和输出路径)