【问题标题】:pass Hadoop arguments into Java code将 Hadoop 参数传递到 Java 代码中
【发布时间】:2015-10-09 22:29:09
【问题描述】:

我有一个执行一些级联 ETL 任务的 Uber jar。 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 ... 时,这不起作用。

我看到了similar thread,其中回答者指出可以使用类似于 org.apache.hadoop.conf.Configuration 的类来访问属性。从答案中我不清楚conf 对象是如何创建的。我尝试了以下方法,它返回了null

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

大概是需要读取/设置配置属性。

你能告诉我如何传递属性,例如hadoop jar [...] -DsomeProperty=someValue,加入我的 ETL 工作?

【问题讨论】:

    标签: java hadoop jar


    【解决方案1】:

    您可以通过两种方式传递参数。使用 -D 选项或使用配置。但是在实现 Tool 接口时只能使用 -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);
    

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

    【讨论】:

      【解决方案2】:

      Driver 类应该实现Tool 接口,它允许您使用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解析到当前的Configuration类实例。

      假设您使用以下命令从控制台运行作业:

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

      然后在run() 方法中,您可以从 Configuration 类中获取所有参数:

      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);
      
          /*...*/
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-27
        • 2015-12-25
        • 2012-04-18
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        相关资源
        最近更新 更多