Hantera HDInsight-kluster med hjälp av Apache Ambari REST API

Lär dig hur du använder Apache Ambari REST API för att hantera och övervaka Apache Hadoop-kluster i Azure HDInsight.

Vad är Apache Ambari?

Apache Ambari förenklar hanteringen och övervakningen av Hadoop-kluster genom att tillhandahålla ett lättanvänt webbgränssnitt som backas upp av dess REST-API:er. Ambari tillhandahålls som standard med Linux-baserade HDInsight-kluster.

Förutsättningar

Grundläggande enhetlig resursidentifierare för Ambari REST API

Bas-URI (Uniform Resource Identifier) för Ambari REST API på HDInsight är https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, där CLUSTERNAME är namnet på klustret. Klusternamn i URI:er är skiftlägeskänsliga. Klusternamnet i den fullständigt kvalificerade domännamnsdelen (FQDN) i URI:n (CLUSTERNAME.azurehdinsight.net) är skiftlägeskänsligt, men andra förekomster i URI:n är skiftlägeskänsliga.

Autentisering

Https krävs för att ansluta till Ambari på HDInsight. Använd administratörskontots namn (standardnamnet är admin) och lösenordet som du angav när klustret skapades.

För Enterprise Security Package-kluster använder du i stället adminför ett fullständigt kvalificerat användarnamn som username@domain.onmicrosoft.com.

Exempel

Installation (behåll autentiseringsuppgifter)

Behåll dina autentiseringsuppgifter för att undvika att ange dem igen för varje exempel. Klusternamnet bevaras i ett separat steg.

A. Bash
Redigera skriptet nedan genom att PASSWORD ersätta med ditt faktiska lösenord. Ange sedan kommandot .

export password='PASSWORD'

B. PowerShell

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

Identifiera klusternamn med rätt skiftläge

Klusternamnets faktiska hölje kan skilja sig från förväntat. Stegen här visar det faktiska höljet och lagrar det sedan i en variabel för alla senare exempel.

Redigera skripten nedan för att ersätta CLUSTERNAME med klustrets namn. Ange sedan kommandot . (Klusternamnet för FQDN är inte skiftlägeskänsligt.)

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

Parsa JSON-data

I följande exempel används jq eller ConvertFrom-Json för att parsa JSON-svarsdokumentet och endast health_report visa informationen från resultaten.

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

Hämta FQDN för klusternoder

Du kan behöva känna till det fullständigt kvalificerade domännamnet (FQDN) för en klusternod. Du kan enkelt hämta FQDN för de olika noderna i klustret med hjälp av följande exempel:

Alla noder

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

Huvudnoder

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

Arbetsnoder

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-noder

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

Hämta den interna IP-adressen för klusternoder

IP-adresserna som returneras av exemplen i det här avsnittet är inte direkt tillgängliga via Internet. De är endast tillgängliga i Azure-Virtual Network som innehåller HDInsight-klustret.

Mer information om hur du arbetar med HDInsight och virtuella nätverk finns i Planera ett virtuellt nätverk för HDInsight.

För att hitta IP-adressen måste du känna till det interna fullständigt kvalificerade domännamnet (FQDN) för klusternoderna. När du har FQDN kan du hämta värdens IP-adress. I följande exempel frågas först Ambari efter FQDN för alla värdnoder. Frågar sedan Ambari om IP-adressen för varje värd.

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

Hämta standardlagringen

HDInsight-kluster måste använda ett Azure Storage-konto eller Data Lake Storage som standardlagring. Du kan använda Ambari för att hämta den här informationen när klustret har skapats. Om du till exempel vill läsa/skriva data till containern utanför HDInsight.

I följande exempel hämtas standardlagringskonfigurationen från klustret:

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'

Viktigt

De här exemplen returnerar den första konfigurationen som tillämpas på servern (service_config_version=1) som innehåller den här informationen. Om du hämtar ett värde som har ändrats efter att klustret har skapats kan du behöva lista konfigurationsversionerna och hämta den senaste.

Returvärdet liknar något av följande exempel:

  • wasbs://CONTAINER@ACCOUNTNAME.blob.core.windows.net – Det här värdet anger att klustret använder ett Azure Storage-konto för standardlagring. Värdet ACCOUNTNAME är namnet på lagringskontot. Delen CONTAINER är namnet på blobcontainern i lagringskontot. Containern är roten till det HDFS-kompatibla lagringsutrymmet för klustret.

  • abfs://CONTAINER@ACCOUNTNAME.dfs.core.windows.net– Det här värdet anger att klustret använder Azure Data Lake Storage Gen2 för standardlagring. Värdena ACCOUNTNAME och CONTAINER har samma betydelser som för Azure Storage som nämnts tidigare.

  • adl://home– Det här värdet anger att klustret använder Azure Data Lake Storage Gen1 för standardlagring.

    Använd följande exempel för att hitta Data Lake Storage kontonamn:

    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'
    

    Returvärdet liknar ACCOUNTNAME.azuredatalakestore.net, där ACCOUNTNAME är namnet på det Data Lake Storage kontot.

    Använd följande exempel för att hitta katalogen i Data Lake Storage som innehåller lagringen för klustret:

    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'
    

    Returvärdet liknar /clusters/CLUSTERNAME/. Det här värdet är en sökväg i Data Lake Storage-kontot. Den här sökvägen är roten till det HDFS-kompatibla filsystemet för klustret.

Anteckning

Cmdleten Get-AzHDInsightCluster som tillhandahålls av Azure PowerShell returnerar också lagringsinformationen för klustret.

Hämta alla konfigurationer

Hämta de konfigurationer som är tillgängliga för klustret.

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

Det här exemplet returnerar ett JSON-dokument som innehåller den aktuella konfigurationen för installerade komponenter. Se taggvärdet . Följande exempel är ett utdrag från data som returneras från en Spark-klustertyp.

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

Hämta konfiguration för en specifik komponent

Hämta konfigurationen för komponenten som du är intresserad av. I följande exempel ersätter du INITIAL med taggvärdet som returnerades från föregående begäran.

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

Det här exemplet returnerar ett JSON-dokument som innehåller den aktuella konfigurationen för komponenten livy2-conf .

Uppdatera konfiguration

  1. Skapa newconfig.json.
    Ändra och ange sedan kommandona nedan:

    • Ersätt livy2-conf med den nya komponenten.

    • Ersätt INITIAL med det faktiska värdet som hämtats för tag från Hämta alla konfigurationer.

      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
      PowerShell-skriptet använder jq. Redigera C:\HD\jq\jq-win64 nedan för att återspegla din faktiska sökväg och version av 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 används för att omvandla data som hämtats från HDInsight till en ny konfigurationsmall. Mer specifikt utför de här exemplen följande åtgärder:

    • Skapar ett unikt värde som innehåller strängen "version" och datumet, som lagras i newtag.

    • Skapar ett rotdokument för den nya konfigurationen.

    • Hämtar innehållet i matrisen .items[] och lägger till det under elementet desired_config .

    • Tar bort elementen href, versionoch Config eftersom dessa element inte behövs för att skicka en ny konfiguration.

    • Lägger till ett tag element med värdet version#################. Den numeriska delen baseras på aktuellt datum. Varje konfiguration måste ha en unik tagg.

      Slutligen sparas data i newconfig.json dokumentet. Dokumentstrukturen bör se ut ungefär som i följande exempel:

      {
        "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. Redigera newconfig.json.
    newconfig.json Öppna dokumentet och ändra/lägga till värden i objektetproperties. I följande exempel ändras värdet "livy.server.csrf_protection.enabled" för från "true" till "false".

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

    Spara filen när du är klar med att göra ändringar.

  3. Skicka .newconfig.json
    Använd följande kommandon för att skicka den uppdaterade konfigurationen till 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
    

    Dessa kommandon skickar innehållet i filen newconfig.json till klustret som den nya konfigurationen. Begäran returnerar ett JSON-dokument. Elementet versionTag i det här dokumentet ska matcha den version som du skickade och konfigurationsobjektet innehåller de konfigurationsändringar som du begärde.

Starta om en tjänstkomponent

Nu anger Ambari-webbgränssnittet att Spark-tjänsten måste startas om innan den nya konfigurationen kan börja gälla. Starta om tjänsten med hjälp av följande steg.

  1. Använd följande för att aktivera underhållsläge för Spark2-tjänsten:

    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. Kontrollera underhållsläge

    Dessa kommandon skickar ett JSON-dokument till servern som aktiverar underhållsläge. Du kan kontrollera att tjänsten nu är i underhållsläge med hjälp av följande begäran:

    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
    

    Returvärdet är ON.

  3. Använd sedan följande för att inaktivera Spark2-tjänsten:

    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
    

    Svaret liknar följande exempel:

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

    Viktigt

    Värdet href som returneras av den här URI:n använder klusternodens interna IP-adress. Om du vill använda den utanför klustret ersätter du 10.0.0.18:8080 delen med klustrets fullständiga domännamn.

  4. Verifiera begäran.
    Redigera kommandot nedan genom att 29 ersätta med det faktiska värdet för id som returnerades från föregående steg. Följande kommandon hämtar status för begäran:

    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
    

    Ett svar på COMPLETED anger att begäran har slutförts.

  5. När den tidigare begäran har slutförts använder du följande för att starta Spark2-tjänsten.

    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
    

    Tjänsten använder nu den nya konfigurationen.

  6. Använd slutligen följande för att inaktivera underhållsläget.

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

Nästa steg

En fullständig referens till REST API finns i Apache Ambari API Reference V1. Se även Auktorisera användare för Apache Ambari-vyer