Hadoop 2.6.0下面的关于Yarn工程,如下所示,主要有以下七个module:
  1. hadoop-yarn-api:和外部平台交互的接口
  2. hadoop-yarn-applications
  3. hadoop-yarn-client
  4. hadoop-yarn-common:yarn client和server可以用到的一些实用工具
  5. hadoop-yarn-registry
  6. 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
  1. 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源码 - day1的更多相关文章

  1. Hadoop Yarn源码 - day2

    接着昨天的继续看hadoop-yarn-api,昨天看了api package下的4个协议,今天来看下con package下的代码 conf目录下的内容比较少,就4个文件分别是Configurati ...

  2. 获取hadoop的源码和通过eclipse关联hadoop的源码

    一.获取hadoop的源码 首先通过官网下载hadoop-2.5.2-src.tar.gz的软件包,下载好之后解压发现出现了一些错误,无法解压缩, 因此有部分源码我们无法解压 ,因此在这里我讲述一下如 ...

  3. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)

    我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMas ...

  4. Hadoop RPC源码分析

    Hadoop RPC源码分析 上一篇文章http://www.cnblogs.com/dycg/p/rpc.html 讲了Hadoop RPC的使用方法,这一次我们从demo中一层层进行分析. RPC ...

  5. Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?

    在MRAppMaster中,当MapReduce作业初始化时,它会通过作业状态机JobImpl中InitTransition的transition()方法,进行MapReduce作业初始化相关操作,而 ...

  6. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(二)

    本文继<Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)>,接着讲述MapReduce作业在MRAppMaster上处理总流程,继上篇讲到作业初始化之后的作 ...

  7. Hadoop编译源码

    Hadoop编译源码 克隆一个虚拟机 然后一步一步安装就行 安装所需:链接: https://pan.baidu.com/s/1jIZlQmi 密码: gggv 5.1 前期准备工作 1)CentOS ...

  8. YARN源码分析(一)-----ApplicationMaster

    转自:http://blog.csdn.net/androidlushangderen/article/details/48128955 YARN学习系列:http://blog.csdn.net/A ...

  9. 关于Yarn源码那些事-前传之ResourceManager篇(一)初始化

    在关于Yarn那些事的博客里,介绍的主要是针对任务提交的一个动态流程说明,而其中牵涉到的一些细节问题,必须通过Resourcemanager的启动和NodeManager的启动,来更好的说明. 而本系 ...

随机推荐

  1. Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

    目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...

  2. LintCode——旋转字符串

    描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例:对于字符串 "abcdefg"     offset=0 => "abcdefg&qu ...

  3. 利用可道云kodexplorer在树莓派raspbian上搭建私有云网盘

    可道云kodexplorer是一款开源私有云系统,类似于owncloud,Dropbox.SkyDrive,seafile等.将可道云kodexplorer搭建在树莓派上,从而在树莓派上存储.管理家庭 ...

  4. k8s网络之calico学习

    一.知识准备 1.calico主要通过ipip协议与bgp协议来实现通信.前者通过ipip隧道作为通信基础,后者则是纯三层的路由交换 2.bgp协议主要由两种方式:BGP Speaker 全互联模式( ...

  5. 软件工程 BUAAMOOC项目Postmortem结果

    设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件是基于北航MOOC网站做的Android手机客户端,用于便捷的在学校里通过手机做到随时随地 ...

  6. [2017BUAA软工助教]个人得分总表(至alpha结束)

    一.表 学号 第0次 week1 week2 week3 个人项目 附加1 结对项目 附加2 a团队 a团队得分 a贡献分 总分(不计) 总分(记) 15061119 7 9.5 12 9 45.75 ...

  7. Linux第七周学习总结——可执行程序的装载

    Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

  8. WordCount 程序的实现

    WordCount是一个常见的工具,它能统计文本文件的字数.单词数和行数.在本次项目中,要求写一个命令行程序,模仿已有的WordCount.exe的功能,并加以扩充,统计出某程序设计语言源文件的字符数 ...

  9. hybrid浅记

    目前首次接触hybrid项目,故根据翻阅了解后,浅记对它的认识. hybrid是携程推出的一个项目框架,其优点是:跨平台.开发效率高.开发成本相对较低,其不足是:体验不如Native hybrid设计 ...

  10. week5-Internetwork Layer

    Technology:Internets and Packets course Layer 2 : Internet Protocol The InterNetwork Internetwork La ...