hadoop之旅6-windows本地MapReducer離線單詞統計

經過上篇文章hadoop之旅5-idea經過maven搭建hdfs環境,相信你們均可以在idea上作hadoop訪問hdfs文件系統的開發了。一個雲盤其實就能夠基於這樣的系統作出來。有興趣的你們能夠試着本身去實戰一下。java

今天帶你們在本地執行Mapreduce,進行單詞個數的統計,通常用於調試。線上模式也很簡單,只須要打好jar包,在線上服務經過 hadoop jar xxxx.jar 包名+類 命令執行便可,可自行探究

MapReduce

MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。他也屬於hadoop的核心組件之一,hdfs是一個分佈式文件系統,MapReduce就是一個分佈式計算框架。專門爲計算而生python

最簡單的流程圖c++

  1. 讀取文件
  2. map操做
  3. reduce操做
  4. 輸出結果文件

詳細過程圖spring

在map,reduce中間還有一系列,合併,排序等等過程,系統會將複雜的數據進行整理篩選,最終到達咱們須要用代碼編寫的業務端。咱們通常狀況作數據離線分析能夠只考慮編寫map端,reduce端便可。話很少說直接帶你們上代碼體會。

開始實現

1.首先

在準備好一個輸入文件input.txt,放在項目任意一個目錄下,我建的是SpringBoot項目放在resources下的map_input目錄下apache

c	2
c++	1
java	2
python	1
複製代碼

2.導入依賴

<properties>
	<hadoop.version>2.7.3</hadoop.version>
</properties>

<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-common</artifactId>
	<version>${hadoop.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-client</artifactId>	
	<version>${hadoop.version}</version>
</dependency>
<dependency>
        <groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-hdfs</artifactId>
	<version>${hadoop.version}</version>
</dependency>
複製代碼

3.準備本身map端

實現map端其實很簡單,只須要建立一個類繼承Mapper類,而後實現它的map方法便可。編程

public class MyMapper extends Mapper<Object, Text, Text, LongWritable> {
    /**
     *
     * @param key 當前行的標識(鍵),通常文件輸入能夠不用管
     * @param text 當前行的值
     * @param context 上下文內容
     * 文件內容:
     *  java,c++
     *  c,java
     *  python,c
     */
    @Override
    protected void map(Object key, Text text, Context context) throws IOException, InterruptedException {
        //拿到當前輸入的行內容
        String line = text.toString();
        //拆分當前行,如 java,c++
        String[] lines = line.split(",");
        for (String word : lines) {
            /**
             * 也就是在map端,把輸出置爲: java 1,c 1,c++ 1等
             */
            context.write(new Text(word),new LongWritable(1));
        }
    }
}
複製代碼

4.實現Reduce端

同理,繼承Reducer類,實現reduce方法便可windows

/**
 * 前兩個參數:reducer輸入參數,即map輸出的鍵,值集合(相同key的會整合在一塊兒)
 * 後兩個參數:reducer 輸出的鍵,值(即最終結果)
 * 在reduce裏作累加便可統計出每一個單詞的個數
 */
public class MyReduce extends Reducer<Text,LongWritable,Text,LongWritable>{
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        /**
         * key,values
         * 以map裏的輸出的鍵值:如:map裏輸出的是:
         * c:[1,1]也多是 c:[2] ,主要涉及MapReducer運行原理中的 分片合併 過程
         * c++:[1]
         * java:[1,1]也多是java:[2]
         * python:[1]
         */
        long sum = 0; //該單詞總共出現的次數
        for (LongWritable value : values) {
            sum+=value.get();
        }
        context.write(key,new LongWritable(sum)); //輸出結果:如,c:2,java:1...
    }
}
複製代碼

5. 實現客戶端代碼

調用代碼很常規,基本上都是同樣的模板springboot

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        //線上運行在hadoop集羣裏須要配置
        //conf.set("fs.defaultFS", "hdfs://master:9000/");//主master訪問路徑
        //conf.set("mapreduce.framework.name", "yarn"); //運行框架yarn
        //conf.set("yarn.resourcemanager.hostname", "master"); //設置主機
        Job job = Job.getInstance(conf); //拿到一個做業job,來執行mapReduce
        //設置運行的主類
        job.setJarByClass(MapReduceClient.class);
        job.setJobName("wordCount"); //設置應用名稱
        //設置輸入文件的位置
        FileInputFormat.addInputPaths(job,"J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_input");
        //設置輸出文件的位置
        FileOutputFormat.setOutputPath(job,new Path("J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_output"));
        //設置mapper類和reducer類
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(MyReduce.class);

        //設置輸入,輸出類型,map和reduce是同樣的話能夠只寫reducer的
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        //執行
        job.waitForCompletion(true);

    }
複製代碼

在本地運行有個要求,須要本地hadoop的bin目錄下擁有windows下的執行文件。你們能夠下好hadoop以後直接解壓,而後把windows執行包複製到bin目錄便可bash

最終的運行結果以下app

相關文章
相關標籤/搜索