YARN分布式程序的编写.docx
《YARN分布式程序的编写.docx》由会员分享,可在线阅读,更多相关《YARN分布式程序的编写.docx(18页珍藏版)》请在冰豆网上搜索。
YARN分布式程序的编写
目的
这个文档从比较高的层面上描述了如何编写一个YARN应用
概念和流程
首先说的概念是“ApplicationSubmissionClient”他负责将“Application”提交到YARN的ResourceManager.客户端通过ClientRMProtocol协议与ResourceManager联系,如果需要Client会通过ClientRPProtocol:
:
getNewApplication来获取新的ApplicationId,然后通过ClientRMProtocol:
:
submitApplication将应用提交运行。
作为ClientRMProtocol:
:
submitApplication调用的一部分,客户端需要足够的信息给ResourceManager来运行应用的第一个container也就是Applicationmaster.你需要提供如下一些信息:
你的应用程序运行时所需要的localfile/jars,执行时所运行的命令(包括必要的命令参数),Unix环境变量设置(可选的)等等。
实际上你需要为ApplicationMaster提供Unix进程的描述信息。
YARN的ResourceManager会在一个获得的container上启动ApplicationMaster。
ApplicationMaster然后通过AMRMProtocol协议与ResourceManager通讯,首先ApplicationMaster需要将自身注册到ResouceManager。
ApplicationMaster为了完成交给他的任务,他会通过AMRMProtocol:
:
allocate来申请containers。
如果获得了container,ApplicationMaster会通过ContainerManager:
:
startContainer和NodeManager联系,来为任务启动一个container。
作为启动container的一部分,ApplicationMaster需要指定ContainerLaunchContext,ContainerLaunchContext和ApplicationSubmissionContext相似,包括了一些启动时需要的信息,诸如:
命令行命令、环境变量等。
一旦任务完成,ApplicationMaster会通过AMRMProtocol:
:
finishApplicationMaster来通知ResourceManager任务完成。
与此同时,client可以通过查询ResourceManager来获取application的状态信息,或者如果ApplicationMaster支持也可以直接从ApplicationMaster查询信息。
如果需要,client可以通过ClientRMProtocol:
:
forceKillApplication来kill掉application。
接口
你可能关心的接口包括以下这些:
ClientRMProtocol--Client<-->ResourceManager
这是client和ResourceManager通讯来启动一个新的application(这个application是ApplicationMaster等)的协议,可以通过这个协议查询或killapplication。
例如:
ajob-client将使用这个协议。
AMRMProtocol--ApplicationMaster<-->ResourceManager
这个协议用于ApplicationManager向ResourceManager注册和注销自己,同时包括从Scheduler申请资源来完成任务。
ContainerManager-ApplicationMaster<-->NodeManager
这个协议用于ApplicationMaster和NodeManager来开始或停止一个container,或者获取container的状态更新信息。
写一个简单的Yarn应用
写一个简单的client
第一步是client连接到ResourceManager或者更具体一点说,连接到ResourceManager的ApplicationManager(AsM)接口
[html] viewplaincopy
1.ClientRMProtocol applicationsManager;
2. YarnConfiguration yarnConf = new YarnConfiguration(conf);
3. InetSocketAddress rmAddress =
4. NetUtils.createSocketAddr(yarnConf.get(
5. YarnConfiguration.RM_ADDRESS,
6. YarnConfiguration.DEFAULT_RM_ADDRESS));
7. LOG.info("Connecting to ResourceManager at " + rmAddress);
8. configuration appsManagerServerConf = new Configuration(conf);
9. appsManagerServerConf.setClass(
10. YarnConfiguration.YARN_SECURITY_INFO,
11. ClientRMSecurityInfo.class, SecurityInfo.class);
12. applicationsManager = ((ClientRMProtocol) rpc.getProxy(
13. ClientRMProtocol.class, rmAddress, appsManagerServerConf));
一旦ASM的handler获得后,client需要从ResourceManager获取一个ApplicationId
[java] viewplaincopy
1.GetNewApplicationRequest request =
2. Records.newRecord(GetNewApplicationRequest.class);
3. GetNewApplicationResponse response =
4. applicationsManager.getNewApplication(request);
5. LOG.info("Got new ApplicationId=" + response.getApplicationId());
从ASM返回的response也包含一些整个集群的信息,诸如minimum/maximum资源容量等。
有了这些信息才能够适当的设置container的一些参数使得ApplicationMaster能够在这个container上运行。
可以参考GetNewApplicationResponse获得更多细节信息。
client的一个关键工作就是设置ApplicationSubmissionContext,使得ResourceManager能够启动ApplicationMaster。
client需要设置下面的一些context:
∙ApplicationInfo:
id和name
∙队列(Queue),优先级信息(Priorityinfo):
application将被提交到的队列,以及application被设定的优先级
∙User:
提交application的用户
∙ContainerLaunchContext:
ApplicationMaster被启动的container的一些信息。
ContainerLaunchContext正如前面所描述的,定义了启动ApplicationMaster需要的信息包括localresource(binary,jars,files等等),securitytokens,environmentsetting(CLASSPATH等)和被执行的command。
[java] viewplaincopy
1.// Create a new ApplicationSubmissionContext
2. ApplicationSubmissionContext appContext =
3. Records.newRecord(ApplicationSubmissionContext.class);
4. // set the ApplicationId
5. appContext.setApplicationId(appId);
6. // set the application name
7. appContext.setApplicationName(appName);
8.
9. // Create a new container launch context for the AM's container
10. ContainerLaunchContext amContainer =
11. Records.newRecord(ContainerLaunchContext.class);
12.
13. // Define the local resources required
14. Map localResources =
15. new HashMap();
16. // Lets assume the jar we need for our ApplicationMaster is available in
17. // HDFS at a certain known path to us and we want to make it available to
18. // the ApplicationMaster in the launched container
19. Path jarPath; // <- known path to jar file
20. FileStatus jarStatus = fs.getFileStatus(jarPath);
21. LocalResource amJarRsrc = Records.newRecord(LocalResource.class);
22. // Set the type of resource - file or archive
23. // archives are untarred at the destination by the framework
24. amJarRsrc.setType(LocalResourceType.FILE);
25. // Set visibility