mr

mr 的设计思想是分而治之,它分为两个阶段,分别为map阶段和reduce阶段,map阶段体现了分的思想,将一个复杂的任务分解成若干个简单的任务去执行,将大数据量划分为一个个小数据,并将map任务就近分配到各个存放数据的节点中,map任务并行执行。而reduce阶段则将map任务生成的结果进行聚合,reduce任务的个数可以通过配置文件配置。

mr 运行机制流程大致如下图:

image.png

map任务大致工作流程:
1.从hdfs 上读取文件,每一行代表一个,每一个调用一次map函数
2.对输入的进行处理并转化成另一输出
3.对输出的进行分区,默认分区为1
4.对分区的进行排序和分组,分组指的是将相同的key的value放入到一个集合中
5.对进行其他处理
6.将输出到reduce中

以下是map任务运行流程图:

image.png

map函数输出的经过分区会写入到一个内存缓冲区中,当内存缓冲区的大小达到一定的阈值后,会将内存中的进行排序并溢写到磁盘中生成临时文件。这个过程被称为spill 溢写,注意,map函数输出和spill溢写可以同时运行,例如内存缓存区默认阈值为该容量的80%,当容量达到80%时,开始发生溢写,这80%会被锁住,而剩下的百分之20%则继续接收map函数输出的。当溢写到磁盘之前,可以自定义combine以减少磁盘的io,不过combine得根据业务场景来使用。当调用map函数阶段完成时,内存缓存区的数据都会输出到磁盘中去,磁盘中可能会产生一个或者多个临时文件,这时map任务会将这些临时文件合并成一个输出文件,合并的过程会将这些进行排序并按照key进行分组,最终会产生类似的格式。这期间可以根据业务设置combine,以降低磁盘io。合并成的输出文件就是reduce阶段的输入文件,由此,map任务结束。

reduce 任务大致工作流程:
1.将多个map数据根据分区由网络copy到不同的reduce 节点
2.将map数据进行合并和排序,这里接收的数据是分组后的数据,调用自定义reduce方法并输出一个kv
3.将reduce输出的kv写入到hdfs中去

reduce任务细节:
reduce 任务分为copy,merge两个阶段
copy阶段:reduce简单的从map端拉取数据
merge阶段:reduce有三种方式的merge,分别为内存到内存的合并,内存到磁盘的合并,磁盘到磁盘的合并。内存到内存的合并默认不开启,reduce会将拉取过来的数据放入到内存缓冲区中,在第二种merge方式中,当内存缓冲区达到一定的阈值时也会发生spill产生临时文件,第二种meger方式会不断运行直到map端不会再产生数据,此时,第三种merge方式开启,并将临时文件合并成一个输出文件,这个输出文件最终会作为调用reduce函数的输入数据。

map 端相关属性如下:


image.png

reduce端相关属性如下:


image.png

你可能感兴趣的:(mr)