Hadoop——MapReduce计算框架详细讲解

MapReduce(MapReduce是批量计算模型,只有一批数据全部Map完,才会开启Reduce阶段)
简单理解

Map(映射):以一条记录为单位做映射,在处理当前记录时不关心其他记录的状态
Reduce:以一组记录为单位做计算,所以计算前要分组,分组的数据是key-value的形式,分组由map完成

在这里插入图片描述
Map:负责数据的映射,过滤,变换,1条记录进,n条记录出
Reduce:负责数据的分解,缩小,归纳,1组记录进,n条记录出

MapReduce过程示意图

在这里插入图片描述

解释
  • Map阶段一个棕色框(叫做一个MapTask)代表一个并行度,并行度的数量由split数量决定。split表示切片,一个split对应一个map计算。一个切片默认代表hdfs里的一个block,block是真实物理存在的,split则是逻辑上定义的。split可以调整大小,使得split可代表多个block,或小于一个block块的数据,这使得我们可以灵活地控制一个并行度要计算多少数据
  • Reduce阶段一个棕色框(叫做一个ReduceTask,也可称为一个分区(partition))代表一个并行度,并行度的数量由开发人员自行决定。同key的数据归为一组,一般而言一个partition里只有一组数据,但是由于并行度数量可人为控制,所以一个partition里也可以有多组数据(即不同的key)。

可以总结出如下比例
block : split 的数量比可以是1:1,N:1,1:N
split : map 的数量比只能是1:1
MapTask : ReduceTask 的数量比可以是1:1,N:1,1:N,N:N
分组 : 分区 的数量比可以是1:1,N:1(即所有分组放到一个分区里计算),N:N(即一个分组使用一个分区计算),1:N(即将一个分组放到一个分区计算,剩余分区空闲)

MapTask和Reduce过程细化示意图

在这里插入图片描述

解释
  • 切片会格式化输出,以记录为单位调用map方法
  • map的输出映射成kv形式,kv会参与一次分区计算,也就是拿着k算出分区号p,所以最终的结果应是(k, v, p)
  • 其实算完之后的结果可以直接存磁盘了,但是每有一条输出就存一次,如果数据量很大,那么IO开销将会很大,所以在内存中开辟一个默认100M的缓冲区,先输出到缓冲区,当缓冲区满时,再全部溢写到磁盘
  • 这时的buffer里完全是乱序的,所以这时可以做两次排序。1.在各分区内按key做一次排序(图中对应的partition, sort and spill to disk)。2.按分区号做一次排序(图中的merge on disk)。这样在fetch时,就不用对文件从头到尾扫描了,且在分区内做reduce计算时,key已按照顺序排在了一次。(第一个排序在内存中发生,速度很快;第二个排序使用归并,只产生一次IO)。这时存在磁盘上的文件,已是分区间有序,分区内有序的了。
  • ReduceTask阶段,因为一个分组中的各数据来自不同的MapTask,所以它们之间是乱序的,还得对它们做一次排序,依旧使用归并排序。
  • 由于迭代器模式的支持,reduce的归并排序和reduce方法的计算可以同时发生。

我将在下一篇博客中详细介绍MapReduce的资源调度问题,以及如何演变到Yarn架构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值