Hadoop 2.6.0下面的关于Yarn工程,如下所示,主要有以下七个module:
- hadoop-yarn-api:和外部平台交互的接口
- hadoop-yarn-applications
- hadoop-yarn-client
- hadoop-yarn-common:yarn client和server可以用到的一些实用工具
- hadoop-yarn-registry
- hadoop-yarn-server:hadoop-yarn-api的具体实现
hadoop-yarn-server-application
hadoop-yarn-server-common:resource manager 和node manager 共享的API
hadoop-yarn-server-nodemanager:代替TaskTracker
hadoop-yarn-server-resourcemanager:代替JobTracker
hadoop-yarn-server-tests
hadoop-yarn-web-proxy
- hadoop-yarn-site
图1 yarn工程中的README文件截图
底下有一句话十分重要,
Almost all of the yarn components as well as the mapreduce framework use
state-machines for all the data objects.
Yarn的大部分组件都是使用状态机来表述的,这个在看董西成老师的Hadoop技术内幕-Yarn的那本书的时候,他将各种状态机描述的都相当清楚,然而还是想对着源码去分析,因为虽然看完,我能看明白,但是真的记不住~囧
通过简单对yarn工程的组织架构分析,我们先来看hadoop-yarn-api部分的代码:
图2 hadoop-yarn-api的代码组织截图
hadoop-yarn-api下有api,conf,exceptions,factories,factory.providers,server.api,util这几个package组成,先看api这个package
它主要定义了以下四种协议(Protocal):
- ApplicationClientProtocol:主要用于client向RM提交新应用,查询应用信息,节点信息,预留资源,终止应用等
- ApplicationHistoryProtocol:主要用于获取那些已经运行完的应用信息
- ApplicationMasterProtocol:主要作用于健在的ApplicationMaster实例和ResourceManager之间,用于AM向RM注册或者取消注册,请求和占有资源
- ContainerManagerProtocol: 主要作用于AM和NodeManager,用于启动和终止容器,获取运行中的容器状态
ApplicationClientProtocol ( client->RM ) 这个协议定义了以下的方法:
图3 ApplicationClientProtocol 里面定义的方法截图
getNewApplication: 客户端提交新应用需要获得一个ApplicationId,这个就是获取id的方法,ResourceManager返回一个新的,单调递增的ApplicationId和一些细节诸如:集群上的最大资源容量等。传入的参数是GetNewApplicationResponse,返回的参数类型是GetNewApplicationRequest这些可以在图3上看到,后面就不再赘述了
submitApplication:客户端提交一个新应用给ResourceManager。客户端通过SubmitApplicationRequest将一些细节的东西,比如:queue,需要在ApplicationMaster上运行的资源,发射ApplicationMaster的相关的ContainerLaunchContext等。ResourceManager在接到submission之后,如果它拒绝这个submission,它就抛出一个异常,否则立刻发送一个empty SubmitApplicationResponse。然而,需要注意的是调用该方法之前,需要调用getApplicationReport来保证应用已经得到了合适的提交。由于RM可能发生故障或者重启,从ResourceManager里获得一个SubmitApplicationResponse并不能保证RM记住了这个应用。如果RM发生了故障或者RM重启发生在RM成功保存应用状态之前,那么后续getApplicationReport将会抛出一个ApplicationNotFoundException.因此,当遇到这种情况时,客户端需要重新提交该应用with同样的ApplicationSubmissionContext。另外,在提交应用的过程中,它会检查应用是否已尽存在,如果应用已经存在,它会简单的返回SubmitApplicationResponse. 在安全模式下,RM会在接收application submission之前,验证用户是否在访问队列中
forceKillApplication:客户端用来请求RM终止这个已经提交的应用。客户端通过KillApplicationRequest提供特定的ApplicationId,告诉RM这个应用需要被终止,在安全模式下需要检查下用户权限。一般,RM拒绝这个请求,就会抛出一个异常,否则返回一个空的response.(安全模式下的情况就不再赘述了)
getApplicationReport:客户端从RM获得应用Report的接口,通过在GetApplicationReportRequest中提供ApplicationID,来告知是哪个应用
getClusterMetrics:客户端从RM获取集群的metrics(RM响应的GetClusterMetricsResponse中包含YarnClusterMetrics中比如集群中当前的节点数目)
getApplications: 用于客户端从RM中获取匹配的应用(通过过滤器得到对应的application)的report
getClusterNodes:客户端从集群中的所有节点的report
getQueueInfo:客户端从RM中获取队列信息的接口(包括:已经使用/总共资源大小,child queues,正在运行的应用)
getQueueUserAcls: 获取当前用户队列的ACL信息
getDelegationToken: 客户端获取授权token,使得containers 能够获取和要用到这些token的service交互
renewDelegationToken
cancelDelegationToken
moveApplicationAcrossQueues: 将应用移动到另一个队列中
getApplicationAttemptReport: 获取Application Attempt状态的report
getApplicationAttempts:获取所有Application Attempt状态的report
getContainerReport:获取指定containerId的report
getContainers:获取一个Application Attempt的Containers的report
submitReservation:客户端给RM预定资源,以备在特殊情况下能从集群中获取到资源运行程序
updateReservation:
deleteReservation:
getNodeToLabels:获取节点对应的Label集合
getClusterNodeLabels:获取集群中所有节点的Label
ApplicationHistoryProtocol (client -> ApplicationHistoryServer)定义了如下几种方法:
图4 ApplicationHistoryProtocol方法截图
东西和上面的差不多,只是ApplicationClientProtocol是和ResourceManager交互,该协议是和ApplicationHistoryServer,不再赘述了
ApplicationMasterProtocol(AM->RM) 定义了三种方法:
图5 ApplicationMasterProtocol 方法截图
allocate:AM传入ResourceRequest列表,返回分配给AllocateRequest未使用的容器。除此之外,还可以将它不想用的资源加入黑名单(ApplicationMaster can also blacklist resources which it does’t want to use)
它也发送心跳让ResourceManager知道ApplicationMaster健在。因此,应用需要周期性的调用改方法来证明健在。频率取决于YarnConfiguration的RM_AM_EXPIRY_INTERVAL_MS,这个值默认是DEFAULT_RM_AM_EXPIRY_INTERVAL_MS。
finishApplicationMaster:AM向RM通知它已经完成了(成功或失败)。AM需要提供它最后的状态以及失败情况下的诊断等
registerApplicationMaster:AM向RM注册,AM需要提供一些参数,诸如:RPC 调用的端口,HTTP tracking的url等等。RM返回一些关键的参数诸如集群中的最大资源容量
ContainerManagerProtocol协议 (AM-> NM)
图6 ContainerManagerProtocol方法截图
getContainerStatuses:AM向NM请求当前运行的Container的状态,传入的参数是ContainerID的列表,返回的参数是查询成功的ContainerStatus列表和查询失败的ContainerID和异常的映射
startContainers:AM向NM请求启动Containers,传的是StartContainerRequest的列表。AM需要提供一些参数,比如:分配资源的容量,安全token(如果开启,需要提供),启动容器的命令,处理环境,必要的二进制文件/jar/shared-objects(共享对象?共享内存?)。NodeManager发送一个响应StartContainerResponse包含成功启动的Container列表,一个containerId和异常映射表(对于每一个启动失败的容器,便于指明失败的原因),所有服务的元数据映射(allServicesMetaData map between the names of auxiliary service and their corresponding meta-data)。key是辅助服务的名称,Value是对应的元数据。
stopContainers:AM向NM请求关闭Containers,传的是ContainerId列表(封装在StopContainersRequest里面)。对应的NodeManager返回的是成功关闭的ContainerId列表和停止失败的ContainerID与异常的映射。
- Hadoop Yarn源码 - day2
接着昨天的继续看hadoop-yarn-api,昨天看了api package下的4个协议,今天来看下con package下的代码 conf目录下的内容比较少,就4个文件分别是Configurati ...
- 获取hadoop的源码和通过eclipse关联hadoop的源码
一.获取hadoop的源码 首先通过官网下载hadoop-2.5.2-src.tar.gz的软件包,下载好之后解压发现出现了一些错误,无法解压缩, 因此有部分源码我们无法解压 ,因此在这里我讲述一下如 ...
- Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)
我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMas ...
- Hadoop RPC源码分析
Hadoop RPC源码分析 上一篇文章http://www.cnblogs.com/dycg/p/rpc.html 讲了Hadoop RPC的使用方法,这一次我们从demo中一层层进行分析. RPC ...
- Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?
在MRAppMaster中,当MapReduce作业初始化时,它会通过作业状态机JobImpl中InitTransition的transition()方法,进行MapReduce作业初始化相关操作,而 ...
- Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(二)
本文继<Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)>,接着讲述MapReduce作业在MRAppMaster上处理总流程,继上篇讲到作业初始化之后的作 ...
- Hadoop编译源码
Hadoop编译源码 克隆一个虚拟机 然后一步一步安装就行 安装所需:链接: https://pan.baidu.com/s/1jIZlQmi 密码: gggv 5.1 前期准备工作 1)CentOS ...
- YARN源码分析(一)-----ApplicationMaster
转自:http://blog.csdn.net/androidlushangderen/article/details/48128955 YARN学习系列:http://blog.csdn.net/A ...
- 关于Yarn源码那些事-前传之ResourceManager篇(一)初始化
在关于Yarn那些事的博客里,介绍的主要是针对任务提交的一个动态流程说明,而其中牵涉到的一些细节问题,必须通过Resourcemanager的启动和NodeManager的启动,来更好的说明. 而本系 ...
随机推荐
- [CF995F]Cowmpany Cowmpensation[树形dp+拉格朗日插值]
题意 给你一棵树,你要用不超过 \(D\) 的权值给每个节点赋值,保证一个点的权值不小于其子节点,问有多少种合法的方案. \(n\leq 3000, D\leq 10^9\) 分析 如果 \(D\) ...
- [CF1007D]Ants[2-SAT+树剖+线段树优化建图]
题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...
- 一道面试题来了解线程notifyAll()和wait()的方法
题目:三个线程,分别打印A.B.C,要求按ABC的顺序循环打印10次. package com.slowcity.crud.controller; public class PrintOneTwoTh ...
- 移动端H5页面上传图片或多张图片
传统PC网页上传文件,大家都已经熟悉,这里不做介绍. 本文简单介绍移动端常用上传图片功能.灵活使用轮询或长连接可实现PC与移动端数据同步,即PC端需要上传的图片是移动拍照下来或移动端硬盘储存的,不需要 ...
- [C#源代码]使用SCPI指令对通信端口(RS232/USB/GPIB/LAN)进行仪器编程
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本软件是基于NI-VISA/VISA32(Virtual Instrument Softwar ...
- JavaScript快速入门-ECMAScript对象介绍
一.概念介绍 在 ECMAScript 中,所有对象并非同等创建的.一般来说,可以创建并使用的对象有三种:本地对象.内置对象和宿主对象. 要理解这三种对象,先要理解宿主环境. 1.宿主环境 一般宿主环 ...
- C#_委托
委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子. 那么首先说说什么是委托,其实委托在用过C或者C++的人看来就是函数指针,不过使用C#的大多数人都没有用过这两门语言, ...
- 网易云易盾朱星星:最容易被驳回的10大APP过检项
本文由 网易云发布. 1月20日,“走进网易:移动测试与安全实践”公开活动在杭州西湖区颐高创业大厦4F楼友会创业咖啡厅举行.本次活动的议题聚焦在如何实现应用的高效开发.安全过检.开发功耗降到最低等热 ...
- 获取apk的签名信息
在接入第三方功能时,经常要注册提交apk的签名信息 (sha1签名)?,下面列出相关步骤. 获取apk签名信息的步骤: 1)修改apk后缀名为zip,解压得到其中的META-INF文件夹; 2)把ME ...
- PAT甲题题解-1043. Is It a Binary Search Tree (25)-二叉搜索树
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789220.html特别不喜欢那些随便转载别人的原创文章又不给 ...