将hadoop参数传递到java代码中

9o685dep  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(409)

我有一个uberjar,它执行一些级联etl任务。jar的执行方式如下:

hadoop jar munge-data.jar

我想在作业启动时将参数传递给jar,例如。

hadoop jar munge-data.jar -Denv=prod

不同的凭据、主机名等。。。将根据环境从属性文件中读取。
如果作业被执行,这将起作用 java jar munge-data.jar -Denv=prod ,自从 env 无法访问属性:

System.getProperty("env")

但是,当jar被执行时,这不起作用 hadoop jar ... .
我看到了一个类似的线程,其中应答者声明可以使用类似org.apache.hadoop.conf.configuration的类来访问属性。从答案上看,我不清楚 conf 对象被创建。我试了一下,结果它回来了 null :

Configuration configuration = new Configuration();
System.out.println(configuration.get("env"));

可能需要读取/设置配置属性。
你能告诉我怎样才能通过考试吗。 hadoop jar [...] -DsomeProperty=someValue ,进入我的etl工作?

dohp0rv5

dohp0rv51#

驱动程序类应实现允许您使用toolrunner运行mapreduce作业的工具接口:

public class MRDriver extends Configured implements Tool {
    @Override
    public int run(String[] args) throws Exception {
        /*...*/
    }
}

然后您就可以通过以下方式运行作业:

public static void main(String[] args) throws Exception {
    int res = ToolRunner.run(new MRDriver(), args);
    System.exit(res);
}

这意味着toolrunner解析的所有commannd行参数都将被转换为配置类的当前示例。
假设您使用以下命令从控制台运行作业:

hadoop jar munge-data.jar -Denv1=prod1 -Denv2=prod2

然后在 run() 方法可以从配置类获取所有参数:

public int run(String args[]) {
    Configuration conf = getConf();

    String env1 = conf.get("env1");
    String env2 = conf.get("env2");

    Job job = new Job(conf, "MR Job");
    job.setJarByClass(MRDriver.class);

    /*...*/
}
fnatzsnv

fnatzsnv2#

你可以用两种方式传递论点。使用-d选项或使用配置。但在实现工具接口时只能使用-d选项。如果没有,则必须通过conf.set设置配置变量。
使用-d传递参数:

hadoop jar example.jar com.example.driver -D property=value /input/path /output/path

使用配置传递参数:

Configuration conf=new Configuration();
conf.set("property","value");
Job job=new Job(conf);

注意:在初始化作业类之前,必须设置所有配置变量

相关问题