Yarn是主从架构
Yarn的四大组件:ResourceManager、ApplicationMaster、NodeManager、Container
ResourceManager:运行在Master上的一个进程,负责集群的资源调度
NodeManager:运行在Slaver上的一个进程,负责向Master上报子节点的运行、资源状况。
ApplicationMaster:运行在Slaver上,是Yarn暴露给我们的客户端,需要将我们的程序封装到ApplicationMaster中,才可以与ResourceManager进行沟通。
Container:运行在Slaver上,是集群资源分配的单位
如上图所示:从我们的客户端Client开始,Client向ResourceManager索要资源时,首先会在集群中找一个Container为Client封装好的东西起一个ApplicationMaster,之后就与Client无关了,ApplicationMaster将Client注册到ResourceManager,并与之沟通,请求资源。ApplicationMaster收到来自ResourceManager的资源列表后,就会通知相应的NodeManager启动资源,而NodeManager便会为之启动Container,随后ApplicationMaster就会将Task发送至这些Container运行,运行结束后,结果又会送回至ApplicationMaster
如下为SparkOnYarn的例子:
1:Spark客户端提交请求,向ResourceManager申请资源
2、3:ResourceManager在集群中的某个NodeManager中找一个Container,将Spark程序封装为APPMaster并启动
4:针对Spark来说,APPMaster里启动的其实就是Driver里的DAGScheduler和TaskScheduler(图中的YarnClusterScheduler)
5、6、7:APPMaster向ResourceManager申请资源(Container),得到资源列表后,通知NodeManager启动Container,(图中第6步有些问题,应该是APPMaster通知NodeManager启动Container的不是ResourceManager)
8、9:Spark的TaskScheduler最终将从HDFS中读取的数据转化为Tasks,并分配给Worker上的Executor,来执行。而这里的Executor是放在Container中执行的,所以就有一个问题:如果Container的资源大小小于Executor所需该怎么办?这时Executor就无法放在Container中执行了,但是此时任务不会失败,而是会进入重试等待的状态,当有机器的Container大小满足时该Executor的需求时,Yarn便会分配给该Executor
last:Executor中的计算结果最终再送回至TaskScheduler中。