客户端MapReduce提交到YARN过程(下)

客户端通过RPC协议ClientRMProtocol提交Application,其实是提交了一个SubmitApplicationRequest,在Hadoop 1.0时代,是使用Writable作为序列化和反序列化框架的,而在2.0中hadoop已经废弃掉了,改用了ProtocolBuffer,它除了支持多种语言外最大的好处是向后兼容性,这样不同版本的AM,Client,RM和NM之间能相互通信。

比如对于SubmitApplicationRequest, 源代码只有PB的实现SubmitApplicationRequestPBImpl,当然用户也可以实现其他的序列化反序列化框架的实现,包括Writable实现

SubmitApplicationRequest中会封装提交上下文信息ApplicationSubmissionContext. ClientRMProtocol在RM的实现类是ClientRMService, RM在启动的时候会初始化这个Service,该Service负责端口监听RPC请求(由yarn.resourcemanager.address设置)

服务端根据提交上下文信息构造RMAppManagerSubmitEvent对象,交由rmAppManager来处理,RMAppManager在RM中的作用是管理所有的Application,比如提交/完成application,恢复一组applications等等。

ClientRMService的submitApplication方法:

public SubmitApplicationResponse submitApplication(
      SubmitApplicationRequest request) throws YarnRemoteException {
         ApplicationSubmissionContext submissionContext = request
         .getApplicationSubmissionContext();
         ApplicationId applicationId = submissionContext.getApplicationId();
         String user = submissionContext.getUser();
         user = UserGroupInformation.getCurrentUser().getShortUserName();
         if (rmContext.getRMApps().get(applicationId) != null) {
         throw new IOException("Application with id " + applicationId
         + " is already present! Cannot add a duplicate!");
         }
         submissionContext.setUser(user);
         // 将Application信息提交给rmAppManager来启动ApplicationMaster
         rmAppManager.handle(new RMAppManagerSubmitEvent(submissionContext, System
         .currentTimeMillis()));  

         // If recovery is enabled then store the application information in a
         // blocking call so make sure that RM has stored the information needed
         // to restart the AM after RM restart without further client communication
         RMStateStore stateStore = rmContext.getStateStore();
         LOG.info("Storing Application with id " + applicationId);
         try {
         stateStore.storeApplication(rmContext.getRMApps().get(applicationId));
         } catch (Exception e) {
         LOG.error("Failed to store application:" + applicationId, e);
         ExitUtil.terminate(1, e);
         }
         LOG.info("Application with id " + applicationId.getId() +
         " submitted by user " + user);
         RMAuditLogger.logSuccess(user, AuditConstants.SUBMIT_APP_REQUEST,
         "ClientRMService", applicationId);  

         SubmitApplicationResponse response = recordFactory
         .newRecordInstance(SubmitApplicationResponse.class);
         return response;
}

YARN采用了基于事件驱动的编程模型,一个状态的改变可以触发一个或多个事件,同时可以触发其他状态发生变化。对于RMAppManagerSubmitEvent他有两种状态APP_SUBMIT和APP_COMPLETED,在RMAppManager Handle这个Event的时候,如果是APP_COMPLETED则执行finishApplication将ApplicationId加入completedApps队列中,若状态为APP_SUBMIT则执行submitApplication方法生成一个RMApp,放入RMContext的Map<ApplicationId, RMApp> applications总,然后生成一个状态为START的RMAppEvent交由AsyncDispatcher中央调度器来处理。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/tools/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索application
, 状态
, 一个
, user
ProtocolBuffer
yarn job提交过程、yarn mapreduce、mapreduce on yarn、yarn mapreduce 区别、yarn和mapreduce,以便于您获取更多的相关知识。

时间: 2024-10-03 13:29:22

客户端MapReduce提交到YARN过程(下)的相关文章

客户端MapReduce提交到YARN过程(上)

在Mapreduce v1中是使用JobClient来和JobTracker交互完成Job的提交,用户先创建一个Job,通过JobConf设置好参数,通过JobClient提交并监控Job的进展,在JobClient中有一个内部成员变量JobSubmissionProtocol,JobTracker实现了该接口,通过该协议客户端和JobTracker通信完成作业的提交 public void init(JobConf conf) throws IOException { String track

Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主从关系的客户端和服务端了,本文相关链接需要去google的API上查看,需要翻墙的 Bluetooth Low Energy:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html 但是我们依然没有讲到BLE(

mapreduce提交作业出现报错信息

问题描述 mapreduce提交作业出现报错信息 我最近采用这种方法提交作业,把mr作业的业务逻辑打包上传至hdfs中,在eclipse中提交任务(不安装hadoop插件),报错Error: java.io.IOException: Unable to initialize any output collector,如果把mr作业的业务逻辑打包上传至hdfs节点上,就可以顺利完成. 这是为什么? Configuration conf = new Configuration(); conf.set

请问 如何实现在一个客户端处理数据后传递给下一个客户端 依次传递 直到任务完成

问题描述 请问 如何实现在一个客户端处理数据后传递给下一个客户端 依次传递 直到任务完成 一组数据 在一个客户端处理完后 再传递到下一个客户端 处理完后再传递给下一个客户端 依次类推 直到任务完结 客户端都是同一个, 这个该如何实现? 例如 有5个组 数据从一号组开始, 1号组处理完 ,就把数据传递给2号组(1号组没处理完时,2号组不会显示要处理的数据),2号处理完 再传递给3号,直到传到5号组结束. 数据是多组的 只有当前数据组处理完 才会处理下组数据. 求帮助啊, 该如何实现??? 解决方案

应用-将视频放在服务器上供客户端访问,实现的过程

问题描述 将视频放在服务器上供客户端访问,实现的过程 将视频放在服务器上,是基于外网的,不是局域网,模式做成C/S,还是B/S好,里面嵌入哪些可用的播放器 要加入缓冲的话,是否要应用流媒体技术 希望有大神指点一下,说一下基本的实现过程,包括一些关键的技术,服务器,等等 多谢! 解决方案 建议是B/S比较好,可以参考优酷.土豆等. 解决方案二: 可以加一个视频网站方面的群问问

svn服务器检测不到更新,客户端无法提交

问题描述 svn服务器检测不到更新,客户端无法提交 我再svn代码库里添加了一个a.txt文件,但是在客户端里检测不到更新,客户端无法提交,点了commit没反应. 解决方案 没连接到库?客户端试一下与资源库同步 解决方案二: 先显示隐藏文件 在吧.SVN文件夹删了 在重新checkOUt

图解mapreduce原理和执行过程

说明: &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   下面的图来自南京大学计算机系黄宜华老师开设的mapreduce课程的课件,这里稍作整理和 总结. 本文旨在对接触了mapreduce之后,但是对mapreduce的工作流程仍不是很清楚的人员,当然包括博主自己,希望与大家一起学习. mapreduce的原理 MapReduce借鉴了函数式程序设计语言Lisp中的思想,Lisp(List processin

我晕CSDN 居然没有对客户端重复提交问题做防止?

问题描述 CSDN把防止刷新重复提交信息参数,的原理代码,讲一下啊,

yarn架构 及 client提交任务过程讲解

先看个yarn的整体架构 Client向RM提交任务的过程大致分为七步,先上图在解释: 1. Client向RM发出请求 2. RM返回一个ApplicationID作为回应 3. Client向RM回应Application Submission Context(ASC).ASC包括ApplicationID.user.queue,以及其他一些启动AM相关的信息,除此之外,还有一个Container Launch Context(CLC),CLC包含了资源请求数(内存与CPU),job fil