91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-06-24 01:08:58 來源:網絡 閱讀:13655 作者:艾斯的夢想 欄目:大數據

    接著上一篇《Hadoop應用引用第三方jar的幾種方式(一)》繼續寫。。。。。。。


    簡單來說,Hadoop引入第三方jar包有以下幾種方式:

    • 一、把引用到的所有的第三方jar包打到一個jar包內,形成一個超大包,像上一篇文章中提到的第二種引入jar之后打包的方式;

    • 二、把引用到的所有的第三方jar包放到Hadoop的lib目錄下,需要Hadoop集群中的每個節點都要放;

    • 三、把jar包放在集群中固定的一臺機器上,使用libjars命令加載第三方jar;

    • 四、把jar包放在HDFS上,動態加載第三方jar包。

    

    接下來對這幾種方式的優缺點,說一下我個人的見解:

    

    一、把引用到的所有的第三方jar包打到一個jar包內

    優點:在hadoop集群上可以直接運行,運行命令也是比較簡單;

    缺點:把所以的jar包放在一起,文件過大,考慮到加入升級版本的話,引用的第三方jar文件一般不會發生變化,這種打包方式每次都要把第三方jar文件打包在一起上傳。

    這種打包方式在上一篇文章中《Hadoop應用引用第三方jar的幾種方式(一)》已經進行了演示和說明,個人不太建議這種方式。


    二、把引用到的所有的第三方jar包放到Hadoop的lib目錄下

    優點:在hadoop集群上可以直接運行,運行命令也是比較簡單;

    缺點:集群中的每個節點下都需要放置第三方jar,缺一不可,不夠靈活,當版本升級的時候,需要對每一臺機器上的jar包進行維護,不太容易進行維護。

    對于這種方式,我沒有進行實驗,理論上來說是可行的,個人不太建議這種方式。

    

    三、把jar包放在集群中固定的一臺機器上,使用libjars命令加載第三方jar

    優點:只需要維護hadoop集群中的一臺機器上的lib庫,易于系統的維護;

    缺點:只能在存放jar的機器上去執行hadoop jar 命令執行程序,且執行命令較復雜;

    個人對這種方式還可以接受,不過并不是我最喜歡的方式。

    在這里,我進行了測試,WordCount的代碼不變,打成WordCount_libjarscmd.jar,注意在打包的過程中不要選擇lib中的jar文件,然后把OperateHDFS.jar放到集群中的一臺機器上面,執行的命令如下所示:

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

    該命令的格式如下:

hadoop jar 要執行的jar 要執行的Class -libjars 第三方jar的目錄 最后是程序要求的輸入輸出參數

    程序的執行結果是ok,可以執行,沒有問題,結果如下所示:

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


    四、把jar包放在HDFS上,動態加載第三方jar包

    優點:程序可以方便的在集群上的任何一個節點運行,且執行命令的機器沒有限制;

    缺點:需要在程序中編寫代碼添加第三方jar,如果存放lib的目錄發生了變化,那就只能改代碼了。。。。

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

    

    在這里,我對這種方式進行了測試,需要先把OperateHDFS.jar存放在HDFS上面,然后對WordCount稍作修改,增加動態的添加第三方jar的代碼塊,然后打成jar包WordCount_dynamicload.jar,注意在打包的過程中不要選擇lib中的jar文件,執行的命令如下所示:

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

    

    程序的執行結果是ok,可以執行,沒有問題,結果如下所示:

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

    下面把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);
        
        /**
         * 其實我是做過測試的,把這個目錄寫成本地目錄也可以的,
         * 就是第三種方式,不使用libjars命令加載,而是采用程序動態加載
         * 但是這樣的話,就只能在固定的機器上執行命令,運行程序了,和第三種方式一樣
         */
        //只有做第四種方式的時候,才需要把它打開,前三種方式,需要把它注釋掉
        //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
向AI問一下細節

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

AI

青龙| 大港区| 芒康县| 凤庆县| 枞阳县| 民勤县| 鞍山市| 瓦房店市| 定结县| 新津县| 西乌珠穆沁旗| 绿春县| 长治县| 淮南市| 常宁市| 江北区| 武鸣县| 嘉黎县| 伽师县| 抚州市| 大庆市| 肥城市| 盐池县| 苍梧县| 武宣县| 南阳市| 渝北区| 长垣县| 茂名市| 万安县| 嘉善县| 尚义县| 师宗县| 肇庆市| 即墨市| 凤庆县| 容城县| 武宣县| 嘉荫县| 古蔺县| 灯塔市|