- 首先客户端会向ResourceManager发送运行程序的请求,发送的信息中也包含了(容器的参数规格等信息).
- ResourceManager在接收到客户端的请求后,会返回给客户端一个jobid和将程序资源存到hdfs中的位置信息(将信息存到hdfs中可以方便其他节点下载数据).
- 客户端在接收到请求后,会将程序的资源信息(job.xml,job.split,jar)上传到hdfs中.
- 客户端在上传成功后,会将上传成功的信息反馈给ResourceManager.
- ResourceManager在接受到程序资源上传成功的信息后,会将任务加到任务队列当中,等待NodeManger领取任务(因为NodeManger也可能正在执行别的任务,可能资源都在被占用当中,出现了这种情况,只能等待某台NodeMnager资源释放后,来领取任务).
- 资源充足的NodeManager,通过心跳机制发现,有任务待执行,然后从ResourceManager中领取任务,任务中包含了客户端请求的容器资源信息和客户端上传程序资源的位置信息,根据容器的资源信息创建容器.
- NodeManager在成功领取到任务后,根据任务中的信息,从hdfs中下载程序的资源信息存到容器当中,到这里容器才是创建完成.
- NodeManager在创建好容器之后,会向ResourceManager返回容器创建成功的信息.
- 客户端始终都在于ResourceManager保持着通信,同时也时刻在查看容器的创建状态,当查看到容器创建好的信息后(信息中也包含是NodeMnager的信息),会向该NodeManager发送启动jar包中启动MRAppMaster的shell命令.
- NodeManager在接收到客户端的命令后,开始解析程序资源 ,向ResourceManager请求容器(默认1核,1g),ResourceManager在接收到请求容器的信息后,会将这个任务添加到任务队列中,等待其他节点领取任务.
- 在其他节点资源释放出来后,会在ResourceManager中领取该任务,并根据任务信息创建容器,同时也会在hdfs中下载程序资源,在创建好容器后,同样会回馈给主节点容器创建成功的信息.
- NodeManager01(下图),在接受到其他节点创建容器成功的信息后,会向这些节点发送执行程序的shell的命令,这些节点在接收到命令后,开始执行YarnChild(maptask).
- 其他节点开始执行程序后,NodeManager01会向ResourceManager再次请求容器(因为不同节点执行maptask的速度不同,可能有的节点没有执行完,有的节点已经执行完毕了,这个时候需要reducetask拉取分区文件),同样其他资源充足的节点会从主节点中领取任务,创建容器,在这些节点创建好容器后,NodeManager01又会向这些节点发送shell命令执行程序.
以上就是MR在YARN上的运行机制
原理图如下:
相关文章: