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 Kom igång med HDInsight i Linux.
Bash på Ubuntu på Windows 10. Exemplen i den här artikeln använder Bash-gränssnittet på 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 vissa små ändringar, kan fungera i en Kommandotolk i Windows. 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
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 admin
fö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ärdetACCOUNTNAME
är namnet på lagringskontot. DelenCONTAINER
ä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ärdenaACCOUNTNAME
ochCONTAINER
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ärACCOUNTNAME
ä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
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ö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 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.
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"}}}'
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
.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 du10.0.0.18:8080
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 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.
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