PerfectHadoop: YARN 节点管理器
本项目提供一个YARN节点管理器 REST API的Swift类封装:
YARNNodeManager()
: 用于访问在一个YARN节点管理器上所有应用程序和容器信息的类实例
连接到YARN节点管理器
采用Perfect连接到Hadoop YARN 节点管理器最简单的方法,就是初始化一个YARNNodeManager()
对象并提供足够参数:
// 以下连接可能只提供基本操作权限 let nm = YARNNodeManager(host: "yarnNodeManager.somehadoopdomain.com", port: 8042)
或者包含一个有效的用户名连接到Hadoop YARN 节点管理器:
// 如有必要请自行修改用户名 let nm = YARNNodeManager(host: "yarnNodeManager.somehadoopdomain.com", port: 8042, user: "your user name")
用户身份认证
如果您的服务器正在使用Kerberos,请参考以下程序代码:
// 将认证模式设置为krb5 let yarn = YARNNodeManager(host: "yarnNodeManager.somehadoopdomain.com", port: 8042, user: "username", auth: .krb5)
YARNNodeManager 节点管理器对象初始化参数
变量 | 类型 | 描述 |
---|---|---|
service | String | 服务器支持的协议 - http / https |
host | String | 目标YARN节点管理器的主机名/域名或者ip地址 |
port | Int | 目标主机端口,默认为 8042 |
auth | Authorization | 用户身份验证机制,.off表示不验证(默认),.krb5为Kerberos V5 验证方法 |
proxyUser | String | 代理服务器用户,如果有的话 |
apibase | String | 只有在您的服务器编程接口API不是 /ws/v1/node 的情况下才需要设置 |
timeout | Int | 连接超时设置,单位是秒。零表示传输永远不超时,保持等待直到服务器返回结果 |
获取服务器基本信息
调用 checkOverall()
方法可以获得服务器基本信息,返回结果为一个 YARNNodeManager.Info
数据结构
guard let inf = try yarn.checkOverall() else { // 出错了 } print(inf.id) print(inf.nodeHostName) print(inf.healthReport)
YARNNodeManager.NodeInfo 数据结构
变量 | 类型 | 描述 |
---|---|---|
id | String | 节点管理器编号 |
nodeHostName | String | 节点管理器主机名称 |
totalPmemAllocatedContainersMB | Int | 为容器分配的实际物理内存总量,兆字节 |
totalVmemAllocatedContainersMB | Int | 为容器分配的虚拟内存总量,兆字节 |
totalVCoresAllocatedContainers | Int | 为容器分配的虚拟内核数量 |
lastNodeUpdateTime | Int | 最后一次收到健康报告的时间戳(Unix纪元,毫秒) |
healthReport | String | 节点健康报告详细诊断书 |
nodeHealthy | Bool | 节点是否健康,真为健康,假为不健康 |
nodeManagerVersion | String | 节点管理器版本号 |
nodeManagerBuildVersion | String | 节点管理器编译信息,包括编译版本、用户和校验和nodeManagerVersionBuiltOn |
hadoopVersion | String | 当前Hadoop Common(通用库)的版本 |
hadoopBuildVersion | String | 当前Hadoop Common(通用库)的版本,包括编译子版本、用户和校验和 |
hadoopVersionBuiltOn | String | 当前Hadoop Common(通用库)编译时的时间戳(Unix纪元,毫秒) |
应用程序
调用 checkApps()
方法可返回一个 APP
应用程序对象组成的数组。每个应用程序对象都是代表这个应用程序的一组资源集合。
let apps = try yarn.checkApps() apps.forEach { a in print(a.id) print(a.containerids) print(a.state) }//next
应用程序数据结构
变量 | 类型 | 描述 |
---|---|---|
id | String | 应用程序编号 |
user | String | 启动该应用程序的用户名 |
state | APP.State | 应用程序状态 - 有效值包括:NEW(新建)、INITING(正在初始化)、RUNNING(正在运行)、FINISHINGCONTAINERSWAIT(运行结束,容器正在等待结果)、 APPLICATIONRESOURCESCLEANINGUP(应用程序资源正在清理)、FINISHED(运行结束) |
containerids | [String]] | 当前在该节点上应用程序所使用的容器编号列表。如果为空则表示当前在该节点上没有针对该应用程序的容器 |
查看特定应用程序
如果具有有效的应用程序代号,您可以调用checkApp()
来查询节点信息:
guard let app = try yarn.checkApp("application_1326121700862_0005") else { // 出错了 } // print out all container ids of the application print(app.containerids)
checkApp()
会返回一个 APP
对象,如前文所述
检查容器
调用 checkContainers()
可以查看当前节点上的所有容器:
// 获取所有容器 let containers = try ynode.checkContainers() // 查看容器数量 print(containers.count) containers.forEach { container in print(container.id) print(container.state) print(container.nodeId) print(container.diagnostics) /// ... }
checkContainers()
返回值时一个容器数组 Container
如下所述:
容器对象
变量 | 类型 | 描述 |
---|---|---|
id | String | 容器编号 |
state | String | 容器状态 - 有效状态包括: NEW(新建)、LOCALIZING(正在本地化)、 LOCALIZATIONFAILED(本地化失败)、LOCALIZED(本地化完成)、RUNNING(正在运行)、 EXITEDWITHSUCCESS(退出,结果成功)、EXITEDWITHFAILURE(退出,结果失败)、KILLING(正在关闭/终止)、CONTAINERCLEANEDUPAFTERKILL(容器在终止/关闭后进行清理)、CONTAINERRESOURCESCLEANINGUP(容器在正常结束后进行资源清理)、DONE(完成) |
nodeId | String | 容器所在节点编号 |
containerLogsLink | String | 容器日志的http链接 |
user | String | 启动该容器的用户名 |
exitCode | Int | 容器退出的返回值 |
diagnostics | String | 出错容器的诊断信息 |
totalMemoryNeededMB | Int | 容器所需的内存总量,兆字节 |
totalVCoresNeeded | Int | 容器所需的虚拟内核数量 |
查看特定容器
如果具有有效的容器编号,可以使用 checkContainer()
检查特定容器:
guard let container = try ynode.checkContainer(id: container.id) else { // 出错了 } print(container.id) print(container.state) print(container.nodeId) print(container.diagnostics)
该方法会返回一个Container
对象,如前文所述。