MR添加第三方依赖包jar

要想让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文件. (不推荐)

猜你喜欢

转载自blog.csdn.net/u010010664/article/details/80415995