总结hadoop mapreduce job添加第三方依赖的方法

最近在开发mapreduce程序,输入有hdfs、hbase形式,输出有hdfs、mysql等形式。碰到了如何添加第三方依赖jar的问题,在网上查了很多资料,记录下来,免得再走弯路。

下面所有方法基于hadoop-1.0.1版本实现,其它版本可能略有不同。
总结了一下,总共有五种方法:
[list]
1、制作一个超级jar包,包含你的classes和所有依赖的第三方classes
2、和方法1差不多,只不过不是把依赖的第三方classes直接放入jar中,而是把第三方依赖的jar放在待提交jar包的lib目录下。
3、将jar包放在hadoop集群的各自node上,修改hadoop-env.sh中HADOOP_TASKTRACKER_OPTS 的值或者HADOOP_CLASSPATH。
4、将依赖的jar包拷贝事先到hdfs上,在代码中通过DistributedCache.addFileToClassPath方法,将其加入到依赖中。
5、使用hadoop jar的-libjars参数来设置第三方依赖的jar
[/list]
方法1和2的思想是一样的,都是把所有的依赖放入到一个jar包中。但这些方法不利于版本的维护,[b]不推荐使用[/b]。
方法3则需要配置集群中所有的node,而且也让hadoop本身依赖了第三方不相关的jar。
方法4必须由代码去控制第三方的jar依赖,也不利于依赖的管理。
方法5则没有上述问题,[b]推荐使用[/b]。
不过使用方法5有一些注意事项,否则你会发现即使设置了-libjars,还是找不到依赖的类。

方法5具体使用步骤:
1、提交jar参数设置
hadoop jar my-example.jar com.example.MyTool -libjars mysql-connector-java.jar,abc.jar

多个jar包间使用逗号分隔。

2、main函数的参数必须使用GenericOptionsParser解析。
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
....
}

或者通过ToolRunner.run去解析参数
public static void main(final String[] args) throws Exception {
Configuration conf = new Configuration();
int res = ToolRunner.run(new MyTool(), args);
System.exit(res);
}

public class MyTool extends Configured implements Tool {

public final int run(final String[] args) throws Exception {
Job job = new Job(super.getConf());
...
job.waitForCompletion(true);
return ...;
}

详细代码可以参照mapreduce内的examples。

实际上ToolRunner.run的内部也是调用了GenericOptionsParser去解析参数。跟踪源码就会发现GenericOptionsParser有这样的一段代码:
    if (line.hasOption("libjars")) {
conf.set("tmpjars",
validateFiles(line.getOptionValue("libjars"), conf));
//setting libjars in client classpath
URL[] libjars = getLibJars(conf);
if(libjars!=null && libjars.length>0) {
conf.setClassLoader(new URLClassLoader(libjars, conf.getClassLoader()));
Thread.currentThread().setContextClassLoader(
new URLClassLoader(libjars,
Thread.currentThread().getContextClassLoader()));
}
}

最终是往Configuration里设置了tmpjars的属性。

参考文献:
1、http://blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job/
2、http://grepalex.com/2013/02/25/hadoop-libjars/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值