要想让MR程序引用第三方jar文件, 可以采用如下方式:
1、通过命令行参数传递jar文件 -libjars;
脚本代码样例:
export HADOOP_CLASSPATH="thirdpartlib_1.jar,thirdpartlib_2.jar ..."
hadoop jar application.jar \
-libjars "thirdpartlib_1.jar,thirdpartlib_2.jar ..." \
com.test.Main" \
param1, param2 ...
注意1: 必须保证 “-libjars” 在 “hadoop jar application.jar” 后面 并且在 “param1, param1 …” 前面!如果在 “param1, param2 …” 后面,则会被当做 param 处理
注意2: 此种方法会配置文件放到application.jar的同级目录
MR代码样例:
//方法1//
Configuration conf = new Configuration();
String[] userparams = new GenericOptionsParser(conf, args).getRemainingArgs();
Job job = Job.getInstance(conf);
System.exit(job.waitForCompletion(true) ? 0 : 1)
//方法2//
public class ApplicationDriver extends Configured implements Tool {
//设定并读取应用程序相关的,自己定义的一些参数
public int run(String[] args) throws Exception {
if(args.length < 2) {
printUsage();
return 2;
}
Job job = new Job(getConf());
//process business logic ...
return job.waitForCompletion(true) ? 0 : 1;
}
//真正的main函数
public static void main(String[] args) throws Exception{
int res = ToolRunner.run(new Configuration(), new ApplicationDriver(), args);
System.exit(res);
}
}
原理:
-files:Hadoop 将指定的本地/hdfs上的文件通过HDFS分发到各个Task的工作目录下,不对文件进行任何处理
-libjars:Hadoop 将指定的本地/hdfs上的jar包通过HDFS分发到各个Task的工作目录下,并将其自动添加到任务的CLASSPATH环境变量中
原理是基于 Hadoop 的 DistributedCache,详解见如下链接: http://dongxicheng.org/mapreduce-nextgen/hadoop-distributedcache-details/
2、利用分布式缓存, 如DistributedCache.addArchiveToClassPath(path, job), 此处的path必须是hdfs, 即自己讲jar上传到hdfs上, 然后将路径加入到分布式缓存中
job.addCacheFile(new Path("hdfs:///user/xxx/xxx.txt").toUri());
3、第三方jar文件和自己的程序打包到一个jar文件中, 程序通过job.getJar()将获得整个文件并将其传至hdfs上. (很笨重)
在每台机器的$HADOOP_HOME/lib目录中加入jar文件. (不推荐)