YARN是运算资源的调度系统。运算资源包括运行程序的jar包,配置文件,CPU,内存,IO等。使用了linux的资源隔离机制cgroup实现了CPU和内存的隔离。它的运行容器叫做container。每个container中包含了一定的CPU+内存。
docker,openstack等虚拟化框架都使用了cgroup。
首先,客户端启动后获取一个YARNRunner,它本质上是一个动态代理对象。它负责将任务提交到YARN集群中。
先上一个整体的流程图。
提交过程
YARNRunner会去找ResourceManager,申请提交一个Application,ResourceManager会返回一个Application资源提交路径hdfs://xxx/.staging以及job_id。
YARNRunner将资源上传到ResourceManager指定的HDFS目录中。包含job.split,job.xml.job.jar。然后通知ResourceManager,任务提交完成了。
运行过程
由于ResourceManager会接收很多程序,而计算资源是有限的。因此不能保证每个任务一提交就能运行,所以需要有一个调度机制。(调度策略包括FIFO,Fair,Capacity等。)
当Job提交成功后,ResourceManager把Job封装成一个Task。
NodeManager与ResourceManager通信时,会领取这个Task。
领取到Task后,NodeManager根据Task的描述,生成任务运行的容器container。并从HDFS上把任务需要的文件下载下来,放到container的工作目录中。启动MRAppmaster。
MRAppmaster请求ResourceManager分配若干个Container来启动MapTask。ResourceManager同样将Task放入队列中。
NodeManager与ResourceManager通信时,会领取这个Task。NodeManager会分配一个容器。
然后MRAppmaster会发送启动程序的脚本给NodeManager。MapTask就运行起来了。
MRAppmaster负责监管MapTask,如果MapTask失败了,MRAppmaster会申请再运行一个MapTask。
等到MapTask运行完毕之后,输出结果保存在container的工作目录下面。
MRAppmaster再申请容器运行ReduceTask。
ReduceTask运行起来以后,会去下载MapTask的输出结果,每个ReduceTask获取自己负责的那一部分。
ReduceTask执行完毕后,MRAppmaster会向ResourceManager注销自己,YARN会回收所有的计算资源。
总结
YARN现状
YARN只负责程序运行所需要资源的分配回收等调度任务,和MapReduce程序没有什么耦合。所以许许多多的其他的程序也可以在YARN上运行,比如说Spark,Storm等。
Hadoop中的JobTracker
Hadoop1中没有YARN,它使用JobTracker和TaskTracker。客户端提交任务给JobTracker,JobTracker负责启动MapTask和ReduceTask。
JobTracker知道我们的程序是怎么运行的,即JobTracker和MR程序是紧紧耦合在一起的。
JobTracker只有一个节点,要负责:
- 资源调度
- 应用的运算流程管理监控
所以负担很重,如果JobTracker挂了,所有的程序都不能运行了。
对比看来,明显是YARN的架构更好。