一、 Yarn简介
Yarn把 jobtracker的任务分解开来,分为:
- ResourceManager(简写RM)负责管理分配全局资源
- ApplicationMaster(简写AM),AM与每个具体任务对应,负责管理任务的整个生命周期内的所有事宜
除了上面两个以外,tasktracker被NodeManager(简写NM)替代,RM与NM构成了集群的计算平台。这种设计允许NM上长期运行一些辅助服务,这些辅助服务一般都是应用相关的,通过配置项指定,在NM启动时加载。例如在yarn上运行mapreduce程序时,shuffle就是一个由NM加载起来的辅助服务。
与每个应用相关的AM是一个框架类库,它与RM沟通协商如何分配资源,与NM协同执行并且监测应用的执行情况。在yarn的设计中,mapreduce只是一种编程模式,yarn还允许像MPI(message passing interface),Spark等应用构架部署在yarn上运行。
二、Yarn设计
上图是一个典型的YARN集群。可以看到RM有两个主要服务:
- 可插拔的Scheduler,只负责用户提交任务的调度
- ApplicationsMaster的(简写AsM)负责管理集群中每个任务的ApplicationMaster(简写AM),负责任务的监控、失败重起等
在haodop2.x中,yarn采用了container的概念来分配资源。每个container由一些可以动态改变的属性组成,到现在为止,仅支持内存、cpu两种。但是yarn的这种资源管理方式是通用的,社区以后会加入更多的属性,比如网络带宽,本地硬盘大小等等。
三、Yarn主要组件
ResourceManager
-
ResourceManager负责整个集群的资源管理和分配,是一个全局的资源管理系统。
-
NodeManager以心跳的方式向ResourceManager汇报资源使用情况(目前主要是CPU和内存的使用情况)。RM只接受NM的资源回报信息,对于具体的资源处理则交给NM自己处理。
-
YARN Scheduler根据application的请求为其分配资源,不负责application job的监控、追踪、运行状态反馈、启动等工作。
NodeManager
-
NodeManager是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN集群每个节点都运行一个NodeManager。
-
NodeManager定时向ResourceManager汇报本节点资源(CPU、内存)的使用情况和Container的运行状态。当ResourceManager宕机时NodeManager自动连接RM备用节点。
-
NodeManager接收并处理来自ApplicationMaster的Container启动、停止等各种请求。
ApplicationMaster
-
用户提交的每个应用程序均包含一个ApplicationMaster,它可以运行在ResourceManager以外的机器上。
-
负责与RM调度器协商以获取资源(用Container表示)。
-
将得到的任务进一步分配给内部的任务(资源的二次分配)。
-
与NM通信以启动/停止任务。
-
监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
-
当前YARN自带了两个ApplicationMaster实现,一个是用于演示AM编写方法的实例程序DistributedShell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。
注:RM只负责监控AM,并在AM运行失败时候启动它。RM不负责AM内部任务的容错,任务的容错由AM完成。
在这小节里,主要介绍yarn各个组件,以及他们之间是如何通信的。
3.1 Client<===>RM
上面这个图是Client向RM提交任务时的流程。
(1) Client通过New Application Request来通知 RM 中的AsM(Applications Manager)组件
(2) AsM一般会返回一个新生成的全局ID,除此之外,传递的信息还有集群的资源状况,这样Client就可以在需要时请求资源来运行任务的第一个 container 即 AM。
(3) 之后,Client就可以构造并发送ASC了。ASC中包括了调度队列,优先级,用户认证信息,除了这些基本的信息之外,还包括用来启动 AM 的 CLC 信息,一个CLC中包括jar包、依赖文件、安全token,以及运行任务过程中需要的其他文件。
经过上面这三步,一个Client就完成了一次任务的提交。之后,Client可以直接通过RM查询任务的状态,在必要时,可以要求RM杀死这个应用。如下图:
3.2 RM <===>AM
RM 在收到 Client 端发送的 ASC (Applicatoin Submission Context)后,它会查询是否有满足其资源要求的 container 来运行 AM,有满足的资源,RM会与那个 container 所在机器上的NM通信,来启动AM。
下面这个图描述了这其中的细节。
(1) AM 向 RM 注册,这个过程包括handshaking过程,并且传递一些信息,包括 AM 监听的 RPC 端口、用于监测任务运行状态的URL等。
(2) RM 中的 Scheduler 部件做回应。这个过程会传递 AM 所需的信息,比如这个集群的最大与最小资源使用情况等。AM利用这些信息来计算并请求任务所需的资源。
(3) 这个过程是AM向RM请求资源。传递的信息主要包含请求 container 的列表,还有可能包含这个 AM 已经释放的 container 的列表。
(4) 在 AM 经过(3)请求资源之后,在稍微晚些时候,会把心跳包与任务进度信息发送给RM
(5) Scheduler在收到AM的资源请求后,会根据调度策略,来分配container以满足AM的请求。
(6) 在任务完成后,AM会给RM发送一个结束消息,然后退出。
在上面(5)与(6)之间,AM在收到RM返回的container列表后,会与每个container所在机器的NM通信,来启动这个container,下面就说说这个过程。
3.3 AM<===>NM
(1) AM向container所在机器的NM发送 CLC(ContainerLaunchContext) 来启动container
(2)(3) 在container运行过程中,AM可以查询它的运行状态
3.4 API
通过上面的描述,开发者在开发YARN上的应用时主要需要关注以下接口:
-
ApplicationClientProtocol
Client使用这个协议来与RM通信,来启动一个新应用,检查任务的运行状态或杀死任务
-
ApplicationMasterProtocol
AM使用这个协议来向RM注册/撤销,请求资源来运行任务。
-
ContainerManagementProtocol
AM使用这个协议来与NM通信,来启动/停止container,查询container的状态。
四、hadoop on yarn 任务的提交流程
1. 文件 到 切片 的过程
进入 this.connect() 看看里面都做个什么?
进入 JobSubmitter
面试题:(任务运行所需的 Jar, xml 文件 是怎么发送到集群的 这里运行时 local 模式)
writeSplits 中定义了 如何将文件 逐一切片
local 模式运行 job 运行所需的环境依赖,split 规则, 文件的CRC校验
下面看看 切片 到底是如何 切的?
进入 writeNewSplits
InputFormat 抽象父类 干了两件事: 1.切片 2.为每个切片生成 RecordReader
针对单个文件进行切片
计算切片的大小
文件剩余的大小大于 切片 大小的 1.1 倍才可以 切, 判断的时候按照 1.1 倍 ,真正切的时候 按照 1 倍 去切, 防止切的文件过小, 太小了 我们就不切了