Skip to content

AM Restful API

Parker Zhou edited this page Oct 10, 2020 · 2 revisions

marayarnApplicationMaster运行起来后,会启动一个HTTP服务,并提供Restful API接口用于管理应用及其实例。

同时该HTTP服务还搭载一个简单的web页面展示应用的状态。

你可以通过Restful API接口做到:

  • 获取应用状态、实例状态
  • 更新应用参数
  • 扩缩容,以及在扩缩容的同时kill指定实例
  • 停止应用

获取AM服务地址

第一步是通过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"
}

变更接口会将所有实例全部停掉和释放,并重按照新的需求启动容器和执行命令,所以操作相对是比较重的。

需要注意的是:

  1. 如果只是为了扩缩容,请使用/api/scale,因为这个接口更轻量
  2. 如果新的参数与现有的相比没有变化,并不会真正实施变更
  3. commandLine只是修改了命令行,并不能变更资源文件。如果想要变更资源文件,必需重新提交新的任务

Clone this wiki locally