Správa clusterů HDInsight pomocí rozhraní Apache Ambari REST API

Naučte se používat rozhraní REST API Apache Ambari ke správě a monitorování clusterů Apache Hadoop ve službě Azure HDInsight.

Co je Apache Ambari

Apache Ambari zjednodušuje správu a monitorování clusterů Hadoop tím, že poskytuje snadno použitelné webové uživatelské rozhraní s využitím rozhraní REST API. Ambari se ve výchozím nastavení poskytuje s clustery HDInsight se systémem Linux.

Požadavky

Identifikátor základního jednotného prostředku pro rozhraní REST API Ambari

Základní identifikátor URI (Uniform Resource Identifier) pro rozhraní REST API Ambari ve službě HDInsight je https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, kde CLUSTERNAME je název vašeho clusteru. V názvech clusterů v identifikátorech URI se rozlišují velká a malá písmena. Zatímco název clusteru v části plně kvalifikovaného názvu domény (FQDN) identifikátoru URI (CLUSTERNAME.azurehdinsight.net) nerozlišuje velká a malá písmena, ostatní výskyty v identifikátoru URI rozlišují malá a malá písmena.

Authentication

Připojení k Ambari ve službě HDInsight vyžaduje protokol HTTPS. Použijte název účtu správce (výchozí je admin) a heslo, které jste zadali při vytváření clusteru.

Pro clustery Enterprise Security Package místo adminpoužijte plně kvalifikované uživatelské jméno, jako je username@domain.onmicrosoft.com.

Příklady

Nastavení (zachování přihlašovacích údajů)

Svoje přihlašovací údaje si zachovejte, abyste je nemuseli znovu zadávat v každém příkladu. Název clusteru se zachová v samostatném kroku.

A. Bash
Upravte níže uvedený skript nahrazením PASSWORD skutečným heslem. Pak zadejte příkaz.

export password='PASSWORD'

B. PowerShell

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

Identifikace správně velkého názvu clusteru

Skutečná velikost písmen názvu clusteru se může lišit, než očekáváte. V těchto krocích se zobrazí skutečná velikost písmen a pak se uloží do proměnné pro všechny pozdější příklady.

Upravte níže uvedené skripty a nahraďte CLUSTERNAME je názvem clusteru. Pak zadejte příkaz. (V názvu clusteru pro plně kvalifikovaný název domény se nerozlišuje velká a malá písmena.)

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

Analýza dat JSON

Následující příklad používá jq nebo ConvertFrom-Json k analýze dokumentu odpovědi JSON a zobrazení pouze health_report informací z výsledků.

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

Získání plně kvalifikovaného názvu domény uzlů clusteru

Možná budete potřebovat znát plně kvalifikovaný název domény (FQDN) uzlu clusteru. Pomocí následujících příkladů můžete snadno načíst plně kvalifikovaný název domény pro různé uzly v clusteru:

Všechny uzly

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

Hlavní uzly

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

Pracovní uzly

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

Uzly 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

Získání interní IP adresy uzlů clusteru

IP adresy vrácené příklady v této části nejsou přímo přístupné přes internet. Jsou přístupné jenom v rámci azure Virtual Network, která obsahuje cluster HDInsight.

Další informace o práci s HDInsight a virtuálními sítěmi najdete v tématu Plánování virtuální sítě pro HDInsight.

Pokud chcete najít IP adresu, musíte znát interní plně kvalifikovaný název domény (FQDN) uzlů clusteru. Jakmile budete mít plně kvalifikovaný název domény, můžete získat IP adresu hostitele. Následující příklady nejprve dotazují Ambari na plně kvalifikovaný název domény všech hostitelských uzlů. Pak se Ambari dotazuje na IP adresu každého hostitele.

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

Získání výchozího úložiště

Clustery HDInsight musí jako výchozí úložiště používat účet úložiště Azure nebo Data Lake Storage. Tyto informace můžete po vytvoření clusteru načíst pomocí Ambari. Například pokud chcete číst/zapisovat data do kontejneru mimo HDInsight.

Následující příklady načtou výchozí konfiguraci úložiště z clusteru:

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'

Důležité

Tyto příklady vrátí první konfiguraci použitou na server (service_config_version=1), který obsahuje tyto informace. Pokud načtete hodnotu, která byla změněna po vytvoření clusteru, budete možná muset zobrazit seznam verzí konfigurace a načíst nejnovější verzi.

Návratová hodnota je podobná některému z následujících příkladů:

  • wasbs://CONTAINER@ACCOUNTNAME.blob.core.windows.net – Tato hodnota označuje, že cluster pro výchozí úložiště používá účet Azure Storage. Hodnota ACCOUNTNAME je název účtu úložiště. Část CONTAINER je název kontejneru objektů blob v účtu úložiště. Kontejner je kořenem úložiště kompatibilního s HDFS pro cluster.

  • abfs://CONTAINER@ACCOUNTNAME.dfs.core.windows.net– Tato hodnota označuje, že cluster pro výchozí úložiště používá Azure Data Lake Storage Gen2. Hodnoty ACCOUNTNAME a CONTAINER mají stejný význam jako pro Službu Azure Storage, kterou jsme zmínili výše.

  • adl://home– Tato hodnota označuje, že cluster pro výchozí úložiště používá Azure Data Lake Storage Gen1.

    Pokud chcete najít název účtu Data Lake Storage, použijte následující příklady:

    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'
    

    Vrácená hodnota je podobná hodnotě ACCOUNTNAME.azuredatalakestore.net, kde ACCOUNTNAME je název účtu Data Lake Storage.

    Pokud chcete najít adresář v rámci Data Lake Storage, který obsahuje úložiště pro cluster, použijte následující příklady:

    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'
    

    Návratová hodnota je podobná hodnotě /clusters/CLUSTERNAME/. Tato hodnota je cesta v rámci účtu Data Lake Storage. Tato cesta je kořenem systému souborů kompatibilního s HDFS pro cluster.

