-
Notifications
You must be signed in to change notification settings - Fork 7
AM Restful API
Parker Zhou edited this page Oct 10, 2020
·
2 revisions
当marayarn的ApplicationMaster运行起来后,会启动一个HTTP服务,并提供Restful API接口用于管理应用及其实例。
同时该HTTP服务还搭载一个简单的web页面展示应用的状态。
你可以通过Restful API接口做到:
- 获取应用状态、实例状态
- 更新应用参数
- 扩缩容,以及在扩缩容的同时kill指定实例
- 停止应用
第一步是通过tracking url获取AM所在的真实服务器地址和端口。这是因为tracking url只能接受GET请求,而所有的变更操作都是非GET请求。
通常通过Client可以得到应用的tracking url。一般tracking url形如:
http://<host>:8088/proxy/application_1600068984530_0063/
如果你直接在浏览器中打开这个地址,会看到上面提到的简单web页面。
进一步访问如下地址就可以获得应用的状态信息(json格式):
http://<host>:8088/proxy/application_1600068984530_0063/api/app
{
"applicationId": "application_1600068984530_0063",
"startTime": 1601276740700,
"trackingUrl": "http://vm3195:42574",
...
}
其中的trackingUrl就是AM的真实地址,你也可以通过访问如下地址,获得一样的结果:
http://vm3195:42574/api/app
称上述地址为AM的接口地址
接口返回信息包括:
- 应用的yarn application id
- 应用启动时间
- AM的接口地址
- AM的日志连接,指向yarn上查看日志的连接
- 当前参数
- 基于容器状态的统计:分别有总需求/等待分配/分配完成/正在执行的数量
- 具体容器列表:包括正在运行的容器和已经停止的容器
- 容器信息包括:容器Id,所在节点,容器日志链接(指向yarn上查看日志的连接),容器真实cpu和内容配额
| Path | /api/app |
|---|---|
| Method | GET |
| QueryString | null |
| Body | null |
| Return |
{
"applicationId":"application_1600068984530_0063",
"startTime":1601276740700,
"trackingUrl":"http://vm3195:42574",
"logUrl":"http://vm3195:8042/node/containerlogs/container_1600068984530_0063_01_000001/mara",
"arguments":{
"numExecutors":4,
"executorCores":1,
"executorMemory":512,
"queue":null,
"commandLine":"while true; do date; sleep 5; done",
"principal":"mara@ALANWANG.COM",
"keytab":"__kt__.keytab",
"constraints":null,
"location":null
},
"numRunningExecutors":3,
"numTotalExecutors":3,
"numAllocatedExecutors":3,
"numPendingExecutors":0,
"containers":[
{
"Id":"container_1600068984530_0063_01_000007",
"nodeId":"vm3195",
"nodeHttpAddress":"vm3195:8042",
"logUrl":"http://vm3195:8042/node/containerlogs/container_1600068984530_0063_01_000007/mara",
"vcore":1,
"memory":1024,
"state":1
},
{
"Id":"container_1600068984530_0063_01_000003",
"nodeId":"vm3195",
"nodeHttpAddress":"vm3195:8042",
"logUrl":"http://vm3195:8042/node/containerlogs/container_1600068984530_0063_01_000003/mara",
"vcore":1,
"memory":1024,
"state":1
},
{
"Id":"container_1600068984530_0063_01_000002",
"nodeId":"vm3195",
"nodeHttpAddress":"vm3195:8042",
"logUrl":"http://vm3195:8042/node/containerlogs/container_1600068984530_0063_01_000002/mara",
"vcore":1,
"memory":1024,
"state":1
}
],
"completedContainers":[
{
"Id":"container_1600068984530_0063_01_000005",
"nodeId":"vm3198",
"nodeHttpAddress":"vm3198:8042",
"logUrl":"http://vm3198:8042/node/containerlogs/container_1600068984530_0063_01_000005/mara",
"vcore":1,
"memory":1024,
"state":1
},
{
"Id":"container_1600068984530_0063_01_000006",
"nodeId":"vm3195",
"nodeHttpAddress":"vm3195:8042",
"logUrl":"http://vm3195:8042/node/containerlogs/container_1600068984530_0063_01_000006/mara",
"vcore":1,
"memory":1024,
"state":1
},
{
"Id":"container_1600068984530_0063_01_000004",
"nodeId":"vm3198",
"nodeHttpAddress":"vm3198:8042",
"logUrl":"http://vm3198:8042/node/containerlogs/container_1600068984530_0063_01_000004/mara",
"vcore":1,
"memory":1024,
"state":1
}
]
}扩缩容接口实现最轻量的,对容器实例数量的变更,但不变更其他参数。可能是扩大容器数量,也可能是减小容器数量。同时,基于containerId,可以指定kill掉特定的container。
| Path | /api/app/scale |
|---|---|
| Method | POST |
| QueryString | null |
| Body | {"instances": 10, "containerIds": ["...", "..."]} |
| Return | { "code": "0", "message": "ok" } |
s
- instances: 表示最终希望的容器数量。如果这个数字小于当前容器数量,相当于缩容。如果大于当前容器数量,相当于扩容。
- containerIds: containerId组成的数组。即基于容器Id,指定kill掉container
用于停止一个应用,所有的实例将结束,AM将退出。从yarn的角度看,应用进入FINISHED状态。
| Path | /api/app/stop |
|---|---|
| Method | POST |
| QueryString | null |
| Body | null |
| Return | { "code": "0", "message": "ok" } |
这个接口可以对如下应用参数做动态变更:
- 实例数量(相当于scale)
- 内存/CPU配额
- 约束(Constraints)
- 命令行
| Path | /api/app |
|---|---|
| Method | POST |
| QueryString | null |
| Body | { "numExecutors": 5, "executorCores": 2, "executorMemory": 2048, "commandLine": "", "constraints": "node,UNIQUE" } |
| Return | { "code": "0", "message": "ok" } |
变更接口会将所有实例全部停掉和释放,并重按照新的需求启动容器和执行命令,所以操作相对是比较重的。
需要注意的是:
- 如果只是为了扩缩容,请使用
/api/scale,因为这个接口更轻量 - 如果新的参数与现有的相比没有变化,并不会真正实施变更
- commandLine只是修改了命令行,并不能变更资源文件。如果想要变更资源文件,必需重新提交新的任务