MapReduce簡寫(略解)

解讀WordCount
WordCount程序就是MapReduce的HelloWord程序。通過對WordCount程序分析,我們可以瞭解MapReduce程序的基本結構和執行過程。

WordCount設計思路

WordCount程序很好的體現了MapReduce編程思想。
一般來說,文本作爲MapReduce的輸入,MapReduce會將文本進行切分處理並將行號作爲輸入鍵值對的鍵,文本內容作爲鍵值對的值,經map方法處理後,輸出中間結果爲<word,1>形式。MapReduce會默認按鍵值分發給reduce方法,在完成計數並輸出最後結果<word,count>
在這裏插入圖片描述
MapReduce運行方式
MapReduce運行方式分爲本地運行和服務端運行兩種。
本地運行多指本地Windows環境,方便開發調試。
而服務端運行,多用於實際生產環境。

hadoop本地安裝

下載hadoop-2.7.3.tar.gz,解壓縮。比如解壓縮到D盤
在這裏插入圖片描述hadoop根目錄就是D:\hadoop-2.7.3
配置環境變量
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
下載對應hadoop源代碼

hadoop-2.7.3-src.tar.gz
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
修改Hadoop源碼
注意,在Windows本地運行MapReduce程序時,需要修改Hadoop源碼。如果在Linux服務器運行,則不需要修改Hadoop源碼。

修改Hadoop源碼,其實就是簡單修改一下Hadoop的NativeIO類的源碼

下載對應hadoop源代碼,hadoop-2.7.3-src.tar.gz解壓,hadoop-2.7.3-src\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java 複製到對應的IDEA的project.
修改代碼
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
定義Mapper類
在這裏插入圖片描述
代碼說明:

Mapper類用於讀取數據輸入並執行map方法,編寫Mapper類需要繼承org.apache.hadoop.mapreduce.Mapper類,並且根據相應問題實現map方法。
Mapper類的4個泛型參數:前兩個表示map的輸入鍵值對的key和value的類型,後兩個表示輸出鍵值對的key和value的類型
MapReduce計算框架會將鍵值對作爲參數傳遞給map方法。該方法有3個參數,第1個是Object類型(一般使用LongWritable類型)參數,代表行號,第2個是Object類型參數(一般使用Text類型),代表該行內容,第3個Context參數,代表上下文。
Context類全名是org.apache.hadoop.mapreduce.Mapper.Context,也就是說Context類是Mapper類的靜態內容類,在Mapper類中可以直接使用Context類。
在map方法中使用StringUtils的split方法,按空格將輸入行內容分割成單詞,然後通過Context類的write方法將其作爲中間結果輸出。

定義Reducer類

在這裏插入圖片描述
代碼說明:

Reducer類用於接收Mapper輸出的中間結果作爲Reducer類的輸入,並執行reduce方法。
Reducer類的4個泛型參數:前2個代表reduce方法輸入的鍵值對類型(對應map輸出類型),後2個代表reduce方法輸出鍵值對的類型
reduce方法參數:key是單個單詞,values是對應單詞的計數值所組成的列表,Context類型是org.apache.hadoop.mapreduce.Reducer.Context,是Reducer的上下文。

定義主方法(主類)

package com.hadron.mr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class RunJob {
public static void main(String[] args) {
//設置環境變量HADOOP_USER_NAME,其值是root
System.setProperty(“HADOOP_USER_NAME”, “root”);
//Configuration類包含了Hadoop的配置
Configuration conf =new Configuration();
//設置fs.defaultFS
conf.set(“fs.defaultFS”, “hdfs://192.168.55.128:9000”);
//設置yarn.resourcemanager節點
conf.set(“yarn.resourcemanager.hostname”, “node1”);
try {
FileSystem fs =FileSystem.get(conf);
Job job =Job.getInstance(conf);
job.setJarByClass(RunJob.class);
job.setJobName(“wc”);
//設置Mapper類
job.setMapperClass(WordCountMapper.class);
//設置Reduce類
job.setReducerClass(WordCountReducer.class);
//設置reduce方法輸出key的類型
job.setOutputKeyClass(Text.class);
//設置reduce方法輸出value的類型
job.setOutputValueClass(IntWritable.class);
//指定輸入路徑

        FileInputFormat.addInputPath(job, new Path("/user/root/input/"));
        //指定輸出路徑(會自動創建)
        Path outpath=new Path("/user/root/output");
        //輸出路徑是MapReduce自動創建的,如果存在則需要先刪除
        if (fs.exists(outpath)){
            fs.delete(outpath,true);
        }
        FileOutputFormat.setOutputPath(job,outpath);
        boolean f=job.waitForCompletion(true);
        if (f) {
            System.out.println("job任務執行成功");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
hdfs 上 新建input目錄
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
本地運行

執行結果:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章