Hadoop應(yīng)用引用第三方j(luò)ar的幾種方式(二)

    接著上一篇《Hadoop應(yīng)用引用第三方j(luò)ar的幾種方式(一)》繼續(xù)寫(xiě)。。。。。。。

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供湯原企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站制作、網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為湯原眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

    簡(jiǎn)單來(lái)說(shuō),Hadoop引入第三方j(luò)ar包有以下幾種方式:

    • 一、把引用到的所有的第三方j(luò)ar包打到一個(gè)jar包內(nèi),形成一個(gè)超大包,像上一篇文章中提到的第二種引入jar之后打包的方式;

    • 二、把引用到的所有的第三方j(luò)ar包放到Hadoop的lib目錄下,需要Hadoop集群中的每個(gè)節(jié)點(diǎn)都要放;

    • 三、把jar包放在集群中固定的一臺(tái)機(jī)器上,使用libjars命令加載第三方j(luò)ar;

    • 四、把jar包放在HDFS上,動(dòng)態(tài)加載第三方j(luò)ar包。

    

    接下來(lái)對(duì)這幾種方式的優(yōu)缺點(diǎn),說(shuō)一下我個(gè)人的見(jiàn)解:

    

    一、把引用到的所有的第三方j(luò)ar包打到一個(gè)jar包內(nèi)

    優(yōu)點(diǎn):在hadoop集群上可以直接運(yùn)行,運(yùn)行命令也是比較簡(jiǎn)單;

    缺點(diǎn):把所以的jar包放在一起,文件過(guò)大,考慮到加入升級(jí)版本的話,引用的第三方j(luò)ar文件一般不會(huì)發(fā)生變化,這種打包方式每次都要把第三方j(luò)ar文件打包在一起上傳。

    這種打包方式在上一篇文章中《Hadoop應(yīng)用引用第三方j(luò)ar的幾種方式(一)》已經(jīng)進(jìn)行了演示和說(shuō)明,個(gè)人不太建議這種方式。

    二、把引用到的所有的第三方j(luò)ar包放到Hadoop的lib目錄下

    優(yōu)點(diǎn):在hadoop集群上可以直接運(yùn)行,運(yùn)行命令也是比較簡(jiǎn)單;

    缺點(diǎn):集群中的每個(gè)節(jié)點(diǎn)下都需要放置第三方j(luò)ar,缺一不可,不夠靈活,當(dāng)版本升級(jí)的時(shí)候,需要對(duì)每一臺(tái)機(jī)器上的jar包進(jìn)行維護(hù),不太容易進(jìn)行維護(hù)。

    對(duì)于這種方式,我沒(méi)有進(jìn)行實(shí)驗(yàn),理論上來(lái)說(shuō)是可行的,個(gè)人不太建議這種方式。

    

    三、把jar包放在集群中固定的一臺(tái)機(jī)器上,使用libjars命令加載第三方j(luò)ar

    優(yōu)點(diǎn):只需要維護(hù)hadoop集群中的一臺(tái)機(jī)器上的lib庫(kù),易于系統(tǒng)的維護(hù);

    缺點(diǎn):只能在存放jar的機(jī)器上去執(zhí)行hadoop jar 命令執(zhí)行程序,且執(zhí)行命令較復(fù)雜;

    個(gè)人對(duì)這種方式還可以接受,不過(guò)并不是我最喜歡的方式。

    在這里,我進(jìn)行了測(cè)試,WordCount的代碼不變,打成WordCount_libjarscmd.jar,注意在打包的過(guò)程中不要選擇lib中的jar文件,然后把OperateHDFS.jar放到集群中的一臺(tái)機(jī)器上面,執(zhí)行的命令如下所示:

hadoop jar WordCount_libjarscmd.jar com.hadoop.examples.WordCount -libjars OperateHDFS.jar input libjarscmdoutput

    該命令的格式如下:

hadoop jar 要執(zhí)行的jar 要執(zhí)行的Class -libjars 第三方j(luò)ar的目錄 最后是程序要求的輸入輸出參數(shù)

    程序的執(zhí)行結(jié)果是ok,可以執(zhí)行,沒(méi)有問(wèn)題,結(jié)果如下所示:

Hadoop應(yīng)用引用第三方j(luò)ar的幾種方式(二)    

    四、把jar包放在HDFS上,動(dòng)態(tài)加載第三方j(luò)ar包

    優(yōu)點(diǎn):程序可以方便的在集群上的任何一個(gè)節(jié)點(diǎn)運(yùn)行,且執(zhí)行命令的機(jī)器沒(méi)有限制;

    缺點(diǎn):需要在程序中編寫(xiě)代碼添加第三方j(luò)ar,如果存放lib的目錄發(fā)生了變化,那就只能改代碼了。。。。

    個(gè)人比較喜歡這種方式,畢竟存放lib的目錄一般不會(huì)發(fā)生變化,我是這么認(rèn)為的,(*^__^*) 嘻嘻……

    

    在這里,我對(duì)這種方式進(jìn)行了測(cè)試,需要先把OperateHDFS.jar存放在HDFS上面,然后對(duì)WordCount稍作修改,增加動(dòng)態(tài)的添加第三方j(luò)ar的代碼塊,然后打成jar包WordCount_dynamicload.jar,注意在打包的過(guò)程中不要選擇lib中的jar文件,執(zhí)行的命令如下所示:

hadoop jar WordCount_dynamicload.jar com.hadoop.examples.WordCount input dynamicload

    

    程序的執(zhí)行結(jié)果是ok,可以執(zhí)行,沒(méi)有問(wèn)題,結(jié)果如下所示:

Hadoop應(yīng)用引用第三方j(luò)ar的幾種方式(二)

    下面把WordCount源代碼貼出來(lái):

package com.hadoop.examples;
import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

import com.hadoop.hdfs.OperateHDFS;

public class WordCount {

    public static class TokenizerMapper extends
            Mapper<Object, Text, Text, IntWritable> {

        private final static IntWritable one = new IntWritable(1);

        private Text word = new Text();

        public void map(Object key, Text value, Context context)
                throws IOException, InterruptedException {
            
            //它什么都不做,就是為了測(cè)試引入第三方j(luò)ar的,如果找不到,肯定就會(huì)報(bào)ClassNotFound異常
            OperateHDFS s = new OperateHDFS();
            
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer extends
            Reducer<Text, IntWritable, Text, IntWritable> {

        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values,
                Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        
        String[] otherArgs =
                new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
        Job job = new Job(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        
        /**
         * 其實(shí)我是做過(guò)測(cè)試的,把這個(gè)目錄寫(xiě)成本地目錄也可以的,
         * 就是第三種方式,不使用libjars命令加載,而是采用程序動(dòng)態(tài)加載
         * 但是這樣的話,就只能在固定的機(jī)器上執(zhí)行命令,運(yùn)行程序了,和第三種方式一樣
         */
        //只有做第四種方式的時(shí)候,才需要把它打開(kāi),前三種方式,需要把它注釋掉
        //job.addFileToClassPath(new Path("hdfs://192.168.3.57:8020/user/lxy/lib/OperateHDFS.jar"));
        for (int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        FileOutputFormat.setOutputPath(job, new Path(
                otherArgs[otherArgs.length - 1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1); 
    }
}

附件:http://down.51cto.com/data/2365541

當(dāng)前文章:Hadoop應(yīng)用引用第三方j(luò)ar的幾種方式(二)
文章轉(zhuǎn)載:http://muchs.cn/article22/iejdjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、服務(wù)器托管、品牌網(wǎng)站制作網(wǎng)站維護(hù)、網(wǎng)站策劃、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)