Udostępnij za pośrednictwem


Zarządzanie klastrami usługi HDInsight przy użyciu interfejsu API REST apache Ambari

Dowiedz się, jak używać interfejsu API REST apache Ambari do zarządzania klastrami Apache Hadoop i monitorowania ich w usłudze Azure HDInsight.

Co to jest Apache Ambari

System Apache Ambari upraszcza zarządzanie klastrami Hadoop i ich monitorowanie, zapewniając łatwy w użyciu internetowy interfejs użytkownika wspierany przez interfejsy API REST. System Ambari jest domyślnie dostarczany z klastrami usługi HDInsight opartymi na systemie Linux.

Wymagania wstępne

Podstawowy jednolity identyfikator zasobu dla interfejsu API REST systemu Ambari

Podstawowy identyfikator URI (Uniform Resource Identifier) dla interfejsu API REST systemu Ambari w usłudze HDInsight to https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, gdzie CLUSTERNAME jest nazwą klastra. W nazwach klastrów w identyfikatorach URI jest rozróżniana wielkość liter. Podczas gdy nazwa klastra w w pełni kwalifikowanej części nazwy domeny (FQDN) identyfikatora URI (CLUSTERNAME.azurehdinsight.net) jest bez uwzględniania wielkości liter, inne wystąpienia w identyfikatorze URI są uwzględniane wielkości liter.

Uwierzytelnianie

Połączenie do systemu Ambari w usłudze HDInsight wymaga protokołu HTTPS. Użyj nazwy konta administratora (wartość domyślna to administrator) i hasła podanego podczas tworzenia klastra.

W przypadku klastrów pakietu Enterprise Security zamiast adminużyj w pełni kwalifikowanej nazwy użytkownika, takiej jak username@domain.onmicrosoft.com.

Przykłady

Konfiguracja (zachowywanie poświadczeń)

Zachowaj poświadczenia, aby uniknąć ponownego wprowadzania ich dla każdego przykładu. Nazwa klastra jest zachowywana w osobnym kroku.

Odp. Bash
Zmodyfikuj skrypt, zastępując PASSWORD element rzeczywistym hasłem. Następnie wprowadź polecenie .

export password='PASSWORD'

B. PowerShell

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

Zidentyfikuj poprawnie przypadek nazwy klastra

Rzeczywista wielkość liter nazwy klastra może być inna niż oczekiwano. Poniższe kroki przedstawiają rzeczywistą wielkość liter, a następnie przechowują ją w zmiennej dla wszystkich późniejszych przykładów.

Edytuj skrypty, aby zastąpić CLUSTERNAME ciąg nazwą klastra. Następnie wprowadź polecenie . (Nazwa klastra nazwy FQDN nie uwzględnia wielkości liter).

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

Analizowanie danych JSON

W poniższym przykładzie użyto formatu jq lub ConvertFrom-Json , aby przeanalizować dokument odpowiedzi JSON i wyświetlić tylko health_report informacje z wyników.

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

Pobieranie nazwy FQDN węzłów klastra

Może być konieczne poznanie w pełni kwalifikowanej nazwy domeny (FQDN) węzła klastra. Nazwę FQDN dla różnych węzłów w klastrze można łatwo pobrać, korzystając z następujących przykładów:

Wszystkie węzły

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

Węzły główne

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

Węzły robocze

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

Węzły dozorców

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

Uzyskiwanie wewnętrznego adresu IP węzłów klastra

Adresy IP zwracane przez przykłady w tej sekcji nie są bezpośrednio dostępne za pośrednictwem Internetu. Są one dostępne tylko w usłudze Azure Virtual Network, która zawiera klaster usługi HDInsight.

Aby uzyskać więcej informacji na temat pracy z usługą HDInsight i sieciami wirtualnymi, zobacz Planowanie sieci wirtualnej dla usługi HDInsight.

