天天看点

mr-wordcountmapreduce

3部分,driver、map、reduce

一个block分配一个map进程,入参是一行

一个reduce只会处理一个key,入参是

<key,Iterator<value>>

,也就是说,有多少个key,就会有多少个reduce进程

分布式计算引擎将用户提交的应用转化为多个较小的task,通过资源管理和任务调度工具实现并行执行。

mapper(map任务)将输入的分块数据进行map()处理,将输出结果写入缓冲区,对buffer中的数据进行分区、排序、聚合等操作,最后将数据输出到本地磁盘上的不同分区。然后发送给reducer。

reducer从mapper的对应分区中拉取数据到本地buffer(如果不够会排序后写入磁盘),然后经过归并、排序等阶段将数据写入hdfs。

map

//key是google的历史遗留问题,只有在创建搜索引擎索引的时候才用得到
//value就是一行,默认的InputFormat是按行读
//context是个分布式的环境,用来传输
//Text不要每次都创建,使用一个共享的
Text text = new Text();
final Intwritable one = new Intwritable(1);
map(key,value,context){
	array = value.split()
	array.foreach(context.write(text.set(word),one))
}
           

reduce

/**
 *	一个key对应一个reducer,自然也对应一个集合values
 */
private IntWritable result = new IntWritable();
reduce(key,Iterator<value> values,context){
	 //暂存每个key组中计算总和
     int sum = 0;
     //加强型for,依次获取迭代器中的每个元素值,即为一个一个的词频数值
     for (IntWritable val : values) {
           //将key组中的每个词频数值sum到一起
           sum += val.get();
     }
     //将该key组sum完成的值放到result IntWritable中,使可以序列化输出
     result.set(sum);
     //将计算结果逐条输出
     context.write(key, result);
}
           

继续阅读