hadoop中的一些重要知识点

hadoop之job和shuffle过程

1、job提交流程

1、用户向YARN中提交应用程序,其中包括ApplicationMaster(AM)程序,启动AM的命令,用户程序等。

2、ResourceManger(RM)为该程序分配第一个Container,并与对应的NodeManger通讯,要求它在这个Container中启动应用程序AM。

3、AM首先向RM注册,这样用户可以直接通过RM查看应用程序的运行状态,然后将为各个任务申请资源,并监控它的运行状态,直到运行结束,重复4--7的步骤。

4、AM采用轮询的方式通过RPC协议向RM申请和领取资源。

5、一旦AM申请到资源后,便与对应的NM通讯,要求它启动任务。

6、NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

7、各个任务通过某个RPC协议向AM汇报自己的状态和进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败的时候重新启动任务。

8、应用程序运行完成后,AM向RM注销并关闭自己。

(1)作业提交

第 0 步:client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业。

第 1 步:client 向 RM 申请一个作业 id。

第 2 步:RM 给 client 返回该 job 资源的提交路径和作业 id。

第 3 步:client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。

第 4 步:client 提交完资源后,向 RM 申请运行 MrAppMaster。

(2)作业初始化

第 5 步:当 RM 收到 client 的请求后,将该 job 添加到容量调度器中。

第 6 步:某一个空闲的 NM 领取到该 job。

第 7 步:该 NM 创建 Container,并产生 MRAppmaster。

第 8 步:下载 client 提交的资源到本地。

(3)任务分配

第 9 步:MrAppMaster 向 RM 申请运行多个 maptask 任务资源。

第 10 步 :RM 将运行 maptask 任务分配给另外两个 NodeManager,另两个 NodeManager

分别领取任务并创建容器。

(4)任务运行

第 11 步:MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个NodeManager 分别启动 maptask,maptask 对数据分区排序。

第 12 步:MrAppMaster 等待所有 maptask 运行完毕后,向 RM 申请容器,运行 reduce task。

第 13 步:reduce task 向 maptask 获取相应分区的数据。

第 14 步:程序运行完毕后,MR 会向 RM 申请注销自己。

(5)进度和状态更新

YARN 中的任务将其进度和状态(包括 counter)返回给应用管理器, 客户端每秒(通过

mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新, 展示给用户。

(6)作业完成

除了向应用管理器请求作业进度外, 客户端每 5 分钟都会通过调用 waitForCompletion()

来检查作业是否完成。时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。作

业完成之后, 应用管理器和 container 会清理工作状态。作业的信息会被作业历史服务器存储

以备之后用户核查。

####resourceManager包括两个组件:

####1、调度器:负责调度任务执行的顺序,仅是调度的作用,不参与任何任务的执行

(1)FIFO先进先出调度器:先来的任务先执行,只有一个队列

(2)Capacity容量(计算能力)调度器:有多个队列,为每个队列分配不同的资源,每个队列遵循FIFO(hadoop 2中默认的调度模型)

(3)Fair公平调度器:所有任务平分共享资源

####2、任务管理器applicationsManager(ASM):负责任务启动或停止或失败启动

7)等到分配到相关资源之后就调度器会先给应用程序在一个nodemanager中分配一个容器(container),然后在容器中先启动程序的管理者,用于管理任务的运行进度和完成情况,这个管理者叫APP MASTER(主类是MRAppMaster)。

8)MRappmaster会对作业进行初始化,初始化的过程中会创建多个簿记对象(作业簿),用来跟踪作业的完成。

9)接下来MRAppMaster会启动相应的maptask,但是不知道启动几个啊,也不知道每一个对应的数据切片信息,怎么办?这时候就会去先访问共享文件系统中,获取本作业的输入切片信息。会获取到本job中有几个maptask和reducetask。此时mrappmaster会首先进行一个决策,就是如果maptask的数量小于10个,而reducetask的数量只有1个,并且输入大小小于一个块的作业,就会选用和MRAppmaster同一个JVM中运行任务,因为此时在别的节点上重新启动容器和销毁容器的开销过大不划算,这种模式就是uber模式。然后MRAppMaster会对每一个分片创建一个maptask对象。

10)如果作业不适合作为uber模式运行,此时MRAppMater就会为maptask和reducetask任务向RM申请资源,先发送maptask的请求,再发送reducetask的请求。注意maptask有数据本地化的局限。优先数据本地化,其次机架本地化最后任意节点。请求返回相应的节点信息。

11)RM向MRappMaster返回资源信息,空闲的资源节点,MRAppmaster就会去相应的nodemanager节点上启动Container

12)之后会启动一个YarnChild进程用于执行maptask程序

13)Maptask执行之前会首先去共享文件系统中下拷贝相应的文件,包括jar包、job.xml文件以及job.split分片信息等,下载到本地

14)启动相应的maptask任务

15)maptask进行到80%的时候,MRAppmaster会去启动reduceTask,启动过程同上述过程

16)资源回收和销毁

2、MapReduce的shuffle过程

####一、Map端的shuffle

Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS。每个Map的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做spill。

在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序,然后每个partition中的数据再按key来排序。partition的目是将记录划分到不同的Reducer上去,以期望能够达到负载均衡,以后的Reducer就会根据partition来读取自己对应的数据。接着运行combiner(如果设置了的话),combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。最后将数据写到本地磁盘产生spill文件(spill文件保存在{mapred.local.dir}指定的目录中,Map任务结束后就会被删除)。

最后,每个Map任务可能产生多个spill文件,在每个Map任务完成前,会通过多路归并算法将这些spill文件归并成一个文件。至此,Map的shuffle过程就结束了。

####二、Reduce端的shuffle

Reduce端的shuffle主要包括三个阶段,copy、sort(merge)和reduce。

首先要将Map端产生的输出文件拷贝到Reduce端,但每个Reducer如何知道自己应该处理哪些数据呢?因为Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer),所以Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据即可。每个Reducer会处理一个或者多个partition,但需要先将自己对应的partition中的数据从每个Map的输出结果中拷贝过来。

接下来就是sort阶段,也成为merge阶段,因为这个阶段的主要工作是执行了归并排序。从Map端拷贝到Reduce端的数据都是有序的,所以很适合归并排序。最终在Reduce端生成一个较大的文件作为Reduce的输入。

最后就是Reduce过程了,在这个过程中产生了最终的输出结果,并将其写到HDFS上。

个人总结:

shuffle是map产生输出到reduce消化输入的过程
一个待处理的文本,客户端在submit()之前调用maptesk进行切片处理,maptask用textinputformat进行reader()读取,
然后maptask调用用户自定义的mapper进行逻辑处理,输出<k,v>对,将其写入到环形缓冲区中,环形缓冲区默认大小为100M 当达到80%时进行溢写操作,然后再spile阶段进行partitiator分区,且分区内排序,再进行combiner合并操作,
两两合并,并进行merge操作,merge操作再次进行归并排序,reducetesk将多个merge文件再次进行归并排序

猜你喜欢

转载自blog.csdn.net/weixin_43637653/article/details/84334698