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を指定した場合(Accept-Encoding:gzip)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 Not Found
レスポンスヘッダー
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呼び出しを行います。
この例では、ユーザーは次のようなコマンドを使用して、MapReduceアプリケーションをResourceManagerに送信します。
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からアプリケーションに関する情報を取得します。出力圧縮をリクエストするには、–compressedオプションを使用します。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’s。ユーザーは、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 } ] } }
次に、ユーザーは上記にリストされたジョブID 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のタスク試行情報を取得したいと考えています。JSONがデフォルトの出力形式であるため、Acceptヘッダーはここでは必須ではないことに注意してください。
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" } }