YARN分布式程序的编写.docx

上传人:b****1 文档编号:2440972 上传时间:2022-10-29 格式:DOCX 页数:18 大小:27.54KB
下载 相关 举报
YARN分布式程序的编写.docx_第1页
第1页 / 共18页
YARN分布式程序的编写.docx_第2页
第2页 / 共18页
YARN分布式程序的编写.docx_第3页
第3页 / 共18页
YARN分布式程序的编写.docx_第4页
第4页 / 共18页
YARN分布式程序的编写.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

YARN分布式程序的编写.docx

《YARN分布式程序的编写.docx》由会员分享,可在线阅读,更多相关《YARN分布式程序的编写.docx(18页珍藏版)》请在冰豆网上搜索。

YARN分布式程序的编写.docx

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 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1