MapReduce

MapReduce

在这里插入图片描述

1.Map:
分片中的每一条记录K-V都会调用一次Map函数,生成一个新的K-V。Map的输出结果首先是存在一个环形缓冲区的buffer in memory(大小默认是100M,由io.sort.mb属性决定)。

2.shuffle(map输出后,reduce输入前):

  • Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。
    • 一个分区对应一个reduce,为了避免有些 reduce 任务分配到大量数据,而有些 reduce 任务却分到很少数据,甚至没有分到数据的尴尬局面。根据每一条数据的 key 的 hashcode 值摸运算(%)reduce 的数量,得到的数字就是“分区号“。
  • Spill阶段:即“溢写”,当环形缓冲区满后,当缓冲区要溢出时(默认为缓冲区的80%,由io.sort.spill.percent决定)。MapReduce会在本地文件系统创建一个文件,将缓冲的数据存到本地磁盘。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
  • Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。
    3.reduce
  • ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则数据写到磁盘上,否则直接放到内存中。
  • 在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
  • 按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。 由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。

数据并行计算流程:

在这里插入图片描述

  • 用户提交mapreduce程序至主控节点,主控节点将输入文件划分成若干分片spilt。主控节点master和worker启动相应进程。
  • 主控节点根据工作节点实际情况,进行map任务分配。
  • 被分配map任务的节点读取文件的一个分片,进行map处理,将结果保存在本地。结果分成R个分区进行存储,R对应reduce的数目。
  • Map节点将存储文件的信息传递给Master主控节点,Master指定reduce任务运行节点, 并告知数据获取节点信息。
  • reduce根据Master传递的信息去map节点远程读取数据。因为reduce函数按分组进行处理,key相同的记录被一同处理,在reduce节点正式处理前,对所有记录按照key排序。
  • Reduce 将处理结果写入分布式文件系统。

[https://www.csdn.net/gather_22/MtTaYg1sNTc5NjMtYmxvZwO0O0OO0O0O.html]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值