yarn使用及安装(【深入浅出 Yarn 架构与实现】3-2 Yarn Client 编写)
上篇文章介绍了编写 Yarn Application 的整体框架流程 ,本篇文章将详细介绍其中 Client 部分的编写方式 。
一 、Yarn Client 编写方法
本篇代码已上传 Github:
Github - MyYarnClient一)编写流程
1 、创建并启动 ClientYarnClient 内容通过 ApplicationClientProtocol 与 ResourceManager 通信 ,向 RM 的ApplicationsManager 申请 Application 。
跟踪进去可以在 YarnClientImpl 找到 rpc:
this.rmClient = (ApplicationClientProtocol)ClientRMProxy.createRMProxy(this.getConfig(), ApplicationClientProtocol.class); YarnClient yarnClient = YarnClient.createYarnClient(); yarnClient.init(conf); yarnClient.start(); 2 、通过YarnClient 创建 ApplicationGetNewApplicationResponse 中除了包含 ApplicationId,还包括集群最大/最小资源 ,给任务启动设置的资源作参考 。
YarnClientApplication app = yarnClient.createApplication(); GetNewApplicationResponse appResponse = app.getNewApplicationResponse(); 3 、关键:完善 ApplicationSubmissionContext需要在 ApplicationSubmissionContext 中定义 RM 启动 AM 时所需的全部信息 ,主要包括:
app 信息:id ,name 队列 、优先级信息 提交用户 ContainerLaunchContext:定义 AM 启动所需信息 RECT Resources (binaries, jars, files etc.):其中包括 Application master jar Environment settings (CLASSPATH etc.) Command to be executed security Tokens // 3 完善 ApplicationSubmissionContext 所需内容 ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext(); ApplicationId applicationId = appContext.getApplicationId(); // 3.1 设置application name appContext.setApplicationName("my-test-app"); // 3.2 设置ContainerLaunchContext // localResources, env, commands 等 // application master 的 jar 放到 localResources 中 // 这部分较长省略 ,请到代码中查看 ContainerLaunchContext amContainerCtx = createAMContainerLaunchContext( conf, app.getApplicationSubmissionContext().getApplicationId()); appContext.setAMContainerSpec(amContainerCtx); // 3.3 设置优先级 Priority pri = Priority.newInstance(0); appContext.setPriority(pri); // 3.4 设置队列 appContext.setQueue("default"); // 3.5 设置 am 资源 int amMemory = 2048; int amVCores = 2; Resource capability = Resource.newInstance(amMemory, amVCores); appContext.setResource(capability); 4 、提交 Application提交后 ,RM 接收到 Application ,根据资源请求分配容器 ,最终将 AM 启动在容器中 。
这里交给 YarnClientImpl 执行 rmClient.submitApplication(request) ,通过 RPC ApplicationClientProtocol 提交到 RM ApplicationId appId = yarnClient.submitApplication(appContext); 5 、获取任务进度信息 ApplicationReport report = yarnClient.getApplicationReport(appId); log.info("Got application report " + ", clientToAMToken=" + report.getClientToAMToken() + ", appDiagnostics=" + report.getDiagnostics() + ", appMasterHost=" + report.getHost() + ", appQueue=" + report.getQueue() + ", appMasterRpcPort=" + report.getRpcPort() + ", appStartTime=" + report.getStartTime() + ", yarnAppState=" + report.getYarnApplicationState().toString() + ", distributedFinalState=" + report.getFinalApplicationStatus().toString() + ", appTrackingUrl=" + report.getTrackingUrl() + ", appUser=" + report.getUser()); 6 、kill Application当 Application 运行了过长的时间或者其他的原因 ,client 可以 kill application 。
流程是:client 像 RM 发送 kill 信号,再传递给 AM yarnClient.killApplication(appId);二)涉及的通信协议
参考文章:
Hadoop: Writing YARN Applications - Writing a simple Client
《Hadoop 技术内幕 - 深入解析 Yarn 结构设计与实现原理》第四章创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!