第一個MapReduce程式
1,Hadoop環境配置
1.1 下載執行介質
1.2 配置環境
2,建立一個Maven專案
3,MapReduce程式編寫
3.1 WCMapper類
3.2 WCReducer類
3.3 建立主方法執行MapReduce任務
1,Hadoop環境配置
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下載地址:
注意版本匹配性
解壓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
配置系統環境變數,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"View Codexsi: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>
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 1View Code