将hadoop参数传递到java代码中

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

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

  1. hadoop jar munge-data.jar

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

  1. hadoop jar munge-data.jar -Denv=prod

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

  1. System.getProperty("env")

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

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

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

dohp0rv5

dohp0rv51#

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

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

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

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

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

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

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

  1. public int run(String args[]) {
  2. Configuration conf = getConf();
  3. String env1 = conf.get("env1");
  4. String env2 = conf.get("env2");
  5. Job job = new Job(conf, "MR Job");
  6. job.setJarByClass(MRDriver.class);
  7. /*...*/
  8. }
展开查看全部
fnatzsnv

fnatzsnv2#

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

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

使用配置传递参数:

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

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

相关问题