使用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案例
- Hadoop MapReduce之wordcount(詞頻統計)Hadoop
- MapReduce(一):入門級程式wordcount及其分析
- HIVE實現wordcount過程Hive
- MapReduce 過程詳解 (用WordCount作為例子)
- mapreduce實現倒排索引索引
- 使用Go語言實現簡單MapReduce框架Go框架
- MapReduce原理及簡單實現
- 基於Python實現MapReducePython
- 使用Webcam實現拍照功能Web
- 使用Hive處理WordCountHive
- Storm實戰之WordCountORM
- MapReduce實現倒排索引(簡單思路)索引
- 使用 jQuery 實現分頁功能jQuery
- 使用redis實現互粉功能Redis
- 使用VB實現OLE拖放功能
- MapReduce框架-Join的使用框架
- 使用java實現希表的基礎功能Java
- 使用sql profile實現outline的功能SQL
- Mongodb MapReduce使用MongoDB
- Go使用websocket實現彈幕功能GoWeb
- Yii使用DbTarget實現日誌功能
- postgresql使用pgagent來實現job功能SQL
- 【小程式】使用UDP實現群聊功能UDP
- iOS中使用OpenGL 實現增高功能iOS
- 第02講:Flink 入門程式 WordCount 和 SQL 實現SQL
- 使用Redis的有序集合實現排行榜功能Redis
- 實現使用者的歷史記錄功能
- 使用 JavaScript 實現靈活的固定導航功能JavaScript
- 談談Hadoop MapReduce和Spark MR實現HadoopSpark
- 使用 iOS OpenGL ES 實現長腿功能iOS
- 如何使用Python 實現秒錶功能?Python
- 使用Go語言實現爬蟲功能Go爬蟲
- 使用vue實現grid-layout功能Vue
- 【OpenCV】使用floodfill()實現PhotoShop魔棒功能OpenCV
- .Net for Spark 實現 WordCount 應用及除錯入坑詳解Spark除錯