Поделиться через


Управление кластерами HDInsight с помощью REST API Apache Ambari

Узнайте, как использовать REST API Apache Ambari для управления кластерами Apache Hadoop и мониторинга ими в Azure HDInsight.

Что такое Apache Ambari

Apache Ambari упрощает управление и мониторинг кластеров Hadoop, предоставляя простой для использования веб-интерфейс, поддерживаемый интерфейсом REST API. Ambari по умолчанию включен в кластеры HDInsight на базе Linux.

Предпосылки

  • Кластер Hadoop в HDInsight. См. Начало работы с HDInsight на Linux.

  • Bash для Ubuntu на Windows 10. В примерах, приведенных в этой статье, используется оболочка Bash в Windows 10. Шаги установки см. в статье Windows Subsystem for Linux Installation Guide for Windows 10 (Подсистема Windows для Linux в Windows 10). Другие оболочки Unix также работают. Примеры с некоторыми незначительными изменениями могут работать в командной строке Windows. Или вы можете использовать Windows PowerShell.

  • jq — обработчик командной строки JSON. См. https://stedolan.github.io/jq/.

  • Windows PowerShell. Или можно использовать Bash.

Базовый универсальный идентификатор ресурса для REST API Ambari

Базовый универсальный идентификатор ресурса (URI) для REST API Ambari в HDInsight — https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAMECLUSTERNAME это имя кластера. Имена кластеров в URI задаются с учетом регистра. Хотя имя кластера в части полного доменного имени (FQDN) URI (CLUSTERNAME.azurehdinsight.net) указывается без учета регистра, в других вхождениях этого URI регистр учитывается.

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

Для подключения к Ambari в HDInsight требуется ПРОТОКОЛ HTTPS. Используйте имя учетной записи администратора (по умолчанию — администратор) и пароль, предоставленный во время создания кластера.

Для кластеров Пакета безопасности для предприятий вместо admin используйте полное имя пользователя, например [email protected].

Примеры

Установка (сохранение учетных данных)

Вы можете сохранить свои учетные данные, чтобы не вводить их повторно для каждого примера. Имя кластера сохраняется на отдельном этапе.

А. Bash
Измените скрипт, заменив PASSWORD на ваш фактический пароль. Затем введите команду.

export password='PASSWORD'

В. PowerShell

$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"

Определите имя кластера в правильном регистре

Фактический регистр имени кластера может отличаться от ожидаемого. На следующих шагах показано фактическое использование регистра, настройка которого сохраняется в переменной для всех последующих примеров.

Измените скрипты, чтобы заменить CLUSTERNAME на имя вашего кластера. Затем введите команду. (Имя кластера для FQDN не чувствительно к регистру.)

export clusterName=$(curl -u admin:$password -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $clusterName
# Identify properly cased cluster name
$resp = Invoke-WebRequest -Uri "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" `
    -Credential $creds -UseBasicParsing
$clusterName = (ConvertFrom-Json $resp.Content).items.Clusters.cluster_name;

# Show cluster name
$clusterName

Анализ данных JSON

В следующем примере используется jq или ConvertFrom-Json для разбора JSON-документа ответа и отображения только health_report информации из результатов.

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName" \
| jq '.Clusters.health_report'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.Clusters.health_report

Получение полного доменного имени узлов кластера

Возможно, вам потребуется знать полное доменное имя узла кластера. Полное доменное имя для различных узлов в кластере можно легко получить с помощью следующих примеров:

Все узлы

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" \
| jq -r '.items[].Hosts.host_name'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.items.Hosts.host_name

Головные узлы

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/NAMENODE" \
| jq -r '.host_components[].HostRoles.host_name'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/NAMENODE" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.host_components.HostRoles.host_name

Рабочие узлы

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/DATANODE" \
| jq -r '.host_components[].HostRoles.host_name'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/DATANODE" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.host_components.HostRoles.host_name

Узлы Zookeeper

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" \
| jq -r ".host_components[].HostRoles.host_name"
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.host_components.HostRoles.host_name

Получение внутреннего IP-адреса узлов кластера

IP-адреса, возвращаемые примерами в этом разделе, не доступны напрямую через Интернет. Они доступны только в виртуальной сети Azure, содержащей кластер HDInsight.

Дополнительные сведения о работе с HDInsight и виртуальными сетями см. в разделе "Планирование виртуальной сети для HDInsight".

Чтобы найти IP-адрес, необходимо знать внутреннее полное доменное имя (FQDN) узлов кластера. После получения полного доменного имени можно получить IP-адрес узла. В следующих примерах сначала выполняется запрос к Ambari для получения полного доменного имени всех узлов. Затем запрашивает у Ambari IP-адрес каждого узла.

for HOSTNAME in $(curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" | jq -r '.items[].Hosts.host_name')
do
    IP=$(curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts/$HOSTNAME" | jq -r '.Hosts.ip')
  echo "$HOSTNAME <--> $IP"
done
$uri = "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" 
$resp = Invoke-WebRequest -Uri $uri -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
foreach($item in $respObj.items) {
    $hostName = [string]$item.Hosts.host_name
    $hostInfoResp = Invoke-WebRequest -Uri "$uri/$hostName" `
        -Credential $creds -UseBasicParsing
    $hostInfoObj = ConvertFrom-Json $hostInfoResp
    $hostIp = $hostInfoObj.Hosts.ip
    "$hostName <--> $hostIp"
}

