KEYIN: 是maptask读取到数据的key类型,是一行的起始偏移量Long。
VALUEIN: 是maptask读取到数据的value类型,是一行的内容String。
KEYOUT: 是用户自定义map方法要返回结果kv数据的key类型,在wordcount逻辑中,我们需要返回的是单词String。
VALUEOUT: 是用户自定义map方法要返回结果kv数据的value类型,在wc逻辑中,我们需要返回的是整数Integer。
但是,在mapreduce中,map产生的数据需要传输给reduce,需要进行序列化和反序列化,而jdk中的
原生序列化机制产生的数据量比较冗余,就会导致数据在mapreduce运行过程传输效率地下,所以,
hadoop专门设计了自己的序列化机制,那么,mapreduce中传输的数据类型就必须实现hadoop自己的序列化接口。
Hadoop为jdk中的基本类型Long String Integer Float等数据类型封装了自己的实现了Hadoop序列化
接口的类型:LongWritable Text IntWritable FloatWritable。
主类,处理一行数据。
public class WcMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
//将里面原先的一行逻辑删除,自己写。
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
//切单词
String line = value.toString();
String[] words = line.split(" ");
for(String word : words){
context.write(new Text(word), new IntWritable(1));
}
}
}
另外写一个类,处理一组相同key的数据。
public class wcReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws InterruptedException, IOException {
int count = 0;
Iterable<IntWritable> interator = values.iterator();
while(iterator.hasNext()){
IntWritable value = iterator.next();
count += value.get();
}
context.write(key, new IntWritable(count));
}
}