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
Ett Hadoop-kluster i HDInsight. Se Komma igång med HDInsight i Linux.
Bash på Ubuntu på Windows 10. Exemplen i den här artikeln använder Bash-gränssnittet i Windows 10. Installationssteg finns i installationsguiden för Windows-undersystem för Linux för Windows 10. Andra Unix-gränssnitt fungerar också. Exemplen, med några små ändringar, kan fungera i en Windows-kommandotolk. Eller så kan du använda Windows PowerShell.
jq, en JSON-processor på kommandoraden. Se https://stedolan.github.io/jq/.
Windows PowerShell. Eller så kan du använda Bash.
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 admin
ett 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ärdetACCOUNTNAME
är namnet på lagringskontot. DelenCONTAINER
ä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ärdenaACCOUNTNAME
ochCONTAINER
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ärACCOUNTNAME
ä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
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örtag
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. RedigeraC:\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
,version
ochConfig
eftersom dessa element inte behövs för att skicka en ny konfiguration.Lägger till ett
tag
element med värdetversion#################
. 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", .... }, }, } }
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.
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.
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"}}}'
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
.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ätter10.0.0.18:8080
du delen med klustrets fullständiga domännamn.Verifiera begäran.
Redigera kommandot nedan genom att29
ersätta med det faktiska värdet förid
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.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.
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