Share via


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

URI (Base 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änslig, men andra förekomster i URI:n är skiftlägeskänsliga.

Autentisering

Anslut till Ambari på HDInsight kräver HTTPS. Använd administratörskontots namn (standardvärdet är administratör) och lösenordet som du angav när klustret skapades.

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

Exempel

Installation (Bevara 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 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 ett korrekt skiftlägesklusternamn

Det faktiska höljet för klusternamnet kan skilja sig från förväntat. Följande steg visar det faktiska höljet och lagrar det sedan i en variabel för alla senare exempel.

Redigera skripten för att ersätta CLUSTERNAME med ditt klusternamn. 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 det fullständiga domännamnet 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ågar du först Ambari om FQDN för alla värdnoder. Frågar sedan Ambari efter 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.

Följande exempel hämtar 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 när 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 den HDFS-kompatibla lagringen 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 betydelse som för Azure Storage som tidigare nämnts.

  • 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 namnet på Data Lake Storage-kontot:

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

Kommentar

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 den komponent 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 på följande sätt:

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

    • Ersätt INITIAL med det faktiska värde 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 newconfig.json-filen 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. Använd följande steg för att starta om tjänsten.

  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. Verifiera 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 10.0.0.18:8080 du 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 föregående 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