如何在yarn上运行Hello World(一)

时间:2022-10-01 03:07:43
1.YARN是什么
YARN  (Yet Another Resource Negotiator,另一种资源协调者) 是hadoop上的一种资源调度器,它是一个通用资源管理系统,可以为上层应用提供统一的资源管理和调度.
 
2.yarn的结构
如何在yarn上运行Hello World(一)
 
YARN的结构是一个典型的主从结构(MASTER/SLAVER)
其中的ResourceManager(简称为RM),是一个全局的资源调度器,负责整个系统的资源管理和分配.
然后NodeManager(简称为NM),则是每个节点上的资源和任务管理器,他有两个作用,首先NM会定时的向RM汇报该节点的资源使用情况和每个Container的运行状态,然后NM还会接收并处理来自AM的要求停止和启动指定container等各种请求.
 
 
3.如何编写基于yarn的程序
编写一个运行于yarn上的应用程序,主要需要编写两个组件,YARNClient和ApplicationMaster(简称AM).
 
1. YARNClient 运行在用户端,为用户和YARN集群上的应用交互提供了一系列的接口.主要作用包括创建应用(Application),申请用于运行AM的Container并提交AM到这个Container进行运行.如果有必要的话,还以通过该YARNClient获取 AM 在 YARN集群的运行状态.
2.AM是一个独立的进程,是每个用户应用的主进程,作用是协调运行在YARN集群中的应用程序的执行状况,主要包括 和RM协商资源,并且配合NM一起工作来启动并跟踪Container的运行情况,并根据运行情况对用户程序作出对应的调整.
 
假如我们要在YARN集群上运行一个简单的java程序(输出一句 hello world),那么程序结构一般如下图所示.
 
如何在yarn上运行Hello World(一)
 
如上图所示, 其中:
1. AM.jar 表示 应用的 Application Master 的jar包
2.HelloWorld.jar 表示包含输出的 HelloWorld 的类的jar包,这个jar包里面实际上是一个HelloWorld类,核心内容就是一个主函数,运行后输出一句Hello World
3.在应用提交运行前,我们事先将 AM.jar 和 HelloWorld.jar 上传到 HDFS 存储,用来方便之后来使用.
4.YARNClient 提供了用户和YARN集群进行交互的接口,实际上 YARNClient 并不能算作YARN集群中一个独立的模块,只是提供个类 YarnClient,用户可以在自己的应用中调用 YarnClient 类来和YARN集群进行交互.
5.Container(AM) 表示YARN集群上用来运行 AM的进程(作为YARN集群中的一个抽象概念-container)
6.Container(HelloWorld) 表示YARN集群上真正运行的用户程序(我们用HelloWorld来表示一个普通的用户程序)的进程,其中Container(HelloWorld) 和 Container(AM) 可能在同一个NM进程下,也可能分配给不同的NM,这主要决定于RM的分配策略.
 
 
用户提交一个基于yarn的应用程序,也就是YarnClient 运行流程如下:
 
1.用户事先要将使用的 AM.jar 和 HelloWorld.jar 打包上传到hdfs
2.用户在客户端实例化 YarnConfiguration对象
如何在yarn上运行Hello World(一)
3. 初始化并运行YarnClient
如何在yarn上运行Hello World(一)
4.为了新的应用程序 得到一个 YarnClientApplication 对象
如何在yarn上运行Hello World(一)
5.获取提交应用的上下文对象,并且可以使用这个上下文对象设置AM的一些运行情况
如何在yarn上运行Hello World(一)
6.获取 新应用在YARN集群的唯一标识
如何在yarn上运行Hello World(一)
7.设置应用的名字,这个名字会在yarn的web页面体现出来
如何在yarn上运行Hello World(一)
8.设置该应用对应的AM的jar为 LocalResource,以供 AM Container启动时获取.需要注意的是为了方便读取 am.jar 一般会存储在hdfs上
其中:
设置资源类型为file,这样这个文件会在不会被解压的情况下直接复制到 container的对应目录
设置资源的可见性为LocalResourceVisibility.APPLICATION,表示只有这个应用可以访问该资源,当应用运行停止后这个资源会被NM自动删除
如何在yarn上运行Hello World(一)
9.将启动container需要的资源描述设置到对应的 container上下文中,以备后面使用
如何在yarn上运行Hello World(一)
10 设置启动AM需要的环境变量,其中我们只配置了classPath,具体使用中可以根据实际情况设置其他的环境变量,例如JAVA_HOME,PATH等
如何在yarn上运行Hello World(一)
11 设置启动AM的命令,我们这里就是设置了 用java命令启动 AM.jar的 包含主函数的类,并传入相关参数进行启动
如何在yarn上运行Hello World(一)
12.设置 启动应用 的一些必要信息
如何在yarn上运行Hello World(一)
13. 向YARN集群提交运行应用,提交的过程会阻塞,直到RM返回改应用的状态为ACCEPTED或者失败.
如何在yarn上运行Hello World(一)
14,该步骤为可选项,即可以堵塞client端程序,直到应用运行结束或者异常退出等情况发生
如何在yarn上运行Hello World(一)
到此为止,我们就初步完成了一个最简单的提交yarn应用程序的client示例代码
后面则是YARN集群接收到启动AM的请求后,为其分配 AM Container ,然后启动AM进程并运行.
我们会在后面的文章详细描述如何编写一个应用的AM程序,敬请期待.