Получите хранилище по умолчанию

Кластеры HDInsight должны использовать учетную запись хранения Azure или Data Lake Storage в качестве хранилища по умолчанию. Вы можете использовать Ambari для получения этих сведений после создания кластера. Например, если требуется считывать и записывать данные в контейнер за пределами HDInsight.

В следующих примерах извлекается конфигурация хранилища по умолчанию из кластера:

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" \
| jq -r '.items[].configurations[].properties["fs.defaultFS"] | select(. != null)'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.items.configurations.properties.'fs.defaultFS'

Это важно

Эти примеры возвращают первую конфигурацию, примененную к серверу (service_config_version=1), которая содержит эти сведения. Если вы получите значение, которое было изменено после создания кластера, может потребоваться перечислить версии конфигурации и получить последнюю версию.

Возвращаемое значение аналогично одному из следующих примеров:

  • wasbs://[email protected] — Это значение означает, что кластер использует учетную запись хранения Azure для хранения по умолчанию. Это ACCOUNTNAME значение — имя учетной записи хранения. Часть CONTAINER — это имя контейнера для блобов в учетной записи хранения. Контейнер является корнем совместимого хранилища HDFS для кластера.

  • abfs://[email protected] — Это значение указывает, что кластер использует Azure Data Lake Storage 2-го поколения для хранилища по умолчанию. Значения ACCOUNTNAME и CONTAINER имеют те же значения, что и для Azure Storage, упомянутого ранее.

  • adl://home — Это значение означает, что кластер использует Azure Data Lake Storage 1-го поколения для хранилища по умолчанию.

    Чтобы найти имя учетной записи Data Lake Storage, используйте следующие примеры:

    curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" \
    | jq -r '.items[].configurations[].properties["dfs.adls.home.hostname"] | select(. != null)'
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.items.configurations.properties.'dfs.adls.home.hostname'
    

    Возвращаемое значение аналогично ACCOUNTNAME.azuredatalakestore.net, где ACCOUNTNAME — это имя учетной записи Data Lake Storage.

    Чтобы найти каталог в Data Lake Storage, который содержит хранилище для кластера, используйте следующие примеры:

    curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" \
    | jq -r '.items[].configurations[].properties["dfs.adls.home.mountpoint"] | select(. != null)'
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.items.configurations.properties.'dfs.adls.home.mountpoint'
    

    Возвращаемое значение похоже на /clusters/CLUSTERNAME/. Это значение представляет собой путь в учетной записи Data Lake Storage. Этот путь является корнем совместимой файловой системы HDFS для кластера.

Примечание.

Командлет Get-AzHDInsightCluster, предоставляемый Azure PowerShell, также возвращает сведения о хранилище для кластера.

Получить все конфигурации

Получите конфигурации, доступные для кластера.

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName?fields=Clusters/desired_configs"
$respObj = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName`?fields=Clusters/desired_configs" `
    -Credential $creds -UseBasicParsing
$respObj.Content

В этом примере возвращается документ JSON, содержащий текущую конфигурацию для установленных компонентов. См. значение тега . В следующем примере показан фрагмент данных, возвращаемых из типа кластера Spark.

"jupyter-site" : {
  "tag" : "INITIAL",
  "version" : 1
},
"livy2-client-conf" : {
  "tag" : "INITIAL",
  "version" : 1
},
"livy2-conf" : {
  "tag" : "INITIAL",
  "version" : 1
},

Получение конфигурации для конкретного компонента

Получите конфигурацию для интересующего вас компонента. В следующем примере замените INITIAL на значение тега, возвращённое из предыдущего запроса.

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL"
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL" `
    -Credential $creds -UseBasicParsing
$resp.Content

В этом примере возвращается документ JSON, содержащий текущую конфигурацию компонента livy2-conf .

