开发环境
操作系统: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包