中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hadoop應用引用第三方jar的幾種方式(一)

發布時間:2020-04-13 21:58:04 來源:網絡 閱讀:6047 作者:艾斯的夢想 欄目:大數據

    雖然我們可以在Eclipse下面開發Hadoop應用程序,但是當我們引用了第三方jar文件的時候,把我們編寫的程序打成jar包之后,如何能夠在Hadoop集群下面運行,是一個我們在程序開發的過程中必須要解決的一個問題,通過搜索資料,在這里把幾種可行的解決方案在這里總結一下。

    

    本來打算也一篇的,可是寫到后來,發現我太啰嗦了,寫的有點太細了,決定分開來寫,寫成兩篇好了。。。。

    第一篇:主要寫Eclipse下面引入第三方jar,以及打包在集群上運行。

    第二篇:主要寫Hadoop應用程序如何引入第三方jar,以及對生產環境下應該怎么去引入第三方jar的個人見解,文章鏈接《Hadoop應用引用第三方jar的幾種方式(二)》

===========================================================================================

    在這里先說一下Eclipse下面引入第三方jar的方法,這和下面的打成jar包有關系,一般來說有兩種方法:一種方法是直接在本地磁盤的目錄下,然后引入;另一種方法是在Eclipse工程根目錄下面新建lib目錄,然后引入

    第一種引入方法

    在這里以Hadoop的提供的WordCount進行簡單的修改來進行測試。代碼如下:

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 {
            
            //它什么都不做,就是為了測試引入第三方jar的,如果找不到,肯定就會報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);
        
        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); 
    }
}

    

    我把一個jar包放在的D盤的mylib目錄下面,這個jar是上一篇文章《使用Hadoop提供的API操作HDFS》中的類打成的jar包

Hadoop應用引用第三方jar的幾種方式(一)

    在工程右鍵Build Path==》Configure Build Path==》Add External JARs,找到上面目錄下的jar文件,即可引入。此時如果在Eclipse下運行WordCount類,程序正確執行,沒有問題。

    此時對整個工程打包的時候,你可以看到,打包的時候是沒有機會選擇引入的第三方jar包的,只能選擇要打包的類,這里只選擇了一個WordCount,打包過程如下所示

Hadoop應用引用第三方jar的幾種方式(一)

    此時在Hadoop集群上面運行WordCount_dlib.jar,通過下面的命令運行:

    hadoop jar WordCount_dlib.jar com.hadoop.examples.WordCount input outputdlib

    不出意外,程序報ClassNotFound異常,結果如下所示

Hadoop應用引用第三方jar的幾種方式(一)

    第二種引入方法

    在項目的根目錄(如果不是根目錄,我沒有進行測試是否可行)下新建lib目錄(在工程上右鍵,新建文件夾),名字只能是lib,你換成其他的名字,它不會自動加載的。把上面的jar放到lib下面,然后在工程右鍵Build Path==》Configure Build Path==》Add JARs,找到工程目錄lib下的jar文件,即可引入。此時如果在Eclipse下運行WordCount類,程序正確執行,沒有問題。

Hadoop應用引用第三方jar的幾種方式(一)    此時對整個工程打包的時候,你可以看到,打包的時候是可以選擇lib下的jar包的,也可以選擇要打包的類,這里只選擇了一個WordCount,打包過程如下所示

Hadoop應用引用第三方jar的幾種方式(一)

    此時在Hadoop集群上面運行WordCount_plib.jar,通過下面的命令運行:

    hadoop jar WordCount_plib.jar com.hadoop.examples.WordCount input outputplib

    程序可以正常運行,結果如下所示,

Hadoop應用引用第三方jar的幾種方式(一)


    為什么會這樣?就是因為WordCount_plib.jar內部有其使用到的jar,它能夠自動的加載它內部的lib目錄下面的jar。

    名字如果存放jar的名字不是lib的話,雖然你也可以該目錄下的jar文件一起打進入,但是它會報ClassNotFound的異常,我把lib的名稱改成了mylib重新打成WordCount_mylib.jar,進行了測試運行,運行結果如下所示:

Hadoop應用引用第三方jar的幾種方式(一)    

    這就是我上面為什么強調,工程的根目錄下,一定只能叫做lib才可以的原因。


    文章中所涉及到的四個jar文件,我會以附件的放上來的。附件中的文件列表說明:

引入的第三方jar文件:OperateHDFS.jar

第一種方式引入jar包,打成的jar文件:WordCount_dlib.jar

第二種方式引入jar包,打成的jar文件:WordCount_plib.jar

第二種方式引入jar包,但是目錄名稱不叫做lib,叫做mylib,打成的jar文件WordCount_mylib.jar

    文章太長了,剩下的部分再下一篇寫。。。。。

附件:http://down.51cto.com/data/2365539
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巫溪县| 新河县| 宁海县| 江川县| 沙坪坝区| 琼结县| 博客| 双桥区| 汨罗市| 蛟河市| 甘孜县| 铁岭县| 剑川县| 临澧县| 宁强县| 方正县| 佛冈县| 和田市| 海宁市| 泸溪县| 佛坪县| 西吉县| 桦川县| 恩施市| 汉源县| 奉节县| 卢氏县| 昭平县| 商丘市| 宁海县| 兰州市| 沁源县| 宜宾市| 南通市| 临夏县| 贺州市| 旌德县| 宜川县| 宜兴市| 龙里县| 花莲县|