Správa clusterů HDInsight pomocí rozhraní Apache Ambari REST API
Naučte se používat rozhraní REST API Apache Ambari 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í s využitím rozhraní REST API. Ambari se ve výchozím nastavení poskytuje s clustery HDInsight se systémem Linux.
Požadavky
Cluster Hadoop ve službě HDInsight. Viz Začínáme se službou HDInsight v Linuxu.
Bash na Ubuntu na Windows 10. Příklady v tomto článku používají prostředí Bash na Windows 10. Postup instalace najdete v průvodci instalací Subsystém Windows pro Linux Windows 10. Budou fungovat i další unixová prostředí . Příklady s drobnými úpravami můžou fungovat na příkazovém řádku Windows. Nebo můžete použít Windows PowerShell.
jq, procesor JSON příkazového řádku. Viz třída https://stedolan.github.io/jq/.
Prostředí Windows PowerShell. Nebo můžete použít Bash.
Identifikátor základního jednotného prostředku pro rozhraní REST API Ambari
Základní identifikátor URI (Uniform Resource Identifier) pro rozhraní REST API Ambari ve službě HDInsight je https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME
, kde CLUSTERNAME
je název vašeho clusteru. V názvech clusterů v identifikátorech URI se rozlišují velká a malá písmena. Zatímco název clusteru v části plně kvalifikovaného názvu domény (FQDN) identifikátoru URI (CLUSTERNAME.azurehdinsight.net
) nerozlišuje velká a malá písmena, ostatní výskyty v identifikátoru URI rozlišují malá a malá písmena.
Authentication
Připojení k Ambari ve službě HDInsight vyžaduje protokol HTTPS. Použijte název účtu správce (výchozí je admin) a heslo, které jste zadali při vytváření clusteru.
Pro clustery Enterprise Security Package místo admin
použijte plně kvalifikované uživatelské jméno, jako je username@domain.onmicrosoft.com
.
Příklady
Nastavení (zachování přihlašovacích údajů)
Svoje přihlašovací údaje si zachovejte, abyste je nemuseli znovu zadávat v každém příkladu. Název clusteru se zachová v samostatném kroku.
A. Bash
Upravte níže uvedený 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 správně velkého názvu clusteru
Skutečná velikost písmen názvu clusteru se může lišit, než očekáváte. V těchto krocích se zobrazí skutečná velikost písmen a pak se uloží do proměnné pro všechny pozdější příklady.
Upravte níže uvedené skripty a nahraďte CLUSTERNAME
je názvem clusteru. Pak zadejte příkaz. (V názvu clusteru pro plně kvalifikovaný název domény se nerozlišuje velká a malá 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 potřebovat znát plně kvalifikovaný název domény (FQDN) uzlu clusteru. Pomocí následujících příkladů můžete snadno načíst plně kvalifikovaný název domény pro různé uzly v clusteru:
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římo přístupné přes internet. Jsou přístupné jenom v rámci azure Virtual Network, která obsahuje cluster HDInsight.
Další informace o práci s 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 na plně kvalifikovaný název domény všech hostitelských uzlů. Pak se Ambari dotazuje 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 úložiště Azure nebo Data Lake Storage. Tyto informace můžete po vytvoření clusteru načíst pomocí Ambari. Například pokud chcete číst/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, budete možná 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. HodnotaACCOUNTNAME
je název účtu úložiště. ČástCONTAINER
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. HodnotyACCOUNTNAME
aCONTAINER
mají stejný význam jako pro Službu Azure Storage, kterou jsme zmínili výše.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'
Vrácená hodnota je podobná hodnotě
ACCOUNTNAME.azuredatalakestore.net
, kdeACCOUNTNAME
je název účtu Data Lake Storage.Pokud chcete najít adresář v rámci 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á hodnotě
/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 PowerShell také vrátí 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, která 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
.
Aktualizovat konfiguraci
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 protag
z 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 následující textC:\HD\jq\jq-win64
tak, aby odrážel 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 ze služby HDInsight na novou šablonu konfigurace. Tyto příklady konkrétně 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á jej pod prvek desired_config .Odstraní elementy
href
,version
a , protožeConfig
tyto prvky nejsou potřeba k odeslání nové konfigurace.tag
Přidá prvek s hodnotouversion#################
. Čí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", .... }, }, } }
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 dokončíte úpravy, soubor uložte.
Odešlete
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ílají 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í komponenty služby
V tomto okamžiku 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.
K povolení režimu údržby pro službu Spark2 použijte následující:
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"}}}'
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
.Dále pomocí následujícího postupu 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ďte10.0.0.18:8080
část plně kvalifikovaným názvem domény clusteru.Ověřte žádost.
Upravte následující příkaz tak, že nahradíte29
skutečnou hodnotou vrácenouid
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ěď značí
COMPLETED
, že požadavek byl dokončen.Po dokončení předchozího požadavku spusťte službu Spark2 následujícím postupem.
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.
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 o rozhraní REST API najdete v tématu Referenční informace k rozhraní Apache Ambari API V1. Viz také Autorizace uživatelů pro zobrazení Apache Ambari.