Подключение к YARN через REST API

Обзор

Hadoop предоставляет набор REST API для всех компонентов YARN. Они обеспечивают URI-доступ к кластеру, нодам, приложениям и истории приложений.

Большинство API-интерфейсов YARN поддерживают только запросы GET, но некоторые компоненты YARN, такие как ResourceManager, поддерживают POST. В заголовке запроса используются только поля Accept и Accept-Encoding, все остальные поля заголовка игнорируются.

Чтобы указать, какой формат нужен в ответе, необходимо передать в поле Accept значение XML или JSON. Формат по умолчанию — JSON.

Чтобы получить ответ в формате gzip-архива, передайте gzip в поле Accept-Encoding.

Синтаксис URI для YARN REST API выглядит так:

http://<IP:PORT>/ws/<version>/<resourcepath>

Здесь:

  • <IP:PORT> — IP или FQDN хоста компонента и его порт;

  • <version> — версия API;

  • <resourcepath> — путь, который определяет, какую функцию API вызывать.

Аутентификация

 
Использование API требует аутентификации. Если в кластере не настроена безопасность, добавьте в запросы параметр ?user.name=<user>. Где <user> — это имя пользователя, под которым необходимо выполнить запрос. Например, admin.

Если безопасность настроена, метод аутентификации зависит от модели безопасности.

Если включен Kerberos SPNEGO, используйте параметры --negotiate и -u:

$ curl -i --negotiate -u : "http://<HOST>:<HTTP_PORT>/ws/<version>/<resourcepath>"

Если включена аутентификация с помощью токена делегирования Hadoop, передайте токен вместо имени пользователя:

$ curl -i "http://<HOST>:<HTTP_PORT>/ws/<version>/<resourcepath>?delegation=<TOKEN>"

Более подробно о методах аутентификации читайте в статье Authentication for Hadoop HTTP web-consoles.

Пример запроса к Timeline server:

$ curl http://127.0.0.1:8188/ws/v1/timeline?user.name=admin

В ответе содержится информация о сервере:

{"About":"Timeline API","timeline-service-version":"3.1.2","timeline-service-build-version":"3.1.2 from 2bfc95569d9993d795ded4878847f3f3db76e77c by jenkins source checksum 7954337bcd9688eca8aa32720d2c74","timeline-service-version-built-on":"2023-09-07T08:01Z","hadoop-version":"3.1.2","hadoop-build-version":"3.1.2 from 2bfc95569d9993d795ded4878847f3f3db76e77c by jenkins source checksum 38903f2495a81dfd8e2d8fc4f659a92","hadoop-version-built-on":"2023-09-07T07:57Z"}
ПРИМЕЧАНИЕ

Поля в теле ответа не ограничены по количеству и не имеют определенного порядка. При разработке приложений на базе YARN REST API используйте парсеры, которые не зависят от конкретного порядка.

ResourceManager API

ResourceManager REST API обеспечивает доступ к информации о кластере и позволяет управлять приложениями. Полная спецификация API доступна в статье ResourceManager REST API’s.

