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

  

posted @ 2018-09-05 09:54  赵先先森  阅读(150)  评论(0编辑  收藏  举报