Správa clusterů HDInsight pomocí rozhraní Apache Ambari REST API
Naučte se používat rozhraní Apache Ambari REST API 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í zálohované jeho rozhraními REST API. Ambari je ve výchozím nastavení poskytována 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 ve Windows 10. Příklady v tomto článku používají prostředí Bash ve Windows 10. Postup instalace najdete v průvodci instalací Subsystém Windows pro Linux pro Windows 10. Ostatní unixové prostředí fungují také. 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/.
Windows PowerShell. Nebo můžete použít Bash.
Základní jednotný identifikátor prostředku pro rozhraní Ambari REST API
Základní identifikátor URI (Uniform Resource Identifier) pro rozhraní Ambari REST API ve službě HDInsight je https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME
, kde CLUSTERNAME
je název vašeho clusteru. Názvy clusterů v identifikátorech URI rozlišují malá a velká písmena. Zatímco název clusteru v plně kvalifikovaném názvu domény (FQDN) části identifikátoru URI (CLUSTERNAME.azurehdinsight.net
) nerozlišuje malá a velká písmena, ostatní výskyty v identifikátoru URI rozlišují malá a velká písmena.
Ověřování
Připojení pro Ambari ve službě HDInsight vyžaduje HTTPS. Použijte název účtu správce (výchozí nastavení je správce) a heslo, které jste zadali při vytváření clusteru.
V případě clusterů balíčků zabezpečení podniku místo admin
toho použijte plně kvalifikované uživatelské jméno, například username@domain.onmicrosoft.com
.
Příklady
Nastavení (zachování přihlašovacích údajů)
Zachovejte své přihlašovací údaje, abyste se vyhnuli jejich opětovnému zadávání pro každý příklad. Název clusteru se zachová v samostatném kroku.
A. Bash
Upravte 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 názvu clusteru s správnými písmeny
Skutečná velikost názvu clusteru se může lišit od očekávaného velikostí. Následující kroky ukazují skutečné velikostí a pak je uložte do proměnné pro všechny pozdější příklady.
Upravte skripty tak, aby se nahradily CLUSTERNAME
názvem vašeho clusteru. Pak zadejte příkaz. (Název clusteru pro plně kvalifikovaný název domény nerozlišuje malá a velká 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 muset znát plně kvalifikovaný název domény (FQDN) uzlu clusteru. Plně kvalifikovaný název domény pro různé uzly v clusteru můžete snadno načíst pomocí následujících příkladů:
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řístupné přímo přes internet. Jsou přístupné jenom ve službě Azure Virtual Network, která obsahuje cluster HDInsight.
Další informace o práci se službou 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 pro plně kvalifikovaný název domény všech hostitelských uzlů. Potom se dotazuje Ambari 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 služby Azure Storage nebo Data Lake Storage. Ambari můžete použít k načtení těchto informací po vytvoření clusteru. Pokud například chcete číst a 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, možná budete 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
majíCONTAINER
stejné významy jako pro Službu Azure Storage, o které jsme se zmínili dříve.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'
Návratová hodnota je podobná
ACCOUNTNAME.azuredatalakestore.net
, kdeACCOUNTNAME
je název účtu Data Lake Storage.Pokud chcete najít adresář ve službě 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á
/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 PowerShellem také vrací 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, kterou 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
.
Aktualizace konfigurace
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 ztag
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. UpravteC:\HD\jq\jq-win64
níže, abyste odráželi 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 z HDInsight na novou šablonu konfigurace. Konkrétně tyto příklady 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á ho pod desired_config elementu.Odstraní prvky
href
,version
aConfig
prvky, protože 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 soubor dokončíte, uložte ho.
Odeslat
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ílaly 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í součásti služby
V tuto chvíli 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.
Režim údržby pro službu Spark2 povolíte následujícím postupem:
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 příkazu 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 požadavek.
Upravte následující příkaz nahrazením29
skutečné hodnoty vrácenéid
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ěď
COMPLETED
značí, že žádost byla dokončena.Po dokončení předchozího požadavku spusťte službu Spark2 pomocí následujícího příkazu.
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 k rozhraní REST API najdete v referenčních informacích k rozhraní Apache Ambari API V1. Viz také Autorizace uživatelů pro zobrazení Apache Ambari