解决Hadoop jar *.jar 主类名 -libjars *.jar *.jar arg1 arg2 ... 中-libjars的方法

problem:

(1)hadoop 依赖多个jar包,在-libjars后面一个个写太麻烦。

(2)程序无法解析出-libjars.

解决方案

(1)如果程序依赖多个第三方jar包,可以用python 或 shell 写一个脚本文件便利一个文件夹下的jar 包,以下是用python写的例子。

import os
root = "/home/fei/Downloads/code/fullsync/bin/"
for i in os.listdir(root):
    if os.path.isfile(os.path.join(root,i)):
        print os.path.join(root,i)

(2)让主函数识别 -libjars 的两种方法

public class WordCount {
    // 略...
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf, 
                                            args).getRemainingArgs();
        // 略...
        Job job = new Job(conf, "word count");
        // 略...
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}




WordCount.java中使用到了GenericOptionsParser这个类,它的作用是将命令行中参数自动设置到变量conf中。举个例子,比如我希望通过命令行设置reduce task数量,就这么写:


bin/hadoop jar MyJob.jar com.xxx.MyJobDriver -Dmapred.reduce.tasks=5


上面这样就可以了,不需要将其硬编码到java代码中,很轻松就可以将参数与代码分离开。


其它常用的参数还有”-libjars”和-“files”,使用方法一起送上:


bin/hadoop jar MyJob.jar com.xxx.MyJobDriver -Dmapred.reduce.tasks=5 \ 
    -files ./dict.conf  \
    -libjars lib/commons-beanutils-1.8.3.jar,lib/commons-digester-2.1.jar


参数”-libjars”的作用是上传本地jar包到HDFS中MapReduce临时目录并将其设置到map和reduce task的classpath中;参数”-files”的作用是上传指定文件到HDFS中mapreduce临时目录,并允许map和reduce task读取到它。这两个配置参数其实都是通过DistributeCache来实现的。


至此,我们还没有说到ToolRunner,上面的代码我们使用了GenericOptionsParser帮我们解析命令行参数,编写ToolRunner的程序员更懒,它将 GenericOptionsParser调用隐藏到自身run方法,被自动执行了,修改后的代码变成了这样:


public class WordCount extends Configured implements Tool {


    @Override
    public int run(String[] arg0) throws Exception {
        Job job = new Job(getConf(), "word count");
        // 略...
        System.exit(job.waitForCompletion(true) ? 0 : 1);
        return 0;
    }


    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new WordCount(), args);
        System.exit(res);
    }
}




看看代码上有什么不同:


    让WordCount继承Configured并实现Tool接口。
    重写Tool接口的run方法,run方法不是static类型,这很好。
    在WordCount中我们将通过getConf()获取Configuration对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值