对MapReduce&Yarn的深刻理解

本文详细介绍了MapReduce的Map阶段,包括数据读取、映射、收集和溢写过程,以及Reduce阶段的复制、合并、排序和归约步骤。同时,概述了YARN的工作机制,包括资源分配、任务调度和Container管理。重点讨论了Shuffle过程和YARN中ResourceManager、NodeManager、AppMaster和Container的角色与职责。
摘要由CSDN通过智能技术生成

1.MapReduce详细工作流程之Map阶段
在这里插入图片描述

1.首先有一个待处理的文本
ss.txt 假设为200M大小
2.在客户端submit()之前,获取待处理的数据的信息,然后根据参数配置,形成一个任务分配的规划 。(默认128m一个数据块)
ss.txt 0-128 任务1
ss.txt 128-200 任务2
3.提交信息
Job.split(任务切片信息)
wc.jar(需要提交的jar包)
Job.xml(xml配置文件)
将这三个文件从MapReduce客户端提交到Yarn上的ResourceManager上进行处理。
4.Yarn上提交时,会将每个任务封装成一个job,提交给yarn处理,ResourceManager会计算出MapTask数量(和切片数量一致),然后RM把任务分配给NodeMamager,在MR appmaster允许后,NodeManager就会来处理相应的任务(Maptask1&Maptask2),每个任务会并行执行。
5.MapTask会执行Mapper中的map方法,此方法需要传入k,v值,所以我们需要先从数据中获取k,v值,以作为输入的参数
具体做法是:首先调用InputFormat方法,默认为TextInputFormat方法,在此方法中调用createRecordReader方法,将每个块封装为(k,v)键值对,然后传递给map方法。
6.数据进入MapTask中以后会进行Map端的逻辑运算,运算完后,会进行写操作。
7.map端产生的数据如果直接进行写操作,写入到reduce中,会直接操作磁盘,这样就会进行大量的io操作,效率太低,所以map端和reduce端之间会进行一个shuffle操作。
所以map端产生数据后会通过outputCollector向环形缓冲区写入数据,环形缓冲区分为两部分,一部分写入文件的元数据信息,另一部分写入文件的真实内容。
环形缓冲区默认大小为100M,环形缓冲区写入80%数据以后,会反向溢写。
8.在溢写之前会对环形缓冲区中数据会按照指定的分区排序规则进行分区和排序,之所以反向溢写是为了可以边接收数据边向磁盘中溢写数据。
9.在分区和排序过后会把文件溢写到磁盘当中,可能发生多次溢写,可能溢写到多个文件。
10.对所有溢写到磁盘中的文件进行Merge归并排序操作。
11.在溢写到磁盘后和对磁盘中文件归并排序之前可能进行combine合并操作,它的意义是对每个MapTask输出的数据进行局部汇总,以减少网络传输量。
第一:在Map阶段,由于map的进程数量是多于reduce的,所以map阶段处理的效率更高
第二:在Map阶段进行合并,这样传递给reduce的数据
会少很多。
第三:combine操作能够应用的前提是不能够影响最终的业务逻辑,combine的输出的kv要和reduce输入的kv对应起来。
宏观上看,MapTask阶段分为Read阶段,Map阶段,Collect阶段,和溢写(spill)阶段
a.Read阶段:MapTask运用用户编写的RecordReader方法,从输入的inputsplit中解析出key/value
b.Map阶段:将key/value值放入用户编写的map()方法中,产生一系列新的key/value值。
c.Collect阶段,将用户在map()阶段处理完成的每个key/value数据,调用OutputCollector.collect()方法,输出结果。在函数内部,它将会生成key/value的分区(调用partioner),并写入到一个环形缓冲区当中。
d.spill阶段,即溢写,当环形缓冲区数据满时,MapReduce会将数据写入到本地磁盘上,此时会生成一个临时文件,需要注意的是,在数据写入到磁盘前,会对数据进行一次本地排序,有必要时,还会对数据进行合并,压缩等操作。
e:MRAppmaster职能:启动MapTask任务

2.MapReduce流程之Reduce阶段
在这里插入图片描述
12.所有MapTask数据处理完成后,启动相印数量的ReduceTask,并告知ReduceTask需要处理数据的范围(数据分区)
13.ReduceTask将MapTask中的数据下载到ReduceTask本地磁盘,然后合并不同的文件,进行归并排序。
14.最后将数据交给Reduce处理,一次读区一组数据。
15.最后通过OutputFormat的RecordWriter方法将数据写入到本地磁盘的文件当中。

