7

我正在尝试使用 hadoop 中的 -D 命令行选项传递一个变量(不是属性),例如-Dmapred.mapper.mystring=somexyz. 我可以在驱动程序中设置一个 conf 属性并在映射器中读回它。所以我可以使用它来将我的字符串作为附加参数传递并在驱动程序中设置它。但我想看看 -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"); 给出 NULL

但这有效

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

我的问题是,如果所有互联网都说我可以使用 -D 选项,那为什么我不能呢?是不是这不能用于任何参数而只能用于属性?我们可以通过将文件放入我应该在驱动程序中读取然后使用它的文件中读取哪些内容?

就像是

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

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

4

2 回答 2

4

正如托马斯所写,你错过了这个空间。您还在mapred.mapper.mystringCLI 中传递变量,但在您试图获取的代码中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

希望能帮助到你

于 2014-07-09T05:36:40.437 回答
0

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

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

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

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

于 2021-06-09T13:49:35.267 回答