java+hadoop配置参数_将Hadoop参数传递给Java代码

我有一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值