谈一下有关MapReduce的工作流程

废话少说,先来张图看看:
在这里插入图片描述Map:
1、根据业务需求处理数据并映射为KV模型
2、并行分布式
3、计算向数据移动

Reduce:
1、数据全量/分量加工
2、Reducer中可以包含不同的key
3、相同分区的Key汇聚到一个Reducer中
4、 ”相同”的Key调用一次reduce方法
5、排序和比较实现key的汇聚

K,V使用自定义数据类型:
1、节省开发成本,提高程序自由度
2、框架会对键和值序列化,因此键类型和值类型需要实现Writable接口。
3、框架会对键进行排序,因此必须实现WritableComparable接口。

shuffle阶段:

reducer通过HTTP按照分区号获取map输出文件的数据。map端有一个HTTP服务处理该reducer的HTTP请求。该HTTP服务最大线程数由mapreduce.shuffle.Max.threads属性指定。这个属性指定nodemanager的线程数,而不是对map任务指定线程数,因为nodemanager上有可能运行了好几个map任务。默认值是0,表示最大线程数是服务器处理器核心数的两倍。
map输出文件位于运行map任务的本地磁盘。一个reduce任务需要从集群中多个map任务获取指定分区的数据。多个map任务有可能是在不同时间完成的,每当一个map任务运行完,reduce就从该map任务获取指定分区数据。reduce任务会以多线程的方式从多个map任务并行获取指定分区数据。默认线程数是5,可以通过mapreduce.reduce.shuffle.parallelcopies属性指定。

sort阶段:

reducer拷贝map的输出如果很小,则放在内存中(mapreduce.reduce.shuffle.input.buffer.percent指定堆空间百分比)否则拷贝到磁盘。当内存缓冲区数据大小达到阈(mapreduce.reduce.shuffle.merge.percent)或map输出文件个数达到阈值(mapreduce.reduce.merge.inmem.threshold),就发生文件合并溢写到磁盘上。如果指定combiner,此处也会进行combine。
当reducer从所有的map拷贝了分区数据之后,reduce进入到合并阶段,合并所有从map拷贝过来的数据。该合并会有多个回合。如:50个文件,合并因子是10(mapreduce.task.io.sort.factor,默认10),则需要5轮,得到5个中间文件,就不再合并。然后直接输入给reduce阶段。
给reduce的数据一般是从内存和磁盘数据的混合形式。

猜你喜欢

转载自blog.csdn.net/s_pr1te/article/details/89207706
今日推荐