我有一个Uber jar执行一些级联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时,这不起作用….
我看到了一个similar thread,其中回答者声明可以使用类似于org.apache.hadoop.conf.Configuration类的方法访问属性.从答案中我不清楚如何创建conf对象.我尝试了以下内容并返回null:
Configuration configuration = new Configuration();
System.out.println(configuration.get("env"));
据推测,需要读取/设置配置属性.
你能告诉我如何传递属性,例如hadoop jar […] -DsomeProperty = someValue,进入我的ETL工作?
解决方法:
驱动程序类应该实现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将所有的commannd行参数解析为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);
/*...*/
}
标签:java,hadoop,jar
来源: https://codeday.me/bug/20190722/1503999.html