Пример использования REST API ResourceManager для добавления нового приложения:

  1. Запросите ID для приложения с помощью команды:

    $ curl -X POST http://127.0.0.1:8088/ws/v1/cluster/apps/new-application?user.name=admin

    Ответ сервера:

    {"application-id":"application_1705573015955_0001","maximum-resource-capability":{"memory":7057,"vCores":2,"resourceInformations":{"resourceInformation":[{"maximumAllocation":9223372036854775807,"minimumAllocation":0,"name":"memory-mb","resourceType":"COUNTABLE","units":"Mi","value":7057},{"maximumAllocation":9223372036854775807,"minimumAllocation":0,"name":"vcores","resourceType":"COUNTABLE","units":"","value":2}]}}}[admin@elenas-adh2 ~]$
  2. В ответе сервера содержится ID приложения и информация о доступных ресурсах. Создайте JSON-файл с параметрами приложения и передайте его в ResourceManager с помощью команды:

    $ curl -v -X POST -d @example-app.json -H "Content-type: application/json"  http://127.0.0.1:8088/ws/v1/cluster/apps/?user.name=admin
    Пример информации о приложении
     {
        "application-id":"application_1705573015955_0001",
        "application-name":"test",
        "am-container-spec":
        {
           "local-resources":
           {
              "entry":
             [
                {
                   "key":"hadoop-mapreduce-examples.jar",
                   "value":
                   {
                      "resource":"hdfs://127.0.0.2:8020/tmp/hadoop-mapreduce-examples.jar",
                      "type":"FILE",
                      "visibility":"APPLICATION",
                      "size": "30897",
                      "timestamp": "1405452071209"
                   }
                }
              ]
           },
           "commands":
           {
              "command":"{{JAVA_HOME}}/bin/java -Xmx10m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster --container_memory 10 --container_vcores 1 --num_containers 1 --priority 0 1><LOG_DIR>/AppMaster.stdout 2><LOG_DIR>/AppMaster.stderr"
           },
           "environment":
           {
              "entry":
              [
                 {
                    "key": "DISTRIBUTEDSHELLSCRIPTTIMESTAMP",
                    "value": "1405459400754"
                 },
                 {
                    "key": "CLASSPATH",
                    "value": "{{CLASSPATH}}<CPS>./*<CPS>{{HADOOP_CONF_DIR}}<CPS>{{HADOOP_COMMON_HOME}}/share/hadoop/common/*<CPS>{{HADOOP_COMMON_HOME}}/share/hadoop/common/lib/*<CPS>{{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/*<CPS>{{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/lib/*<CPS>{{HADOOP_YARN_HOME}}/share/hadoop/yarn/*<CPS>{{HADOOP_YARN_HOME}}/share/hadoop/yarn/lib/*<CPS>./log4j.properties"
                 },
                 {
                    "key": "DISTRIBUTEDSHELLSCRIPTLEN",
                    "value": "6"
                 },
                 {
                    "key": "DISTRIBUTEDSHELLSCRIPTLOCATION",
                    "value": "hdfs://127.0.0.2:8020/tmp/hadoop-mapreduce-examples.jar"
                 }
              ]
           }
        },
        "unmanaged-AM":"false",
        "max-app-attempts":"2",
        "resource":
        {
           "memory":"1024",
           "vCores":"1"
        },
        "application-type":"YARN",
        "keep-containers-across-application-attempts":"false"
      }

    Если запрос был отправлен успешно, сервер возвращает код HTTP/1.1 202 Accepted и URL-адрес приложения, по которому можно отслеживать его статус.

Чтобы включить поддержку CORS только для ResourceManager, установите следующие параметры конфигурации:

  • core-site.xml — установите значение параметра hadoop.http.filter.initializers равным org.apache.hadoop.security.HttpCrossOriginFilterInitializer;

  • yarn-site.xml — установите значение параметра yarn.resourcemanager.webapp.cross-origin.enabled равным true.

NodeManager

NodeManager REST API предоставляет информацию о нодах, приложениях и контейнерах, работающих на этой ноде. Полная спецификация API доступна в статье NodeManager REST API’s.

Пример команды, которая выводит информацию о ноде:

$ curl -X GET http://<IP>:8042/ws/v1/node/info?user.name=admin

Здесь <IP> — это IP-адрес или FQDN хоста.

Чтобы включить поддержку CORS для NodeManager, установите следующие параметры конфигурации:

  • core-site.xml — установите значение параметра hadoop.http.filter.initializers равным org.apache.hadoop.security.HttpCrossOriginFilterInitializer;

  • yarn-site.xml — установите значение параметра yarn.nodemanager.webapp.cross-origin.enabled равным true.

Timeline Server

Timeline Server REST API поддерживает два метода: GET и POST. На данный момент доступны две версии API:

Пример команды, которая выводит список доменов указанного владельца:

$ curl -X GET http://<IP>:8188/ws/v1/timeline/domain?owner=<owner>

Здесь <IP> — это IP-адрес или FQDN хоста, а <owner> — это имя владельца домена.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней