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

Naučte se používat rozhraní Apache Ambari REST API 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í zálohované jeho rozhraními REST API. Ambari je ve výchozím nastavení poskytována s clustery HDInsight se systémem Linux.

Požadavky

Základní jednotný identifikátor prostředku pro rozhraní Ambari REST API

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

Ověřování

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

V případě clusterů balíčků zabezpečení podniku místo admintoho použijte plně kvalifikované uživatelské jméno, například username@domain.onmicrosoft.com.

Příklady

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

Zachovejte své přihlašovací údaje, abyste se vyhnuli jejich opětovnému zadávání pro každý příklad. Název clusteru se zachová v samostatném kroku.

A. Bash
Upravte 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 názvu clusteru s správnými písmeny

Skutečná velikost názvu clusteru se může lišit od očekávaného velikostí. Následující kroky ukazují skutečné velikostí a pak je uložte do proměnné pro všechny pozdější příklady.

Upravte skripty tak, aby se nahradily CLUSTERNAME názvem vašeho clusteru. Pak zadejte příkaz. (Název clusteru pro plně kvalifikovaný název domény nerozlišuje malá a velká 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 muset znát plně kvalifikovaný název domény (FQDN) uzlu clusteru. Plně kvalifikovaný název domény pro různé uzly v clusteru můžete snadno načíst pomocí následujících příkladů:

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řístupné přímo přes internet. Jsou přístupné jenom ve službě Azure Virtual Network, která obsahuje cluster HDInsight.

Další informace o práci se službou 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 pro plně kvalifikovaný název domény všech hostitelských uzlů. Potom se dotazuje Ambari 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 služby Azure Storage nebo Data Lake Storage. Ambari můžete použít k načtení těchto informací po vytvoření clusteru. Pokud například chcete číst a 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, možná budete 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 mají CONTAINER stejné významy jako pro Službu Azure Storage, o které jsme se zmínili dříve.

  • 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'
    

    Návratová hodnota je podobná ACCOUNTNAME.azuredatalakestore.net, kde ACCOUNTNAME je název účtu Data Lake Storage.

    Pokud chcete najít adresář ve službě 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á /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 PowerShellem také vrací 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, kterou 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 .

Aktualizace konfigurace

  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 z tag 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 C:\HD\jq\jq-win64 níže, abyste odráželi 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 z HDInsight na novou šablonu konfigurace. Konkrétně tyto příklady 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á ho pod desired_config elementu.

    • Odstraní prvky href, versiona Config prvky, protože 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 soubor dokončíte, uložte ho.

  3. Odeslat 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ílaly 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í součásti služby

V tuto chvíli 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. Režim údržby pro službu Spark2 povolíte následujícím postupem:

    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 příkazu 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 požadavek.
    Upravte následující příkaz nahrazením 29 skutečné hodnoty vrácené 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ěď COMPLETED značí, že žádost byla dokončena.

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

    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 k rozhraní REST API najdete v referenčních informacích k rozhraní Apache Ambari API V1. Viz také Autorizace uživatelů pro zobrazení Apache Ambari