1. 程式人生 > 實用技巧 >第一個MapReduce程式

第一個MapReduce程式

1,Hadoop環境配置

1.1 下載執行介質

1.2 配置環境

2,建立一個Maven專案

3,MapReduce程式編寫

3.1 WCMapper類

3.2 WCReducer類

3.3 建立主方法執行MapReduce任務


1,Hadoop環境配置

1.1 下載執行介質

windows環境執行MapReduce程式,需要下載Hadoop和winutils

Hadoop下載地址是:https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz

Hadoop在Windows環境執行需要的動態庫winutils下載地址:

https://github.com/steveloughran/winutils/archive/master.zip

注意版本匹配性

1.2 配置環境

解壓hadoop-3.3.0.tar.gz壓縮包,這裡我將壓縮包解壓到D:\Apache\hadoop(這個目錄很重要,後面的操作都是基於這個目錄)目錄下

解壓動態庫winutils-master.zip,這裡我將壓縮包解壓到D:\Apache\hadoop目錄下

D:\Apache\hadoop\winutils-master\hadoop-3.0.0\bin\hadoop.dll檔案複製到C:\Windows\system32目錄下

D:\Apache\hadoop\winutils-master\hadoop-3.0.0\bin\winutils.exe

檔案複製到D:\Apache\hadoop\hadoop-3.3.0\bin目錄下

配置系統環境變數,HADOOP_HOME為D:\Apache\hadoop\hadoop-3.3.0

在Path環境變數中新增一項%HADOOP_HOME%\bin

2,建立一個Maven專案

建立一個Maven專案,pom.xml檔案如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>net.sunmonkey</groupId> <artifactId>hadoop-demo</artifactId> <version>1.0</version> </parent> <artifactId>mapreduce-demo</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>3.3.0</version> </dependency> </dependencies> <build> <finalName>mapreduce-demo</finalName> </build> </project>
View Code

3,MapReduce程式編寫

使用MapReduce來統計文字中的每個單詞出現的個數,Word Count,這裡就不是hello world了。

建立檔案D:\Apache\hadoop\data\test.txt,內容如下

hello world tom
hello tom world
tom hello world
how are you
View Code

3.1 WCMapper類

編寫一個WCMapper類並且繼承org.apache.hadoop.mapreduce.Mapper就可以,具體實現如下

package net.sunmonkey.mapreduce.mapper;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class WCMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        Text keyOut = new Text();
        IntWritable valueOut = new IntWritable();

        String[] arr = value.toString().split(" ");
        for(String str: arr){
            keyOut.set(str);
            valueOut.set(1);
            context.write(keyOut, valueOut);
        }
    }
}
View Code

3.2 WCReducer類

編寫一個WCReducer類,並且繼承org.apache.hadoop.mapreduce.Reducer就可以,具體實現如下

package net.sunmonkey.mapreduce.reducer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class WCReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int count = 0;
        for(IntWritable intWritable: values){
            count += intWritable.get();
        }
        context.write(key, new IntWritable(count));
    }
}
View Code

3.3 建立主方法執行MapReduce任務

編寫一個WCApplication類,使用主方法提交一個MapReduce任務,具體實現如下。

執行該主方法的時候,需要設定兩個引數,第一個引數是統計單詞的文件文件的絕對路徑,這裡我們設定為D:\Apache\hadoop\data\test.txt;第二個引數是計算結果寫入的路徑,該路徑必須不存在,否則會報錯,這裡我們設定為D:\Apache\hadoop\data\result。

package net.sunmonkey.mapreduce;

import net.sunmonkey.mapreduce.mapper.WCMapper;
import net.sunmonkey.mapreduce.reducer.WCReducer;
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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class WCApplication {

    public static void main(String[] args) throws Exception {
        //建立該物件的時候,該配置物件會讀取hadoop包內的配置檔案,預設使用本地模式
        Configuration configuration = new Configuration();

        if(args.length == 2){
            FileSystem.get(configuration).delete(new Path(args[1]), false);
        }

        //獲取一個任務例項
        Job job = Job.getInstance(configuration);

        //設定任務名稱
        job.setJobName("WCApplication");
        //設定主方法類
        job.setJarByClass(WCApplication.class);

        //設定任務的輸入格式
        job.setInputFormatClass(TextInputFormat.class);

        //設定任務的輸出格式
        job.setOutputFormatClass(TextOutputFormat.class);

        //設定讀取的檔案輸入路徑
        TextInputFormat.addInputPath(job, new Path(args[0]));

        //設定計算結果輸出路徑,結果將以文字的方式輸出
        TextOutputFormat.setOutputPath(job, new Path(args[1]));

        //設定reduce任務個數
        job.setNumReduceTasks(1);

        //設定map類
        job.setMapperClass(WCMapper.class);
        //設定reduce類
        job.setReducerClass(WCReducer.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //提交任務並且等待任務完成
        job.waitForCompletion(true);

    }
}
View Code

執行主方法,即可在D:\Apache\hadoop\data\result目錄中看到MapReduce任務計算的結果。

在該目錄的part-r-00000檔案中即可看到計算結果,如下

are    1
hello    3
how    1
tom    3
world    3
you    1
View Code