Poznámka

Rutina Get-AzHDInsightCluster poskytovaná Azure PowerShell také vrátí informace o úložišti pro cluster.

Získání všech konfigurací

Získejte konfigurace, které jsou dostupné pro váš cluster.

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

Tento příklad vrátí dokument JSON obsahující aktuální konfiguraci nainstalovaných komponent. Podívejte se na hodnotu značky . Následující příklad je výňatek z dat vrácených z typu clusteru Spark.

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

Získání konfigurace pro konkrétní komponentu

Získejte konfiguraci pro komponentu, která vás zajímá. V následujícím příkladu nahraďte INITIAL hodnotou značky vrácenou z předchozího požadavku.

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

Tento příklad vrátí dokument JSON obsahující aktuální konfiguraci komponenty livy2-conf .

Aktualizovat konfiguraci

  1. Vytvořte newconfig.json.
    Upravte a zadejte následující příkazy:

    • Nahraďte livy2-conf novou komponentou.

    • Nahraďte INITIAL skutečnou hodnotou načtenou pro tag z možnosti Získat všechny konfigurace.

      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
      Skript PowerShellu používá jq. Upravte následující text C:\HD\jq\jq-win64 tak, aby odrážel vaši skutečnou cestu a verzi 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 se používá k převodu dat načtených ze služby HDInsight na novou šablonu konfigurace. Tyto příklady konkrétně provádějí následující akce:

    • Vytvoří jedinečnou hodnotu obsahující řetězec "version" a datum, které je uloženo v newtag.

    • Vytvoří kořenový dokument pro novou konfiguraci.

    • Získá obsah .items[] pole a přidá jej pod prvek desired_config .

    • Odstraní elementy href, versiona , protože Config tyto prvky nejsou potřeba k odeslání nové konfigurace.

    • tag Přidá prvek s hodnotou version#################. Číselná část vychází z aktuálního data. Každá konfigurace musí mít jedinečnou značku.

      Nakonec se data uloží do newconfig.json dokumentu. Struktura dokumentu by se měla podobat následujícímu příkladu:

      {
        "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. Upravit newconfig.json.
    newconfig.json Otevřete dokument a upravte nebo přidejte hodnoty v objektuproperties. Následující příklad změní hodnotu "livy.server.csrf_protection.enabled" z "true" na "false".

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

    Jakmile dokončíte úpravy, soubor uložte.

  3. Odešlete newconfig.json.
    Pomocí následujících příkazů odešlete aktualizovanou konfiguraci do 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
    

    Tyto příkazy odesílají obsah souboru newconfig.json do clusteru jako novou konfiguraci. Požadavek vrátí dokument JSON. Element versionTag v tomto dokumentu by měl odpovídat verzi, kterou jste odeslali, a objekt configs obsahuje požadované změny konfigurace.

Restartování komponenty služby

V tomto okamžiku webové uživatelské rozhraní Ambari indikuje, že službu Spark je potřeba restartovat, aby se nová konfigurace projevila. K restartování služby použijte následující postup.

  1. K povolení režimu údržby pro službu Spark2 použijte následující:

    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. Ověření režimu údržby

    Tyto příkazy odešlou dokument JSON na server, který zapne režim údržby. Pomocí následujícího požadavku můžete ověřit, že je služba nyní v režimu údržby:

    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
    

    Vrácená hodnota je ON.

  3. Dále pomocí následujícího postupu vypněte službu 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
    

    Odpověď bude podobná jako v následujícím příkladu:

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

    Důležité

    Hodnota href vrácená tímto identifikátorem URI používá interní IP adresu uzlu clusteru. Pokud ji chcete použít mimo cluster, nahraďte 10.0.0.18:8080 část plně kvalifikovaným názvem domény clusteru.

  4. Ověřte žádost.
    Upravte následující příkaz tak, že nahradíte 29 skutečnou hodnotou vrácenou id z předchozího kroku. Následující příkazy načtou stav požadavku:

    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
    

    Odpověď značí COMPLETED , že požadavek byl dokončen.

  5. Po dokončení předchozího požadavku spusťte službu Spark2 následujícím postupem.

    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
    

    Služba teď používá novou konfiguraci.

  6. Nakonec pomocí následujícího příkazu vypněte režim údržby.

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

Další kroky

Kompletní referenční informace o rozhraní REST API najdete v tématu Referenční informace k rozhraní Apache Ambari API V1. Viz také Autorizace uživatelů pro zobrazení Apache Ambari.