Hadoop YARN Web 服务 REST API 是一组 URI 资源,可访问集群、节点、应用程序和应用程序历史信息。URI 资源根据返回的信息类型分组为 API。某些 URI 资源返回集合,而另一些则返回单例。
基于 REST 的 Web 服务的 URI 具有以下语法
http://{http address of service}/ws/{version}/{resourcepath}
此语法中的元素如下
{http address of service} - The http address of the service to get information about.
Currently supported are the ResourceManager, NodeManager,
MapReduce application master, and history server.
{version} - The version of the APIs. In this release, the version is v1.
{resourcepath} - A path that defines a singleton resource or a collection of resources.
要调用 REST API,应用程序会对与资源关联的 URI 调用 HTTP 操作。
当前仅支持 GET。它检索有关指定资源的信息。
Web 服务 REST API 与 Web UI 具有相同的安全性。如果集群管理员启用了过滤器,则必须通过他们指定的机制进行身份验证。
目前标头中唯一使用的字段是 Accept 和 Accept-Encoding。Accept 目前支持 XML 和 JSON 作为您接受的响应类型。Accept-Encoding 目前仅支持 gzip 格式,如果指定此格式,它将返回 gzip 压缩输出,否则输出将不会压缩。所有其他标头字段都将被忽略。
接下来的几部分将描述 Web 服务 REST API 的 HTTP 响应的一些语法和其他详细信息。
如果您在 HTTP 请求的 Accept-Encoding 标头中指定 gzip,此版本支持 gzip 压缩(Accept-Encoding: gzip)。
此版本的 Web 服务 REST API 支持 JSON 和 XML 格式的响应。JSON 是默认格式。要设置响应格式,您可以在 HTTP 请求的 Accept 标头中指定格式。
如 HTTP 响应代码中所指定,响应正文可以包含表示资源的数据或错误消息。如果成功,响应正文将采用所选格式,即 JSON 或 XML。如果出错,响应正文将采用基于所请求格式的 JSON 或 XML。响应的 Content-Type 标头包含所请求的格式。如果应用程序请求不支持的格式,响应状态代码为 500。请注意,响应正文中字段的顺序未指定,并且可能会更改。此外,可能会向响应正文中添加其他字段。因此,您的应用程序应使用可以按任何顺序从响应正文中提取数据的解析例程。
在调用 HTTP 请求后,应用程序应检查响应状态代码以验证成功或检测错误。如果响应状态代码指示错误,响应正文将包含错误消息。第一个字段是异常类型,目前仅返回 RemoteException。下表列出了 RemoteException 错误消息中的项目
| 项目 | 数据类型 | 说明 |
|---|---|---|
| exception | 字符串 | 异常类型 |
| javaClassName | 字符串 | 异常的 Java 类名 |
| message | 字符串 | 异常的详细消息 |
_1324057493980_0001HTTP 请求:GET http://rmhost.domain:8088/ws/v1/cluster/apps/application
响应状态行:HTTP/1.1 200 OK
响应标头
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
响应正文
{
app":
{
"id":"application_1324057493980_0001",
"user":"user1",
"name":"",
"queue":"default",
"state":"ACCEPTED",
"finalStatus":"UNDEFINED",
"progress":0,
"trackingUI":"UNASSIGNED",
"diagnostics":"",
"clusterId":1324057493980,
"startedTime":1324057495921,
"finishedTime":0,
"elapsedTime":2063,
"amContainerLogs":"http:\/\/amNM:2\/node\/containerlogs\/container_1324057493980_0001_01_000001",
"amHostHttpAddress":"amNM:2"
}
}
此处我们请求有关尚不存在的应用程序的信息。
_1324057493980_9999HTTP 请求:GET http://rmhost.domain:8088/ws/v1/cluster/apps/application
响应状态行:HTTP/1.1 404 未找到
响应标头
HTTP/1.1 404 Not Found Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
响应正文
{
"RemoteException" : {
"javaClassName" : "org.apache.hadoop.yarn.webapp.NotFoundException",
"exception" : "NotFoundException",
"message" : "java.lang.Exception: app with id: application_1324057493980_9999 not found"
}
}
你可以使用多种方式/语言来使用 Web 服务 REST API。此示例使用 curl 命令行界面来执行 REST GET 调用。
在此示例中,用户使用类似于以下命令向 ResourceManager 提交 MapReduce 应用程序
hadoop jar hadoop-mapreduce-test.jar sleep -Dmapred.job.queue.name=a1 -m 1 -r 1 -rt 1200000 -mt 20
客户端会打印有关已提交作业的信息以及类似于以下内容的应用程序 ID
12/01/18 04:25:15 INFO mapred.ResourceMgrDelegate: Submitted application application_1326821518301_0010 to ResourceManager at host.domain.com/10.10.10.10:8032 12/01/18 04:25:15 INFO mapreduce.Job: Running job: job_1326821518301_0010 12/01/18 04:25:21 INFO mapred.ClientServiceDelegate: The url to track the job: host.domain.com:8088/proxy/application_1326821518301_0010/ 12/01/18 04:25:22 INFO mapreduce.Job: Job job_1326821518301_0010 running in uber mode : false 12/01/18 04:25:22 INFO mapreduce.Job: map 0% reduce 0%
然后用户希望跟踪应用程序。用户首先从 ResourceManager 获取有关应用程序的信息。使用 –comopressed 选项来请求压缩输出。curl 在客户端处理解压缩。
curl --compressed -H "Accept: application/json" -X GET "http://host.domain.com:8088/ws/v1/cluster/apps/application_1326821518301_0010"
输出
{
"app" : {
"finishedTime" : 0,
"amContainerLogs" : "http://host.domain.com:8042/node/containerlogs/container_1326821518301_0010_01_000001",
"trackingUI" : "ApplicationMaster",
"state" : "RUNNING",
"user" : "user1",
"id" : "application_1326821518301_0010",
"clusterId" : 1326821518301,
"finalStatus" : "UNDEFINED",
"amHostHttpAddress" : "host.domain.com:8042",
"progress" : 82.44703,
"name" : "Sleep job",
"startedTime" : 1326860715335,
"elapsedTime" : 31814,
"diagnostics" : "",
"trackingUrl" : "http://host.domain.com:8088/proxy/application_1326821518301_0010/",
"queue" : "a1"
}
}
_1326821518301_0010。这可以转到 Web 浏览器或使用 Web 服务 REST API 然后用户希望获取有关正在运行的应用程序的更多详细信息,并直接转到此应用程序的 MapReduce 应用程序主控。ResourceManager 会列出可用于此应用程序的 trackingUrl:http://host.domain.com:8088/proxy/application。用户使用 Web 服务 REST API 获取此 MapReduce 应用程序主控正在运行的作业列表
curl --compressed -H "Accept: application/json" -X GET "http://host.domain.com:8088/proxy/application_1326821518301_0010/ws/v1/mapreduce/jobs"
输出
{
"jobs" : {
"job" : [
{
"runningReduceAttempts" : 1,
"reduceProgress" : 72.104515,
"failedReduceAttempts" : 0,
"newMapAttempts" : 0,
"mapsRunning" : 0,
"state" : "RUNNING",
"successfulReduceAttempts" : 0,
"reducesRunning" : 1,
"acls" : [
{
"value" : " ",
"name" : "mapreduce.job.acl-modify-job"
},
{
"value" : " ",
"name" : "mapreduce.job.acl-view-job"
}
],
"reducesPending" : 0,
"user" : "user1",
"reducesTotal" : 1,
"mapsCompleted" : 1,
"startTime" : 1326860720902,
"id" : "job_1326821518301_10_10",
"successfulMapAttempts" : 1,
"runningMapAttempts" : 0,
"newReduceAttempts" : 0,
"name" : "Sleep job",
"mapsPending" : 0,
"elapsedTime" : 64432,
"reducesCompleted" : 0,
"mapProgress" : 100,
"diagnostics" : "",
"failedMapAttempts" : 0,
"killedReduceAttempts" : 0,
"mapsTotal" : 1,
"uberized" : false,
"killedMapAttempts" : 0,
"finishTime" : 0
}
]
}
}
然后用户希望获取上面列出的作业 job_1326821518301_10_10 的任务详细信息。
curl --compressed -H "Accept: application/json" -X GET "http://host.domain.com:8088/proxy/application_1326821518301_0010/ws/v1/mapreduce/jobs/job_1326821518301_10_10/tasks"
输出
{
"tasks" : {
"task" : [
{
"progress" : 100,
"elapsedTime" : 5059,
"state" : "SUCCEEDED",
"startTime" : 1326860725014,
"id" : "task_1326821518301_10_10_m_0",
"type" : "MAP",
"successfulAttempt" : "attempt_1326821518301_10_10_m_0_0",
"finishTime" : 1326860730073
},
{
"progress" : 72.104515,
"elapsedTime" : 0,
"state" : "RUNNING",
"startTime" : 1326860732984,
"id" : "task_1326821518301_10_10_r_0",
"type" : "REDUCE",
"successfulAttempt" : "",
"finishTime" : 0
}
]
}
}
映射任务已完成,但归约任务仍在运行。用户希望获取归约任务 task_1326821518301_10_10_r_0 的任务尝试信息,请注意此处实际上不需要 Accept 标头,因为 JSON 是默认输出格式
curl --compressed -X GET "http://host.domain.com:8088/proxy/application_1326821518301_0010/ws/v1/mapreduce/jobs/job_1326821518301_10_10/tasks/task_1326821518301_10_10_r_0/attempts"
输出
{
"taskAttempts" : {
"taskAttempt" : [
{
"elapsedMergeTime" : 158,
"shuffleFinishTime" : 1326860735378,
"assignedContainerId" : "container_1326821518301_0010_01_000003",
"progress" : 72.104515,
"elapsedTime" : 0,
"state" : "RUNNING",
"elapsedShuffleTime" : 2394,
"mergeFinishTime" : 1326860735536,
"rack" : "/10.10.10.0",
"elapsedReduceTime" : 0,
"nodeHttpAddress" : "host.domain.com:8042",
"type" : "REDUCE",
"startTime" : 1326860732984,
"id" : "attempt_1326821518301_10_10_r_0_0",
"finishTime" : 0
}
]
}
}
归约尝试仍在运行,用户希望查看该尝试的当前计数器值
curl --compressed -H "Accept: application/json" -X GET "http://host.domain.com:8088/proxy/application_1326821518301_0010/ws/v1/mapreduce/jobs/job_1326821518301_10_10/tasks/task_1326821518301_10_10_r_0/attempts/attempt_1326821518301_10_10_r_0_0/counters"
输出
{
"JobTaskAttemptCounters" : {
"taskAttemptCounterGroup" : [
{
"counterGroupName" : "org.apache.hadoop.mapreduce.FileSystemCounter",
"counter" : [
{
"value" : 4216,
"name" : "FILE_BYTES_READ"
},
{
"value" : 77151,
"name" : "FILE_BYTES_WRITTEN"
},
{
"value" : 0,
"name" : "FILE_READ_OPS"
},
{
"value" : 0,
"name" : "FILE_LARGE_READ_OPS"
},
{
"value" : 0,
"name" : "FILE_WRITE_OPS"
},
{
"value" : 0,
"name" : "HDFS_BYTES_READ"
},
{
"value" : 0,
"name" : "HDFS_BYTES_WRITTEN"
},
{
"value" : 0,
"name" : "HDFS_READ_OPS"
},
{
"value" : 0,
"name" : "HDFS_LARGE_READ_OPS"
},
{
"value" : 0,
"name" : "HDFS_WRITE_OPS"
}
]
},
{
"counterGroupName" : "org.apache.hadoop.mapreduce.TaskCounter",
"counter" : [
{
"value" : 0,
"name" : "COMBINE_INPUT_RECORDS"
},
{
"value" : 0,
"name" : "COMBINE_OUTPUT_RECORDS"
},
{
"value" : 1767,
"name" : "REDUCE_INPUT_GROUPS"
},
{
"value" : 25104,
"name" : "REDUCE_SHUFFLE_BYTES"
},
{
"value" : 1767,
"name" : "REDUCE_INPUT_RECORDS"
},
{
"value" : 0,
"name" : "REDUCE_OUTPUT_RECORDS"
},
{
"value" : 0,
"name" : "SPILLED_RECORDS"
},
{
"value" : 1,
"name" : "SHUFFLED_MAPS"
},
{
"value" : 0,
"name" : "FAILED_SHUFFLE"
},
{
"value" : 1,
"name" : "MERGED_MAP_OUTPUTS"
},
{
"value" : 50,
"name" : "GC_TIME_MILLIS"
},
{
"value" : 1580,
"name" : "CPU_MILLISECONDS"
},
{
"value" : 141320192,
"name" : "PHYSICAL_MEMORY_BYTES"
},
{
"value" : 1118552064,
"name" : "VIRTUAL_MEMORY_BYTES"
},
{
"value" : 73728000,
"name" : "COMMITTED_HEAP_BYTES"
}
]
},
{
"counterGroupName" : "Shuffle Errors",
"counter" : [
{
"value" : 0,
"name" : "BAD_ID"
},
{
"value" : 0,
"name" : "CONNECTION"
},
{
"value" : 0,
"name" : "IO_ERROR"
},
{
"value" : 0,
"name" : "WRONG_LENGTH"
},
{
"value" : 0,
"name" : "WRONG_MAP"
},
{
"value" : 0,
"name" : "WRONG_REDUCE"
}
]
},
{
"counterGroupName" : "org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter",
"counter" : [
{
"value" : 0,
"name" : "BYTES_WRITTEN"
}
]
}
],
"id" : "attempt_1326821518301_10_10_r_0_0"
}
}
作业完成,用户希望从历史记录服务器获取此作业的最终作业信息。
curl --compressed -X GET "http://host.domain.com:19888/ws/v1/history/mapreduce/jobs/job_1326821518301_10_10"
输出
{
"job" : {
"avgReduceTime" : 1250784,
"failedReduceAttempts" : 0,
"state" : "SUCCEEDED",
"successfulReduceAttempts" : 1,
"acls" : [
{
"value" : " ",
"name" : "mapreduce.job.acl-modify-job"
},
{
"value" : " ",
"name" : "mapreduce.job.acl-view-job"
}
],
"user" : "user1",
"reducesTotal" : 1,
"mapsCompleted" : 1,
"startTime" : 1326860720902,
"id" : "job_1326821518301_10_10",
"avgMapTime" : 5059,
"successfulMapAttempts" : 1,
"name" : "Sleep job",
"avgShuffleTime" : 2394,
"reducesCompleted" : 1,
"diagnostics" : "",
"failedMapAttempts" : 0,
"avgMergeTime" : 2552,
"killedReduceAttempts" : 0,
"mapsTotal" : 1,
"queue" : "a1",
"uberized" : false,
"killedMapAttempts" : 0,
"finishTime" : 1326861986164
}
}
用户还从 ResourceManager 获取最终应用程序信息。
curl --compressed -H "Accept: application/json" -X GET "http://host.domain.com:8088/ws/v1/cluster/apps/application_1326821518301_0010"
输出
{
"app" : {
"finishedTime" : 1326861991282,
"amContainerLogs" : "http://host.domain.com:8042/node/containerlogs/container_1326821518301_0010_01_000001",
"trackingUI" : "History",
"state" : "FINISHED",
"user" : "user1",
"id" : "application_1326821518301_0010",
"clusterId" : 1326821518301,
"finalStatus" : "SUCCEEDED",
"amHostHttpAddress" : "host.domain.com:8042",
"progress" : 100,
"name" : "Sleep job",
"startedTime" : 1326860715335,
"elapsedTime" : 1275947,
"diagnostics" : "",
"trackingUrl" : "http://host.domain.com:8088/proxy/application_1326821518301_0010/jobhistory/job/job_1326821518301_10_10",
"queue" : "a1"
}
}