一、什么是yarn?
yarn(yet another resource negotiator)是hadoop的集群资源管理系统。它是在hadoop2时被引入,最初是为了改善mapreduce的实现,由于其具备较高的通用性,现用于支持多种分布式计算模式,如mapreduce、spark和Tez等,yarn为这些计算模式提供了使用集群资源的API。
二、yarn的核心成员
1、resource manager:资源管理器,负责集群资源的调度和分配,一个集群只有一个。
2、node manager:节点管理器,负责实现application的启动和节点的资源管理,node manager运行在datanode中。
3、application master:主应用,接受resource manager分配的任务,并传达给各个node manager继续分配和执行任务。每个应用只有一个application master,它运行在一个node manager上。
4、containers:由resource manager分配的cpu、io、网络等资源的容器。
5、job:一个map或reduce任务。
6、task:一个实际完成map或reduce工作的独立工作单元,task运行在node manager的container中。
三、yarn应用运行机制
1、客户端向yarn提交作业;
2、resource manager启动application master进程;
3、resource manager为作业分配一个可用的node manager,并通知node manager启动一个容器用于运行application master;
4、application master向resource manager申请容器中任务运行需要的资源;
5、application master通知已经申请到的node manager启动map任务;
6、map任务完成之后,application master获取结果并报告给resource manager,resource manager分配新的资源给application master;
7、application master通知新的node manager使用新资源启动reduce任务;
8、reduce任务完成后,将结果输出到hdfs;
9、application master完成任务并请求销毁自己。
四、yarn与mapreduce1的比较
1、yarn与mapreduce1在组成上的比较:
mapreduce1 yarn
jobtracker resource manager、application master、timeline servier
tasktracker node manager
slot container
2、扩展性
yarn将jobtracker的资源调度和作业控制功能进行了拆分,resource manager负责资源调度,application master负责作业控制,从而降低了jobtracker时单个节点的负担,同时突破了可扩展性瓶颈。
3、可用性
mapreduce1时代的jobtracker内存中存在大量快速变化的复杂状态,使得当jobtracker出现故障时,想要快速恢复正常工作状态显得极为困难,从而难以获取高可用性。
yarn将jobtracker的功能进行了拆分,因此可以针对resource manager和application master分别提供高可用性支持,提高了整体的可用性。
4、利用率
mapreduce1时的资源配置被静态的划分为了map slot和reduce slot,这样就会出现在执行任务时,由于集群中只有map slot可用导致的reduce任务必须等待的情况。而yarn的每个node manager管理一个资源池,一个应用能够按需请求资源,而不是请求一个固定的slot。
五、yarn的调度器
1、FIFO调度器
FIFO调度器采用先进先出模式,应用按照串行方式依次排队申请服务。
优点:简单易懂,无需额外配置。
缺点:不适合共享集群。当一个大应用正在执行时会占用集群中的所有资源,导致后续其他任务等待时间较长,无法在合理的时间内获取任务的结果。
2、容量(capacity)调度器
容器调度器会预留容器中的部分资源。当一个大应用执行时不会占据集群中的所以资源,一个专门的预留队列使用预留的资源处理资源占用较小少的小作业。这样大应用执行时间相对增加,但是能够在较为合理的时间未小作业提供结果。
3、公平调度器
公平调度器在运行的作业之间动态平衡资源。第一个大作业启动时会得到所有的资源,当第二个作业执行时,会分配到一半的资源,这样每个作业都能公平的共享集群资源。
主要注意的是:第二个资源不是实时获取到集群资源,而是要等到第一个作业使用的容器完成并释放出资源之后。当小作业使用完资源并释放之后,大作业会再次使用全部的集群资源。这样既保证了集群资源的高效利用,又保证了小作业能够在合理的时间完成。