YARN :Yet Another Resource Negotiator,有部电影《The Negotiator》叫王牌对王牌,可以看出YARN取名设计之初即有对它的定位,除了有一个霸气的英文名字同时也有个一见倾心的中文名字“雅恩”
它是Hadoop 2.0后的新一代计算框架,目前可以支持多种计算框架运行在YARN上面,比如MapReduce(离线计算)、Storm(实时计算)、Spark(内存计算)、Flink(批处理和流处理)等 。
背景:
首先,我们来看看Hadoop 1.0的MapReduce结构来了解它有哪些缺陷导致催生了YARN的产生:首先是MapReduce1.0的JobTracker是采用的Master-Slave模式,同时监管资源配置和任务调度,两个功能耦合在一起,如果任务一多JobTracker就成为了整个计算框架的瓶颈;其次是由于是采用的单点故障,一旦JobTracker节点故障整个计算框架都将不可用;再次是JobTracker只支持MapReduce,如果想支持其他框架就需要修改JobTracker,这样的代价太大。下面来看看MapReduce1.0的结构图:
其次,我们从集群的利用率上来看,在一个集群中如果只支持一种计算框架,如Hadoop的MapReduce或Storm或Spark的框架,那么要实现多个功能势必需要多个集群,但不幸的是每个集群使用资源又不是很充分,而且它们使用的高峰期很有坑是错开的,因此很多时候这些集群都是出于空闲状态,而且不止一个集群空闲而是多个集群空闲,资源利用率很低,因此很有必要使用一个平台能集成多种计算框架使它们在一个共享集群下工作并且错开工作峰最大程度的提高资源利用率;其次从数据利用率来说,如果各个集群各自为政,那么在进行数据处理的时候很容易出现的一个问题就是,需要将临时数据甚至是同样的原始数据在多个集群中来回拷贝传输来完成一个可能复杂需要多种框架计算配合的工作,增加了集群的负担,数据利用率不高,如下图看看各集群框架使用资源高峰的情况和使用Yarn共享集群后的情况:
原理:
Yarn包括ResourceManager、ApplicationManager、NodeManager三大节点,其中ResourceManager一个集群只有一个,为了避免单点故障采用了主从备份的方式,正常运行时刻只有主ResourceManager对外提供服务从ResourceManager只进行同步工作,当主ResourceManager出现故障时立即切换至从ResourceManager,ResoureManager维护集群中NodeManager的状态通过心跳包、状态包等机制确定是否异常是否处于忙碌状态是否可以分配更多任务等。下面以一个请求处理来详细说明各个组件之间的系统工作方式:
1.当一个用户发送一个应用请求时,ResourceManager接收任务添加进任务队列获取启动该任务ApplicationManager所需要的资源包括CPU、内存等
2.之后ResourceManager分配一个节点启动这个任务的ApplicationManager,ApplicationManager根据应用需要获取必要的CPU、内存资源并获取运行环境参数和所需的jar包等等向ResourceManager申请资源分配Task节点,同时创建一个运行程序的容器运行程序,如果子任务的资源消耗比较少,一般为线程数小于10并且内存使用比较少时,ApplicationManager会在其自身的节点上运行这个Task
3.ApplicationManager拿到ResourceManager分配的资源创建Task节点并与Task进行通讯获取它们的运行状态健康状态等,运行完成后ApplicationManager发送处理完成消息给ResourceManager释放资源
这样一个请求过程就完成了,在这个过程中ResourceManager有一些调度机制,Yarn自带了容量调度器、公平调度器,这里讲一下它的默认调度器--容量调度器的一些分配资源的原则:在容量调度器中采用了资源预留的机制来尽量满足资源请求者的需求,如果有一个任务请求资源,ResourceMananger会获取所有节点的资源,发现有符合条件的节点即分配,如果没有符合条件的资源就会继续等待收集资源,等到资源满足了以后再分配给资源请求者,这样做有一个明显的缺点那就是有可能一个资源迟迟得不到满足,那么预留的那些资源就一直不能被分配使用,导致了资源利用率不高,但是好处也很明显,这样避免了一个大资源请求一直得不到需求的资源被“饿死”的情况;在NodeManager中有监控每个Task的资源使用情况,当某个Task资源使用超出了申请的量时为保证整个集群其他节点的容量均衡性,NodeManager会Kill掉异常的Task(是NodeManager来Kill还是通过ApplicationManager来Kill或是ResoureceManager来Kill还有待阅读源码后确认,只是表达这个意思),进而触发ApplicationMaster的Task节点异常程序重新分配资源进行处理。同时,Yarn还提供了接口用户还可以实现提供的接口提供自己的调度器。