宏观上看:ReduceTask分为四个阶段:
1.Copy 2.Merge 3.Sort 4.Reduce

1.copy: ReduceTask将远程从MapTask上复制过来要处理的数据,针对某一片数据,如果数据的大小超过一个阈值,则直接存储在磁盘中,否则直接放到内存中。
2.Merge:ReduceTask在远程复制的同时,后台启动了两个线程,将硬盘和内存中的数据进行合并,样可以避免内存占用过多,或者磁盘文件过多。
3.sort:按照MapReduce的语义,Reduce()的输入值是按照key进行聚集的一组数据,为了将key相同的数据放在一起,hadoop采用了基于排序的策略,由于MapTask阶段已经进行了局部排序,所以ReduceTask阶段只需要对所有数据进行一次归并排序即可
4.Reduce:Reducer会调用reduce()方法将处理好的数据写入到HDFS当中。
3.Shuffle机制
在这里插入图片描述
Shuffle是指在map()方法之后,reduce()方法之前所进行的数据处理过程,shuffle的流程详解如下:
1.首先MapTask的Map方法将输出的(k,v)数据放入到环形缓冲区中。
2.当环形缓冲区数据达到80%时,会将数据不断溢写到磁盘当中,有可能溢出多个文件,多个溢出的文件会合并成为一个大的文件。
3.在溢出的过程以及合并的过程中,会调用partioner对磁盘中的数据会进行分区,进行按照key排序。
4.reduceTask会根据自身的分区号结合map端数据,取出相应的MapTask中的分区数据。
5.ReduceTask会储存来自不同MapTask的结果文件进行归并,排序。
6.当合并成大文件之后,shuffle过程就结束了,此时会进入reduce()方法。
Yarn工作机制

在这里插入图片描述
1.首先,MapReduce程序(D://wc.jar)提交给客户端所在的节点上。
2.然后客户端会向ResourceManager申请一个Application,
ResourceManager会返回给YarnRunner一个application的资源提交路径
hdfs://…/staging以及application_id,这样客户端就可以在submit()执行完毕过后过后,将job.xml,wc.jar,job.split三个文件提交给hdfs对应的路径上。
3.客户端通知RM资源提交完毕,yarn客户端向RM申请运行mrAppmaster
4.RM接收到请求后,会将用户的请求初始化为一个task,然后把这个task请求进入任务调度队列中,等待分配资源。
5.RM会把这个task分配给一个空闲的NodeManager去执行。
6.这个领到Task的NodeManager开始创建Container容器,然后产生MRAppmaster
7.该Container会从hdfs中远程复制资源到本地,MRAppmaster开始向RM请求执行MapTask的容器。
8.RM接收请求后,会把MapTask分配给空闲的NodeManager,NodeManager领到MapTask后会创建容器。
9.然后,MRAppmaster会把启动脚本发送给领到MapTask的节点,这样两个NodeManager就可以分别启动MapTask了。
10.MRAppMaster会监控MapTask执行情况,等到MapTask都执行完毕后,会向RM请求两个执行ReduceTask的容器。
11.ResourcceManager 分配给两个NodeManager ReduceTask,然后分别创建Container,MRAppmaster会调度NodeManager去执行MapTask的Container的相印分区下载ReduceTask所需的资源,得到资源后,就开始并行第执行ReduceTask了。
12.等到ReduceTask执行完毕过后,MRAppmaster会向ResourceManger请求,申请注销自己。
(1)Yarn的进度状态更新:Yarn会监控任务,将其进度和状态返回给应用管理器,客户端默认每秒向应用管理器请求进度更新,展示给客户。
(2)作业完成:客户端每5秒会调用job.waitforcompletion()来检查作业是否完成,作业完成后,应用管理器和container会清理工作状态。作业信息会被作业历史服务器存储以备之后用户检查。

总览:
Yarn架构分为四大部分,分别是:ResourceManager,NodeManager,Appmaster,Container
他们的职能分别是
ResourceManager:(1)资源的分配和调度
(2)监控NodeManager
(3)处理客户端请求
(4)启动或者监控AppMaster
NodeManager:(1)管理单节点上的资源(2)接收Appmaster指令,执行MapTask任务(3)接收Resourcemanager上的命令,创建容器。
Appmkaster:(1)负责任务的切分
(2)任务的监控与纠错(不理解)
(3)为应用程序申请资源,并给内部分配任务。
Container:是Yarn中的资源抽象,封装了某个节点上的多维度资源:cpu ram 网络 磁盘等资源。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值