最近在开发mapreduce程序,输入有hdfs、hbase形式,输出有hdfs、mysql等形式。碰到了如何添加第三方依赖jar的问题,在网上查了很多资料,记录下来,免得再走弯路。
下面所有方法基于hadoop-1.0.1版本实现,其它版本可能略有不同。
总结了一下,总共有五种方法:
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
方法1和2的思想是一样的,都是把所有的依赖放入到一个jar包中。但这些方法不利于版本的维护,
不推荐使用。
方法3则需要配置集群中所有的node,而且也让hadoop本身依赖了第三方不相关的jar。
方法4必须由代码去控制第三方的jar依赖,也不利于依赖的管理。
方法5则没有上述问题,
推荐使用。
不过使用方法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/
分享到:
相关推荐
Hadoop 用mapreduce实现Wordcount实例,绝对能用
upon the widely used and highly successful Hadoop MapReduce v1. The recipes that will help you analyze large and complex datasets with next generation Hadoop MapReduce will provide you with the skills...
Hadoop MapReduce Cookbook 高清完整版PDF下载 Hadoop MapReduce Cookbook
Hadoop MapReduce v2 Cookbook (第二版), Packt Publishing
本书对Hadoop Mapreduce进行详细讲解,切合实际应用,能够更深入地学习MapReduce,确实是一本不错的书。
用MapReduce实现TF-IDF,Hadoop版本是2.7.7,参考某教程亲自手写的,可以运行,有问题可以留言
在hadoop平台上,用mapreduce编程实现大数据的词频统计
Java操作Hadoop Mapreduce基本实践源码.
本章介绍了 Hadoop MapReduce,同时发现它有以下缺点: 1、程序设计模式不容易使用,而且 Hadoop 的 Map Reduce API 太过低级,很难提高开发者的效率。 2、有运行效率问题,MapReduce 需要将中间产生的数据保存到...
基于Apriori算法的频繁项集Hadoop mapreduce
这本书都是实例,很接地气,多加练习和阅读,可稳步上升
MapReduce is the distribution system that the Hadoop MapReduce engine uses to distribute work around a cluster by working parallel on smaller data sets. It is useful in a wide range of applications, ...
赠送Maven依赖信息文件:hadoop-mapreduce-client-jobclient-2.6.5.pom; 包含翻译后的API文档:hadoop-mapreduce-client-jobclient-2.6.5-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.hadoop:hadoop...
基于Hadoop Mapreduce 实现酒店评价文本情感分析(python源码+项目说明).zip基于Hadoop Mapreduce 实现酒店评价文本情感分析(python源码+项目说明).zip基于Hadoop Mapreduce 实现酒店评价文本情感分析(python...
hadoop mapreduce helloworld 能调试 详细内容请看:http://blog.csdn.net/wild46cat/article/details/53641765
Hadoop mapreduce 实现KMeans,可用
Hadoop MapReduce.pdf
基于Hadoop Mapreduce 实现酒店评价文本情感分析(python开发源码+项目说明).zip基于Hadoop Mapreduce 实现酒店评价文本情感分析(python开发源码+项目说明).zip基于Hadoop Mapreduce 实现酒店评价文本情感分析...
Hadoop MapReduce v2 Cookbook, 2nd Edition-Packt Publishing(2015) 高清完整版PDF下载
[Packt Publishing] Hadoop MapReduce 经典实例 (英文版) [Packt Publishing] Hadoop MapReduce Cookbook (E-Book) ☆ 出版信息:☆ [作者信息] Srinath Perera, Thilina Gunarathne [出版机构] Packt ...