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 )); } } }