使用IDEA+Maven實現MapReduce的WordCount功能
環境及工具要求:
(以筆者為例)
jdk 1.8(Windows環境下)
Maven 3.3.9(Windows環境下)
IDEA 2017+(Windows環境下)
WinScp(Windows環境下)
hadoop 2.7.3(Linux環境下)
一、配置IDEA的Maven
1.file—>new—>project
2.新視窗開啟
(注意修改IDEA預設的maven路徑)
修改pom.xml檔案
新增下列程式碼:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- main()所在的類,注意修改 -->
<mainClass>com.MyWordCount.WordCountMain</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
完成後如圖:
特別注意這裡,com.MyWordCount為包名,WordCountMain為主類名,在後續的新建Java類時,注意修改為自己所建立的。
二、建立Java檔案
1.新建包
2.新建 WordCountMapper.java
程式碼:
package com.MyWordCount;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
// 泛型 k1 v1 k2 v2
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
@Override
protected void map(LongWritable key1, Text value1, Context context)
throws IOException, InterruptedException {
//資料: I like MapReduce
String data = value1.toString();
//分詞:按空格來分詞
String[] words = data.split(" ");
//輸出 k2 v2
for(String w:words){
context.write(new Text(w), new IntWritable(1));
}
}
}
2.新建WordCountReducer.java
程式碼:
package com.MyWordCount;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
// k3 v3 k4 v4
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text k3, Iterable<IntWritable> v3,Context context) throws IOException, InterruptedException {
//對v3求和
int total = 0;
for(IntWritable v:v3){
total += v.get();
}
//輸出 k4 單詞 v4 頻率
context.write(k3, new IntWritable(total));
}
}
3.新建WordCountMain.java
程式碼:
package com.MyWordCount;
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;
public class WordCountMain {
public static void main(String[] args) throws Exception {
//1.建立一個job和任務入口
Job job = Job.getInstance(new Configuration());
job.setJarByClass(WordCountMain.class); //main方法所在的class
//2.指定job的mapper和輸出的型別<k2 v2>
job.setMapperClass(WordCountMapper.class);//指定Mapper類
job.setMapOutputKeyClass(Text.class); //k2的型別
job.setMapOutputValueClass(IntWritable.class); //v2的型別
//3.指定job的reducer和輸出的型別<k4 v4>
job.setReducerClass(WordCountReducer.class);//指定Reducer類
job.setOutputKeyClass(Text.class); //k4的型別
job.setOutputValueClass(IntWritable.class); //v4的型別
//4.指定job的輸入和輸出
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//5.執行job
job.waitForCompletion(true);
}
}
三、執行Maven命令打jar包
1.使用IDEA terminal 執行Maven命令
2.打包成功
3.重新整理target目錄
四、上傳jar包到配置有hadoop的Linux環境中
1.使用工具上傳(推薦使用WinScp)
五、執行MapReduce任務
1.首先檢視jar包是否上傳成功
2.在Linux的~目錄下新建一個ceshi.txt檔案,輸入測試內容
3.將檔案上傳至hdfs的根目錄下
檢視是否上傳成功:
hdfs dfs -ls /
4.執行MapReduce任務
輸入:
hadoop jar MyWordCount-1.0-SNAPSHOT.jar /ceshi.txt /ceshioutput
執行成功部分截圖
5.檢視執行命令後輸出的結果
命令:
hdfs dfs -cat /ceshioutput/part-r-00000
輸出結果完成了對文字中不同單詞出現次數的統計
六、小節
WordCount的需求可以概括為:對程式設計語言原始檔統計字元數、單詞數、行數,統計結果以指定格式輸出到預設檔案中,以及其他擴充套件功能,並能夠快速地處理多個檔案。
相關文章
- 使用MapReduce執行WordCount案例
- MapReduce 程式設計模型 & WordCount 示例程式設計模型
- MapReduce環境搭建以及WordCount案例
- 基於Python實現MapReducePython
- MapReduce原理及簡單實現
- MapReduce框架-Join的使用框架
- 第02講:Flink 入門程式 WordCount 和 SQL 實現SQL
- 使用redis實現互粉功能Redis
- 使用 jQuery 實現分頁功能jQuery
- WordCount
- 使用java實現希表的基礎功能Java
- 談談Hadoop MapReduce和Spark MR實現HadoopSpark
- Go使用websocket實現彈幕功能GoWeb
- Yii使用DbTarget實現日誌功能
- postgresql使用pgagent來實現job功能SQL
- 如何使用Python 實現秒錶功能?Python
- 使用Redis的有序集合實現排行榜功能Redis
- .Net for Spark 實現 WordCount 應用及除錯入坑詳解Spark除錯
- 使用 iOS OpenGL ES 實現長腿功能iOS
- SQL Azure使用Excel實現BI功能:PowerPivotTWSQLExcel
- vuejs2.0使用Sortable.js實現的拖拽功能VueJS
- 新增使用者的發帖功能怎麼實現
- Hadoop的mapreduce出現問題,報錯The auxService:mapreduce_shuffle does not existHadoopUX
- Hadoop(三)通過C#/python實現Hadoop MapReduceHadoopC#Python
- 分頁功能的實現
- 一起來實現單使用者登入 —— 功能實現
- springboot整合FastDFS使用實現防盜鏈功能Spring BootAST
- 使用Spring Boot實現檔案上傳功能Spring Boot
- 使用 HTML5 Canvas 實現簽名功能HTMLCanvas
- springboot整合ElasticSearch使用completion實現補全功能Spring BootElasticsearch
- Java Web實現使用者登入功能JavaWeb
- Prism+WPF使用DependencyInjection實現AutoMapper的依賴注入功能APP依賴注入
- Nancy之實現API的功能NaNAPI
- vuejs 實現jq 克隆的功能VueJS
- 載入更多 功能的實現
- 使用Elasticsearch實現Spring Boot的自動完成功能 -Milos BiljanovicElasticsearchSpring Boot
- 使用APICloud AVM多端元件快速實現app中的搜尋功能APICloud元件APP
- Kubernetes 使用 Ingress-nginx 實現灰度釋出功能Nginx