從零自學Hadoop(08):第一個MapReduce

sinodzh發表於2015-10-08

閱讀目錄

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

文章是哥(mephisto)寫的,SourceLink

 

  上一篇,我們的Eclipse外掛搞定,那開始我們的MapReduce之旅。

  在這裡,我們先呼叫官方的wordcount例子,然後再手動建立個例子,這樣可以更好的理解Job。

資料準備

一:說明

  wordcount這個類是對不同的word進行統計個數,所以這裡我們得準備資料,當然也不需要很大的資料量,畢竟是自己做試驗對吧。

二:造資料

  開啟記事本,輸入各種word,有相同的,不同的。然後儲存為words_01.txt。

三:上傳

  開啟eclipse,然後在DFS location 中將我們準備的資料來源上傳到tmp/input。

  這樣我們的資料就準備好了。

wordcount

一:官網示例

  wordcount是hadoop的一個官網試例,打包在hadoop-mapreduce-examples-<ver>.jar。

  2.7.1版本的地址:http://hadoop.apache.org/docs/r2.7.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

二:找到示例

  我們在結果中看到兩個地方有,那就找個近一點的地方吧。

find / -name *hadoop-mapreduce-examples*

四:進入目錄

  我們選擇進入/usr/hdp/下面的這個例子。

cd /usr/hdp/2.3.0.0-2557/hadoop-mapreduce

五:執行

  我們先使用hadoop jar這個命令執行。

  命令說明:hadoop jar 包名稱 方法 輸入檔案/目錄 輸出目錄

#切換使用者
su hsfs
#執行
hadoop jar hadoop-mapreduce-examples-2.7.1.2.3.0.0-2557.jar wordcount /tmp/input/words_01.txt /tmp/output/1007_01

  命令執行結果

  外掛結果

  job頁面結果

  這樣我們的第一個job就這樣順利的執行完成了。

Yarn

一:介紹

  Hadoop2.X和Hadoop1.X有兩個最大的變化,也是根本性變化。

  其中一個是Namenode的單點問題解決,然後就是Yarn的引入。在這裡我們就不做展開的講了,後面會安排章節進行講述。

二:Yarn命令

  如果仔細看的話,我們可以發現在上面hadoop jar這個命令執行後,會有一個警告。

yarn jar hadoop-mapreduce-examples-2.7.1.2.3.0.0-2557.jar wordcount /tmp/input/words_01.txt /tmp/output/1007_02

新建MapReduce

一:通過外掛新建工程

  這裡就不詳說了,在上一篇我們通過外掛建立了一個工程,我們直接使用那個工程“com.first”。

二:新建WordCountEx類

  這個是我們的自定義的wordcount類,仿照官網例子寫的,做了點DIY,方便大家理解。

  完成後

三:新建Mapper

  在WordCountEx類中建一個內部類MyMapper。

  在這裡我們做了點DIY,排除了字母長度小於5的資料,方便大家對比理解程式。

static class MyMapper extends Mapper<Object, Text, Text, IntWritable> {

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

        @Override
        protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
                throws IOException, InterruptedException {

            // 分割字串
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                // 排除字母少於5個的
                String tmp = itr.nextToken();
                if (tmp.length() < 5)
                    continue;
                word.set(tmp);
                context.write(word, one);
            }
        }

    }
View Code

四:新建Reduce

  同上,我們將map的結果乘以2,然後輸出的內容的key加了個字首。

static class MyReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
        private Text keyEx = new Text();

        @Override
        protected void reduce(Text key, Iterable<IntWritable> values,
                Reducer<Text, IntWritable, Text, IntWritable>.Context context)
                        throws IOException, InterruptedException {

            int sum = 0;
            for (IntWritable val : values) {
                // 將map的結果放大,乘以2
                sum += val.get() * 2;
            }
            result.set(sum);
            // 自定義輸出key
            keyEx.set("輸出:" + key.toString());
            context.write(keyEx, result);
        }

    }
View Code

五:新建Main

  在main方法中我們得定義一個job,配置它。

    public static void main(String[] args) throws Exception {

        //配置資訊
        Configuration conf = new Configuration();
        
        //job名稱
        Job job = Job.getInstance(conf, "mywordcount");
        
        job.setJarByClass(WordCountEx.class);
        job.setMapperClass(MyMapper.class);
        // job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(MyReduce.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        
        //輸入、輸出path
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        
        //結束
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
View Code

六:匯出jar包

  匯出我們寫好的jar包。命名為com.first.jar

七:放入Linux

  將匯出的jar包放到H31的/var/tmp下

cd /var/tmp
ls

八:執行

  大家仔細看下命令和結果會發現有什麼不同

yarn jar com.first.jar  /tmp/input/words_01.txt /tmp/output/1007_03

   如果是仔細看了,發現少個wordcount對吧,為什麼列,因為在匯出jar包的時候制定的main函式。

九:匯出不指定main入口的jar包

  我們在匯出的時候,不指定main的入口。

十:執行2

  我們發現這裡就得多帶一個引數了,就是方法的入口,這裡得全路徑。

 yarn jar com.first.jar com.first.WordCountEx /tmp/input/words_01.txt /tmp/output/1007_04

十一:結果

  我們看下輸出的結果,可以明顯的看到少於5個長度的被排除了,而且結果的count都乘以了2。字首亂碼的不要糾結了,換個編碼方式就好了。

 

--------------------------------------------------------------------

  到此,本章節的內容講述完畢。

示例下載

 Github:https://github.com/sinodzh/HadoopExample/tree/master/2015/com.first

系列索引

  【源】從零自學Hadoop系列索引

 

 

 

 

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

文章是哥(mephisto)寫的,SourceLink

 

相關文章