mapreduce程序在yarn集群中的调度过程:
1.客户端想ResouceManager提交一个job作业,申请运行一个MR的程序,RPC调用
2.ResourceManager返回一个由创建的jobid目录.
3.在HDFS该目录下有一个以jobid命名的目录并,写入job.xml和job分片数据,job.jar,jobConfinger
4.通知RM,job的资源文件提交完毕.
5.初始化一个任务 然后放到队列中去
6.nodemanager 和ResouceManager 保持心跳进行通信nodeManger 时隔多少秒去调用ResouceManger节点提供的方法 查询resouceManager队列里是否有任务,当某个NodeManager节点发现ResouceManager队列中有任务,该nodeManager节点就会把ResouceManager队列中的任务领取过来.
7.当领取到任务后,会在NodeManager节点上分配一块硬件资源出来(容器container,相当于在一个节点上创建一台虚拟机 有内存 CPU IO,可以看做是一台JVM)(可将该容器看成一个进程yanrchild)在分配容器过程中,将HDFS上所有job配置文件全部拷贝到本地
8.当NodeManager分配好资源容器后,会向resouceManger汇报,当ResouceManger接收到汇报情况后,会告诉yarnRunner,哪个节点为你准备好了容器,然后会启动一个MRAppmaster程序.
9.当MRAppmaster程序起来后会读取,该节点容器container上的job资源,MRAPPMASTER知道任务该怎么执行,多少个切片,根据切片启动多少个MAP TASK,它就会向ResourceManager去申请计算资源(NodeManager上的资源容器contailner)
10.当ResourceManager收到申请后,会再次创建任务然后放到队列里,然后别的NodeManager就会领取到任务
11.某个NodeManager领取到任务是由ResouceManager决定的,因为任务中带有信息该由哪个NodeManager来领取任务因为ResouceManager有一套算法,比如根据负载根据切片信息是否在这个NodeManager节点上
12,然后领取到任务的NodeManager创建容器 创建job资源 然后会通知ResourceManager我已经领取到了,然后ResouceManager会通知MRappmaster容器已经准备完毕.
13.MRappmaster会调用NodeManager准备好的容器并启动一个运算程序 maptask .当MRappmaster启动Map task后会一直监控他们的运行状况,他们之间也有一个心跳机制.当Map task任务执行完成后,MRappmaster就会把处理完的Map Task进程销毁,当然Map task任务处理完的数据会在,NodeManager节点上并且已经分了区排了序,当然MRappmaster知道每个Map task任务生成结果文件放在哪里
14.当所有Map Task任务执行完成后,MRappmaster会向ResourceManager再次申请资源,然后ResourceManager生成任务然后又会有NodeManager领取到,会创建容器,当容器创建完成后,NodeManager会通知ResourceManager ,ResourceManager会通知MRAppmaster,然后MRappmaster会去启动该reduce Task 任务,
15.reduce Task 任务被启动后,会去询问MRappmaster你让我处理的数据在哪里,然后MRappmaster会告诉reduce Task任务你去取哪几个NodeManager节点上的数据并且取几号分区的数据,然后reduceTask会将每个NodeManger节点上属于自己的数据拉取到reduce Task任务中 然后对每个NodeManager节点上属于自己分区的数据进行规约合并 最后调用 reduce方法中,
16.当reduce处理完成后,MRappmaster会知道然后会注销该renduceTask进程,当所有reduceTask都完成注销掉后,MRappmaster会
通知ResourceManager将自己注销掉,并让RM回收资源(container)