Aby znaleźć adres IP, należy znać wewnętrzną w pełni kwalifikowaną nazwę domeny (FQDN) węzłów klastra. Po utworzeniu nazwy FQDN można uzyskać adres IP hosta. W poniższych przykładach najpierw wykonaj zapytanie o nazwę Ambari dla nazwy FQDN wszystkich węzłów hosta. Następnie wysyła zapytanie do systemu Ambari pod kątem adresu IP każdego hosta.

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"
}

Pobieranie magazynu domyślnego

Klastry usługi HDInsight muszą używać konta usługi Azure Storage lub usługi Data Lake Storage jako domyślnego magazynu. Możesz użyć narzędzia Ambari, aby pobrać te informacje po utworzeniu klastra. Jeśli na przykład chcesz odczytywać/zapisywać dane w kontenerze poza usługą HDInsight.

Poniższe przykłady pobierają domyślną konfigurację magazynu z klastra:

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'

Ważne

Te przykłady zwracają pierwszą konfigurację zastosowaną do serwera (service_config_version=1), który zawiera te informacje. W przypadku pobrania wartości, która została zmodyfikowana po utworzeniu klastra, może być konieczne wyświetlenie listy wersji konfiguracji i pobranie najnowszej.

Wartość zwracana jest podobna do jednej z następujących przykładów:

  • wasbs://CONTAINER@ACCOUNTNAME.blob.core.windows.net — Ta wartość wskazuje, że klaster używa konta usługi Azure Storage do przechowywania domyślnego. Wartość ACCOUNTNAME jest nazwą konta magazynu. Część CONTAINER jest nazwą kontenera obiektów blob na koncie magazynu. Kontener jest katalogem głównym magazynu zgodnego z systemem plików HDFS dla klastra.

  • abfs://CONTAINER@ACCOUNTNAME.dfs.core.windows.net — Ta wartość wskazuje, że klaster używa usługi Azure Data Lake Storage Gen2 do przechowywania domyślnego. Wartości ACCOUNTNAME i CONTAINER mają takie same znaczenie jak w przypadku usługi Azure Storage wymienionej wcześniej.

  • adl://home — Ta wartość wskazuje, że klaster używa usługi Azure Data Lake Storage Gen1 do przechowywania domyślnego.

    Aby znaleźć nazwę konta usługi Data Lake Storage, użyj następujących przykładów:

    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'
    

    Wartość zwracana jest podobna do ACCOUNTNAME.azuredatalakestore.net, gdzie ACCOUNTNAME jest nazwą konta usługi Data Lake Storage.

    Aby znaleźć katalog w usłudze Data Lake Storage, który zawiera magazyn dla klastra, użyj następujących przykładów:

    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'
    

    Zwracana wartość jest podobna do /clusters/CLUSTERNAME/. Ta wartość jest ścieżką w ramach konta usługi Data Lake Storage. Ta ścieżka jest katalogem głównym systemu plików zgodnego z systemem plików HDFS dla klastra.

Uwaga

Polecenie cmdlet Get-AzHDInsightCluster udostępnione przez program Azure PowerShell zwraca również informacje o magazynie klastra.

Pobieranie wszystkich konfiguracji

Pobierz konfiguracje dostępne dla klastra.

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

Ten przykład zwraca dokument JSON zawierający bieżącą konfigurację zainstalowanych składników. Zobacz wartość tagu. Poniższy przykład to fragment danych zwracanych z typu klastra Spark.

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

Pobieranie konfiguracji dla określonego składnika

Uzyskaj konfigurację składnika, który cię interesuje. W poniższym przykładzie zastąp ciąg INITIAL wartością tagu zwróconą z poprzedniego żądania.

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

Ten przykład zwraca dokument JSON zawierający bieżącą konfigurację składnika livy2-conf .

