開發環境
操作系統:Manjora Linux
開發軟件:Idea Ultimate 2018.3
Jdk開發環境:1.8(請儘量不要使用超過9以上的,如果環境不是1.8請修改pom.xml裏面的toos.jar的版本)
Maven版本:maven3.3.9
開發注意事項
- 儘量在Linux或MacOs操作系統上開發,Windows上有可能會出現權限問題
- Jdk環境如果不是1.8的話請務必記得修改pom.xml裏面tools.jar的版本號
idea只有Ultimate版本中才會自動集成這些插件,如果是社區版,操作會和本博客區別很大
項目代碼
項目文件
1. 項目源代碼
- WordCount.java
package cn.org.cerambycidae.Hadoop.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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.util.StringTokenizer;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
2. 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>
<groupId>cn.org.cerambycidae</groupId>
<artifactId>USCHadoop</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 集中定義版本號 -->
<properties>
<hadoop.version>3.2.0</hadoop.version>
<hadoop-core.version>1.2.1</hadoop-core.version>
<!-- 使用jdk1.8啓動,設置字符集解析爲UTF-8 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 導入hadoop依賴環境 -->
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>${hadoop-core.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- 導入jar tools包,java環境僅限於1.8 -->
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<!-- 如果jdk版本非1.8請自行修改對應的版本 -->
<version>1.8</version>
<scope>system</scope>
<systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
</dependencies>
<!-- 導入apache鏡像原 -->
<repositories>
<repository>
<id>apache</id>
<url>http://maven.apache.org</url>
</repository>
</repositories>
</project>
- pom.xml文件中導入的包
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>${hadoop-core.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
- 因爲hadoop-common導入包的時候tools.jar依賴maven倉庫不知道爲啥沒了,所以從本地環境中導入
<!-- 導入jar tools包,java環境僅限於1.8 -->
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<!-- 如果jdk版本非1.8請自行修改對應的版本 -->
<version>1.8</version>
<scope>system</scope>
<systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
3. 執行的測試文件
- test.txt
Hello World
My name is Kezhou Liu.
I majored in software engineering in University Of South China.
4. 項目文件結構
- 注意test.txt是放在
和src同級目錄的input
文件夾下 - WordCount.java放在src/java文件夾下即可,包名可以自命名
項目創建流程
1. 創建一個Maven項目
- 選擇file->new->madule
- 將jdk環境調成本地配置的默認環境(我這裏是1.8
最好是1.8)
- 正常的填好maven項目的基礎信息後一路next
2. 創建項目文件
- 創建input文件夾(
和src文件夾是同級目錄
)和WordCount.java
- 配置input文件夾屬性,設置Input爲source
- 設置項目運行環境爲1.8
- 選擇file->setting或ctrl+alt+s
3. 配置項目運行參數
- 直接選擇右上角的Add Configuration
也可以選擇菜單欄的run->Edit Configuration
- 選擇添加Application項目
- 配置Application的主函數參數
這裏請務必務必添加上執行參數 input/ output/ 不然運行會報錯
4. 測試開發環境
- 運行項目
- 在自動生成的output中查看輸出文件內容
5. 對項目進行打包
- 可以直接在右側的maven選項欄中選擇直接對maven打包
也可以手動輸入maven的打包指令
- 在生成的target文件夾中可以查看打包成功的Jar包