Обновление конфигурации

  1. Создайте newconfig.json.
    Измените и введите команды следующим образом:

    • Замените livy2-conf новым компонентом.

    • Замените INITIAL фактическим значением, полученным для tag из Get all configurations.

      А. Bash

      curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL" \
      | jq --arg newtag $(echo version$(date +%s%N)) '.items[] | del(.href, .version, .Config) | .tag |= $newtag | {"Clusters": {"desired_config": .}}' > newconfig.json
      

      В. PowerShell
      Сценарий PowerShell использует jq. Измените указанный ниже C:\HD\jq\jq-win64, чтобы отразить фактический путь и версию jq.

      $epoch = Get-Date -Year 1970 -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0
      $now = Get-Date
      $unixTimeStamp = [math]::truncate($now.ToUniversalTime().Subtract($epoch).TotalMilliSeconds)
      $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL" `
        -Credential $creds -UseBasicParsing
      $resp.Content | C:\HD\jq\jq-win64 --arg newtag "version$unixTimeStamp" '.items[] | del(.href, .version, .Config) | .tag |= $newtag | {"Clusters": {"desired_config": .}}' > newconfig.json
      

      Jq используется для того, чтобы превратить данные, полученные из HDInsight, в новый шаблон конфигурации. В частности, в этих примерах выполняются следующие действия:

    • Создает уникальное значение, содержащее строку "версия" и дату, которая хранится в newtag.

    • Создает корневой документ для новой конфигурации.

    • Возвращает содержимое массива .items[] и добавляет его в элемент desired_config .

    • Удаляет элементы href, version и Config, так как эти элементы не требуются для отправки новой конфигурации.

    • Добавляет элемент tag со значением version#################. Числовая часть основана на текущей дате. Каждая конфигурация должна иметь уникальный тег.

      Наконец, данные сохраняются в документе newconfig.json . Структура документа должна выглядеть примерно так:

      {
        "Clusters": {
          "desired_config": {
            "tag": "version1552064778014",
            "type": "livy2-conf",
            "properties": {
              "livy.environment": "production",
              "livy.impersonation.enabled": "true",
              "livy.repl.enableHiveContext": "true",
              "livy.server.csrf_protection.enabled": "true",
                ....
            },
          },
        }
      }
      
  2. Измените newconfig.json.
    Откройте документ и измените newconfig.json или добавьте значения в properties объект. В следующем примере значение "livy.server.csrf_protection.enabled" изменяется с "true" на "false".

    "livy.server.csrf_protection.enabled": "false",
    

    Сохраните файл после внесения изменений.

  3. Отправить newconfig.json.
    Используйте следующие команды для отправки обновленной конфигурации в Ambari.

    curl -u admin:$password -sS -H "X-Requested-By: ambari" -X PUT -d @newconfig.json "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName"
    
    $newConfig = Get-Content .\newconfig.json
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body $newConfig
    $resp.Content
    

    Эти команды передают содержимое файла newconfig.json в кластер в качестве новой конфигурации. Запрос возвращает документ JSON. Элемент versionTag в этом документе должен соответствовать отправленной версии, а объект конфигурации содержит запрошенные изменения конфигурации.

Перезапуск компонента службы

На этом этапе веб-интерфейс Ambari указывает, что служба Spark должна быть перезапущена, прежде чем новая конфигурация сможет вступить в силу. Чтобы перезапустить службу, выполните следующие действия.

  1. Используйте следующую команду, чтобы включить режим обслуживания для службы Spark2:

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo": {"context": "turning on maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"ON"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo": {"context": "turning on maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"ON"}}}'
    
  2. Проверка режима обслуживания

    Эти команды отправляют документ JSON на сервер, который включает режим обслуживания. Вы можете убедиться, что служба находится в режиме обслуживания, используя следующий запрос:

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" \
    | jq .ServiceInfo.maintenance_state
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.ServiceInfo.maintenance_state
    

    Возвращаемое значение равно ON.

  3. Затем используйте следующую команду, чтобы отключить службу Spark2:

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo":{"context":"_PARSE_.STOP.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo":{"context":"_PARSE_.STOP.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}'
    $resp.Content
    

    Ответ будет выглядеть примерно так:

    {
        "href" : "http://10.0.0.18:8080/api/v1/clusters/CLUSTERNAME/requests/29",
        "Requests" : {
            "id" : 29,
            "status" : "Accepted"
        }
    }
    

    Это важно

    Значение href , возвращаемое этим URI, использует внутренний IP-адрес узла кластера. Чтобы использовать его за пределами кластера, замените 10.0.0.18:8080 часть полным доменным именем кластера.

  4. Проверка запроса.
    Измените команду ниже, заменив 29 на фактическое значение id, возвращенное на предыдущем шаге. Следующие команды получают состояние запроса:

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/requests/29" \
    | jq .Requests.request_status
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/requests/29" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.Requests.request_status
    

    Ответ COMPLETED указывает, что запрос завершен.

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

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo":{"context":"_PARSE_.START.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"STARTED"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo":{"context":"_PARSE_.START.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"STARTED"}}}'
    $resp.Content
    

    Теперь служба использует новую конфигурацию.

  6. Наконец, используйте следующую команду, чтобы отключить режим обслуживания.

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo": {"context": "turning off maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"OFF"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo": {"context": "turning off maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"OFF"}}}'
    

Дальнейшие действия

Полный справочник по REST API см. в справочнике по API Apache Ambari версии 1. См. также: Авторизовать пользователей для Views в Apache Ambari