文章目錄
-
-
- 一、需求分析
- 二、環境準備
- 三、編寫程式
- 四、本地測試
- 五、叢集測試
-
一、需求分析
-
需求
在給定的文本檔案中統計輸出每一個單詞出現的總次數
- 按照
程式設計規範,編寫MapReduce
(1)将Mapper
傳給我們的文本内容先轉換成MapTask
String
(2)根據空格将這一行切分成單詞
(3)将單詞輸出為
格式<k,v>
- 按照
程式設計規範,編寫MapReduce
(1)彙總各個Reducer
key
的個數
(2)輸出該
的總次數key
- 按照
程式設計規範,編寫MapReduce
(1)擷取配置資訊,擷取Driver
job
對象執行個體
(2)指定本程式的
jar
包所在的本地路徑
(3)關聯
MapReducer
業務類
(4)指定Mapper輸出資料的
<k,v>
類型
(5)指定最終輸出資料的
<k,v>
類型
(6)指定
job
的輸入原始檔案所在目錄
(7)指定
job
的輸出結果所在目錄
(8)送出作業
二、環境準備
- 建立一個名為
的mrWordCount
工程Maven
- 在
檔案中添加如下依賴pom.xml
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.2</version> </dependency> </dependencies>
- 在項目的
目錄下,建立一個檔案,命名為src/main/resources
,在檔案中填入log4j.properties
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
三、編寫程式
本文使用idea進行相關操作:
- 建立包名:
com.easysir.wordcount
- 建立
類WordcountMapper
package com.easysir.wordcount; 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; // 其中LongWritable類型為輸入資料行的偏移量 public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { Text k = new Text(); IntWritable v = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 1 擷取一行 String line = value.toString(); // 2 按空格切割 String[] words = line.split(" "); // 3 輸出結果 for (String word : words) { k.set(word); context.write(k, v); } } }
- 建立
類WordcountReducer
package com.easysir.wordcount; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { int sum; IntWritable v = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException { // 1 累加求和 sum = 0; for (IntWritable count : values) { sum += count.get(); } // 2 輸出 v.set(sum); context.write(key,v); } }
- 建立
類WordcountDriver
package com.easysir.wordcount; import org.apache.hadoop.conf.Configuration; 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; import java.io.IOException; public class WordcountDriver { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { // 1 擷取配置資訊以及封裝任務 Configuration configuration = new Configuration(); Job job = Job.getInstance(configuration); // 2 設定jar加載路徑 job.setJarByClass(WordcountDriver.class); // 3 設定map和reduce類 job.setMapperClass(WordcountMapper.class); job.setReducerClass(WordcountReducer.class); // 4 設定map輸出 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); // 5 設定最終輸出kv類型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 6 設定輸入和輸出路徑 FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // 7 送出 boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1); } }
四、本地測試
-
填寫路徑參數
注意:輸出路徑檔案夾不能為已存在的檔案夾,否則會報錯
【Hadoop學習之MapReduce】_16MR之WordCount案例實操 【Hadoop學習之MapReduce】_16MR之WordCount案例實操 - 運作程式
【Hadoop學習之MapReduce】_16MR之WordCount案例實操 - 檢視結果
【Hadoop學習之MapReduce】_16MR之WordCount案例實操 easysir 2 haha 2 heihei 1 hello 2 nihao 1 wanghu 1
五、叢集測試
- 添加Maven打包插件依賴,注意修改
路徑WordcountDriver
<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin </artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.easysir.wordcount.WordcountDriver</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 将程式打成jar包
【Hadoop學習之MapReduce】_16MR之WordCount案例實操 - 将jar包拷貝到
叢集中,選擇無依賴jar包Hadoop
- 啟動
叢集Hadoop
- 執行
程式WordCount
# hadoop jar jar包 啟動類 輸入路徑 輸出路徑 hadoop jar ./mrWordCount-1.0-SNAPSHOT.jar com.easysir.wordcount.WordcountDriver /2020 /output
- 檢視結果
hadoop fs -cat /output/part-r-00000