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 monitorowanie ich, zapewniając łatwy w użyciu internetowy interfejs użytkownika wspierany przez jego 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 to nazwa klastra. W nazwach klastrów w identyfikatorach URI jest rozróżniana wielkość liter. Nazwa klastra w w pełni kwalifikowanej części nazwy domeny (FQDN) identyfikatora URI (CLUSTERNAME.azurehdinsight.net) nie uwzględnia wielkości liter, ale w innych wystąpieniach w identyfikatorze URI jest uwzględniana wielkość liter.

Authentication

Nawiązywanie połączenia z usługą 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 zostanie zachowana w osobnym kroku.

A. Bash
Zmodyfikuj poniższy 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"

Identyfikowanie nazwy klastra o prawidłowym przypadku

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

Zmodyfikuj poniższe 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żesz uzyskać adres IP hosta. W poniższych przykładach najpierw odpytuję 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 Data Lake Storage jako magazynu domyślnego. 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.

W poniższych przykładach pobrano 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 zmodyfikowanej 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 dla magazynu 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 Azure Data Lake Storage Gen2 dla magazynu 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 Azure Data Lake Storage Gen1 dla magazynu domyślnego.

    Aby znaleźć nazwę konta 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'
    

    Zwracana wartość jest podobna do ACCOUNTNAME.azuredatalakestore.net, gdzie ACCOUNTNAME jest nazwą konta Data Lake Storage.

    Aby znaleźć katalog w 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 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 Azure PowerShell zwraca również informacje o magazynie dla 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

Pobierz konfigurację interesującego Cię składnika. W poniższym przykładzie zastąp INITIAL ciąg 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ę livy2-conf składnika.

Aktualizowanie konfiguracji

  1. Utwórz plik newconfig.json.
    Zmodyfikuj, a następnie wprowadź poniższe polecenia:

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

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

      A. 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ę pliku 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
      

      Narzędzie 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.jsonproperties /dodaj wartości w obiekcie . Poniższy przykład zmienia wartość z "livy.server.csrf_protection.enabled""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 configs 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 zacznie obowiązywać. Aby ponownie uruchomić usługę, wykonaj następujące kroki.

  1. Aby włączyć tryb konserwacji dla usługi Spark2, wykonaj następujące czynności:

    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ść href zwrócona przez ten identyfikator URI używa wewnętrznego adresu IP węzła klastra. Aby użyć go spoza klastra, zastąp 10.0.0.18:8080 część nazwą FQDN klastra.

  4. Zweryfikuj żądanie.
    Zmodyfikuj poniższe polecenie, zastępując 29 wartość rzeczywistą zwracaną id 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ź wskazuje COMPLETED , ż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ższych 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 Dokumentacja interfejsu API apache Ambari w wersji 1. Zobacz również autoryzowanie użytkowników dla widoków systemu Apache Ambari