Aktualizowanie konfiguracji

  1. Utwórz plik newconfig.json.
    Zmodyfikuj, a następnie wprowadź następujące polecenia:

    • Zastąp livy2-conf element nowym składnikiem.

    • Zastąp INITIAL element wartością rzeczywistą pobraną z tag polecenia Pobierz wszystkie konfiguracje.

      Odp. 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
      

      B. PowerShell
      Skrypt programu PowerShell używa języka jq. Edytuj C:\HD\jq\jq-win64 poniżej, aby odzwierciedlić rzeczywistą ścieżkę i wersję 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
      

      Zestaw Jq służy do przekształcania danych pobranych z usługi HDInsight w nowy szablon konfiguracji. W szczególności te przykłady wykonują następujące czynności:

    • Tworzy unikatową wartość zawierającą ciąg "version" i datę, która jest przechowywana w pliku newtag.

    • Tworzy dokument główny dla nowej konfiguracji.

    • Pobiera zawartość .items[] tablicy i dodaje ją pod elementem desired_config .

    • hrefUsuwa elementy , versioniConfig, ponieważ te elementy nie są potrzebne do przesłania nowej konfiguracji.

    • tag Dodaje element z wartością version#################. Część liczbowa jest oparta na bieżącej dacie. Każda konfiguracja musi mieć unikatowy tag.

      Na koniec dane są zapisywane w dokumencie newconfig.json . Struktura dokumentu powinna wyglądać podobnie do poniższego przykładu:

      {
        "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. Edytuj newconfig.jsonplik .
    Otwórz dokument i zmodyfikuj newconfig.json properties /dodaj wartości w obiekcie. Poniższy przykład zmienia wartość "livy.server.csrf_protection.enabled" z "true" na "false".

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

    Zapisz plik po zakończeniu wprowadzania modyfikacji.

  3. Prześlij plik newconfig.json.
    Użyj następujących poleceń, aby przesłać zaktualizowaną konfigurację do systemu 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
    

    Te polecenia przesyłają zawartość pliku newconfig.json do klastra jako nową konfigurację. Żądanie zwraca dokument JSON. Element versionTag w tym dokumencie powinien być zgodny z przesłaną wersją, a obiekt konfiguracji zawiera żądane zmiany konfiguracji.

Ponowne uruchamianie składnika usługi

W tym momencie internetowy interfejs użytkownika systemu Ambari wskazuje, że usługa Spark musi zostać ponownie uruchomiona, zanim nowa konfiguracja będzie mogła obowiązywać. Wykonaj poniższe kroki, aby ponownie uruchomić usługę.

  1. Użyj następujących elementów, aby włączyć tryb konserwacji dla usługi 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. Weryfikowanie trybu konserwacji

    Te polecenia wysyłają dokument JSON do serwera, który włącza tryb konserwacji. Możesz sprawdzić, czy usługa jest teraz w trybie konserwacji, korzystając z następującego żądania:

    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
    

    Zwracana wartość to ON.

  3. Następnie użyj następującego polecenia, aby wyłączyć usługę 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
    

    Odpowiedź jest podobna do poniższego przykładu:

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

    Ważne

    Wartość zwrócona href przez ten identyfikator URI używa wewnętrznego adresu IP węzła klastra. Aby używać go spoza klastra, zastąp 10.0.0.18:8080 część nazwą FQDN klastra.

  4. Sprawdź żądanie.
    Zmodyfikuj poniższe polecenie, zastępując 29 wartość rzeczywistą wartością id zwróconą z poprzedniego kroku. Następujące polecenia pobierają stan żądania:

    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
    

    Odpowiedź COMPLETED wskazuje, że żądanie zostało zakończone.

  5. Po zakończeniu poprzedniego żądania użyj następującego polecenia, aby uruchomić usługę 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
    

    Usługa korzysta teraz z nowej konfiguracji.

  6. Na koniec użyj poniższej instrukcji, aby wyłączyć tryb konserwacji.

    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"}}}'
    

Następne kroki

Aby uzyskać pełną dokumentację interfejsu API REST, zobacz Apache Ambari API Reference V1 (Dokumentacja interfejsu API apache Ambari w wersji 1). Zobacz również Autoryzowanie użytkowników dla widoków systemu Apache Ambari