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对象,如前文所述。