mapreduce
1、map阶段前先进行切片 一个文件被切分成多个128MB的切片 一个切片启动一个mapTask的程序。mapTask程序可以分批运行。
2、reduceTask mapTask的返回就是key-value reduceTask 根据所有mapTask 返回的key搜集到一个reduceTsak 中做汇总
3、shuffle洗牌 根据key 分发kv数据到reduceTask中,相同key分发到同一个reduceTask程序
4、reduceTask对一组的数据进行处理
import java.io.IOException;
import org.apache.hadoop.mapreduce.Mapper;
import javafx.scene.text.Text;
/**
* KEYiN :是map task读取到的数据的key的类型,是一行的起始的偏移量Long
* VALUEIN : 是map task读取到的数据的value的类型,是一行的内容String
*
* KEYOUT:是用户的自定map方法要返回的结果kv数据的key的类型,在wordcount逻辑中,我们需要返回的是单词String
* VALUEOUT:是用户的自定义map方法要返回的结果kv数据的value的类型
*
* map产生数据到reduce的数据传输过程为网络传输,需要进行序列化和反序列化,所以hadoop设计了自己的序列化机制
* java Long String Integer Float -> hadoop LongWritable Text IntWritable Floatable
*/
public class WordcountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
@Override
protected void map(LongWritable key,Text value,Content context) throws IOException,InterruptedException{
//切
String line = value.toString();
String[] words = line.split(" ");
for (String word : words) {
context.write(new Text(word),new Intwritable(1));
}
}
}
public class WordcountReduce extends Reduce<Text,IntWritable,Text,IntWritable>{
@Override
protected void reduce(Text key,Iterable<IntWritable> values,Content context) throws IOException,InterruptedException{
int count = 0 ;
Iterator<IntWritable> iterator = values.iterator();//生成迭代器
while(iterator.hasNext()){
IntWritable value = iterator.next();
count+=value.get();
}
context.write(key,new IntWritable(count ));
}
}
}

浙公网安备 33010602011771号