学习MapReduce程序开发,入门的第一个Demo就是WordCount。因此,分析WordCount数据处理的过程(非常、非常、非常重要)。下图是:分析WordCount数据处理的过程。
WordCount数据处理过程:
开发WordCount程序:
项目结构:
WordCountMapper.java
package com.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;
// 实现Map的功能
// k1 v1 k2 v2
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
@Override
protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
/**
* context :Map的上下文
* 上文 :HDFS
* 下文 :Reducer
*/
// 得到数据 I love Beijing
String data = v1.toString();
// 分词
String[] words = data.split(" ");
// 输出 k2 v2
for (String s:words) {
// k2 v2
context.write(new Text(s),new IntWritable(1));
}
}
}
WordCountReducer.java
package com.wordcount;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
// 实现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 {
/**
* context是Reducer的上下文
* 上文 :Map
* 下文 :HDFS
*/
int total = 0;
for (IntWritable v:v3) {
// 求和
total += v.get();
}
//输出 k4 v4
context.write(k3,new IntWritable(total));
}
}
WordCountMain.java
package com.wordcount;
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.getInstance();
job.setJarByClass(WordCountMain.class);// 任务的入口
//2.指定任务的map和map输出的数据类型
job.setMapperClass(WordCountMapper.class);
job.setMapOutputKeyClass(Text.class);// k2的数据类型
job.setMapOutputValueClass(IntWritable.class);// v2的类型
//3.指定任务的reduce和reduce的输出的数据类型
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);// k4的类型
job.setOutputValueClass(IntWritable.class);// v4的类型
//4.指定任务的输入路径、任务的输出路径
FileInputFormat.setInputPaths(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
//5.执行任务
job.waitForCompletion(true);
}
}
将WordCount项目打包成jar包,并将jar包上传到服务器,并执行如下命令:
hadoop jar wordcount.jar /input/data.txt /output/wordcount
可以登陆到hadoop控制台,查看任务执行的进度:
查看执行结果: