package com.atguigu.mr.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;
/**
- WordCountMapper类: 需要继承Hadoop的Mapper类.并且指定输入和输出的kv类型,再实现map方法.
- 待分析的数据:
- atguigu atguigu
- ss ss
- cls cls
- jiao
- banzhang
- xue
- hadoop
- 输入的kv:
- KEYIN: LongWritable 表示读取文件的偏移量(简单理解为文件读取到的位置或者下次从哪个位置开始读取)
- VALUEIN: Text 表示实际读取到的一行内容
- 输出的kv:
- KEYOUT: Text 表示一个单词
- VALUEOUT: IntWritable 表示这个单词出现了1次
*/
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
//输出的key
Text k = new Text();
//输出的value
IntWritable v = new IntWritable(1);
/**
*
* @param key 输入的key
* @param value 输入的value
* @param context 负责数据的输出(其实负责整个Mapper类中执行过程的调度)
*
* map方法的执行过程: 对输入的一个kv对执行一次.
*
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//1. 先获取一行内容 atguigu atguigu
String line = value.toString();
//2. 按照分隔符切割一行内容 [atguigu,atguigu]
String[] splits = line.split(" ");
//3. 迭代数组,将数组中的每个单词都拼成kv写出
for (String word : splits) {
//封装key
k.set(word);
//将当前的kv 写出
context.write(k,v);
}
}
}
=============================================================================
package com.atguigu.mr.wordcount;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
-
WordCountReducer类: 需要继承hadoop提供的Reducer类,并指定输入和输出的kv,再实现reduce方法.
-
输入的kv: 对应的是mapper输出的kv类型。
-
KEYIN: Text
-
VALUEIN: IntWritable
-
输出的kv:
-
KEYOUT: Text
-
VALUEOUT: IntWritable
*/
public class WordCountReducer extends Reducer<Text, IntWritable,Text,IntWritable> {IntWritable v = new IntWritable();
/**
*- @param key 输入的key
- @param values 表示所有v的迭代器对象,对v的处理需要通过迭代器迭代累加。
- @param context 负责数据的输出(负责整个Reducer中执行过程的调度)
- reduce方法的执行: 对一组相同key的kv组执行一次.
-
例如(atguigu,1 atguigu,1 atguigu,1)
*/
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
int sum = 0 ;
//迭代values,将迭代出的值进行累加,得出当前key出现的次数
for (IntWritable value : values) {
sum += value.get();
}
//封装v
v.set(sum);//写出 context.write(key,v);
}
}
============================================================================
package com.atguigu.mr.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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCountDriver {
public static void main(String[] args) throws Exception {
//1. 创建Job对象
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
//2. 关联Jar
job.setJarByClass(WordCountDriver.class);
//3. 关联Mapper 和 Reducer
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
//4. 设置Mapper输出的key和value类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//5. 设置最终输出的key和value类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//6. 设置输入和输出路径
FileInputFormat.setInputPaths(job,new Path(“D:/input/inputWord”));
FileOutputFormat.setOutputPath(job,new Path(“D:/output1”));
//7. 提交Job
job.waitForCompletion(true);
}
}