Vývoj akcí skriptů pomocí HDInsightu
Zjistěte, jak přizpůsobit cluster HDInsight pomocí skriptů Bash. Akce skriptů představují způsob, jak přizpůsobit HDInsight během vytváření clusteru nebo po jeho vytvoření.
Co jsou akce skriptu
Akce skriptů jsou skripty Bash, které Azure běží na uzlech clusteru, aby se udělaly změny konfigurace nebo nainstaloval software. Akce skriptu se spustí jako kořen a poskytuje úplná přístupová práva k uzlům clusteru.
Akce skriptu lze použít pomocí následujících metod:
Tuto metodu použijte k použití skriptu... | Během vytváření clusteru... | Na spuštěném clusteru... |
---|---|---|
portál Azure | ✓ | ✓ |
Azure PowerShell | ✓ | ✓ |
Azure Classic CLI | ✓ | |
Sada HDInsight .NET SDK | ✓ | ✓ |
Šablona Azure Resource Manageru | ✓ |
Další informace o použití akcí skriptů najdete v tématu Přizpůsobení clusterů HDInsight pomocí akcí skriptu.
Osvědčené postupy pro vývoj skriptů
Při vývoji vlastního skriptu pro cluster HDInsight je potřeba mít na paměti několik osvědčených postupů:
- Cílení na verzi Apache Hadoopu
- Cílení na verzi operačního systému
- Poskytnutí stabilních odkazů na prostředky skriptu
- Použití předem zkompilovaných prostředků
- Ujistěte se, že je skript pro přizpůsobení clusteru idempotentní.
- Zajištění vysoké dostupnosti architektury clusteru
- Konfigurace vlastních komponent pro použití služby Azure Blob Storage
- Zápis informací do STDOUT a STDERR
- Uložení souborů jako ASCII s koncovkami řádků LF
- Použití logiky opakování k zotavení z přechodných chyb
Důležité
Akce skriptu se musí dokončit do 60 minut nebo proces selže. Během zřizování uzlů se skript spouští souběžně s jinými procesy instalace a konfigurace. Konkurence pro prostředky, jako je čas procesoru nebo šířka pásma sítě, může způsobit, že dokončení skriptu trvá déle, než to dělá ve vývojovém prostředí.
Cílení na verzi Apache Hadoopu
Různé verze HDInsight mají nainstalované různé verze služeb a komponent Systému Hadoop. Pokud váš skript očekává konkrétní verzi služby nebo komponenty, měli byste tento skript použít pouze s verzí SLUŽBY HDInsight, která obsahuje požadované součásti. Informace o verzích součástí zahrnutých ve službě HDInsight najdete v dokumentu správy verzí součástí HDInsight.
Kontrola verze operačního systému
Různé verze SLUŽBY HDInsight se spoléhají na konkrétní verze Ubuntu. Mezi verzemi operačního systému můžou být rozdíly, které musíte ve skriptu zkontrolovat. Můžete například potřebovat nainstalovat binární soubor, který je svázaný s verzí Ubuntu.
Pokud chcete zkontrolovat verzi operačního systému, použijte lsb_release
. Následující skript například ukazuje, jak odkazovat na konkrétní soubor tar v závislosti na verzi operačního systému:
OS_VERSION=$(lsb_release -sr)
if [[ $OS_VERSION == 14* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-14-04."
HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-16-04."
HUE_TARFILE=hue-binaries-16-04.tgz
fi
Cílení na verzi operačního systému
HDInsight je založen na distribuci Ubuntu Linuxu. Různé verze HDInsight se spoléhají na různé verze Ubuntu, které můžou změnit chování skriptu. Například HDInsight 3.4 a starší jsou založené na verzích Ubuntu, které používají Upstart. Verze 3.5 a vyšší jsou založené na Ubuntu 16.04, který používá Systemd
. Systemd
a Upstart spoléhají na různé příkazy, takže skript by se měl zapsat, aby fungoval s oběma příkazy.
Dalším důležitým rozdílem mezi HDInsight 3.4 a 3.5 je, že JAVA_HOME
teď odkazuje na Javu 8. Následující kód ukazuje, jak určit, jestli skript běží na Ubuntu 14 nebo 16:
OS_VERSION=$(lsb_release -sr)
if [[ $OS_VERSION == 14* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-14-04."
HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-16-04."
HUE_TARFILE=hue-binaries-16-04.tgz
fi
...
if [[ $OS_VERSION == 16* ]]; then
echo "Using systemd configuration"
systemctl daemon-reload
systemctl stop webwasb.service
systemctl start webwasb.service
else
echo "Using upstart configuration"
initctl reload-configuration
stop webwasb
start webwasb
fi
...
if [[ $OS_VERSION == 14* ]]; then
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
elif [[ $OS_VERSION == 16* ]]; then
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
fi
Úplný skript, který obsahuje tyto fragmenty kódu, najdete na adrese https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh.
Informace o verzi Ubuntu, kterou používá HDInsight, najdete v dokumentu verze komponenty HDInsight.
Informace o rozdílech mezi Systemd
uživateli upstart a upstart najdete v tématu Systemd
o upstartu.
Poskytnutí stabilních odkazů na prostředky skriptu
Skript a přidružené prostředky musí zůstat dostupné po celou dobu životnosti clusteru. Tyto prostředky se vyžadují, pokud se do clusteru při operacích škálování přidají nové uzly.
Osvědčeným postupem je stáhnout a archivovat všechno v účtu Azure Storage ve vašem předplatném.
Důležité
Použitý účet úložiště musí být výchozím účtem úložiště pro cluster nebo veřejný kontejner jen pro čtení v jakémkoli jiném účtu úložiště.
Ukázky poskytované Microsoftem jsou například uložené v https://hdiconfigactions.blob.core.windows.net/
účtu úložiště. Toto umístění je veřejný kontejner jen pro čtení, který udržuje tým HDInsight.
Použití předem zkompilovaných prostředků
Abyste zkrátili dobu potřebnou ke spuštění skriptu, vyhněte se operacím, které kompilují prostředky ze zdrojového kódu. Například předkompilujte prostředky a uložte je do objektu blob účtu služby Azure Storage ve stejném datovém centru jako HDInsight.
Ujistěte se, že je skript pro přizpůsobení clusteru idempotentní.
Skripty musí být idempotentní. Pokud se skript spustí několikrát, měl by cluster pokaždé vrátit do stejného stavu.
Pokud se skript spustí několikrát, neměl by skript, který upravuje konfigurační soubory, přidávat duplicitní položky.
Zajištění vysoké dostupnosti architektury clusteru
Clustery HDInsight založené na Linuxu poskytují dva hlavní uzly, které jsou v clusteru aktivní, a akce skriptů se spouštějí na obou uzlech. Pokud součásti, které instalujete, očekávají pouze jeden hlavní uzel, nenainstalujte komponenty na oba hlavní uzly.
Důležité
Služby poskytované jako součást služby HDInsight jsou navržené tak, aby podle potřeby převzaly služby při selhání mezi dvěma hlavními uzly. Tato funkce není rozšířena na vlastní komponenty nainstalované prostřednictvím akcí skriptů. Pokud potřebujete vysokou dostupnost pro vlastní komponenty, musíte implementovat vlastní mechanismus převzetí služeb při selhání.
Konfigurace vlastních komponent pro použití služby Azure Blob Storage
Komponenty, které nainstalujete do clusteru, můžou mít výchozí konfiguraci, která používá úložiště Systému souborů HDFS (Apache Hadoop Distributed File System). HDInsight jako výchozí úložiště používá Azure Storage nebo Data Lake Storage. Oba poskytují systém souborů kompatibilní s HDFS, který zachovává data i v případě odstranění clusteru. Možná budete muset nakonfigurovat komponenty, které instalujete, aby místo HDFS používaly WASB nebo ADL.
U většiny operací nemusíte zadávat systém souborů. Například následující kopie souboru hadoop-common.jar z místního systému souborů do úložiště clusteru:
hdfs dfs -put /usr/hdp/current/hadoop-client/hadoop-common.jar /example/jars/
V tomto příkladu hdfs
příkaz transparentně používá výchozí úložiště clusteru. U některých operací možná budete muset zadat identifikátor URI. Například adl:///example/jars
pro Azure Data Lake Storage Gen1, abfs:///example/jars
Data Lake Storage Gen2 nebo wasb:///example/jars
Azure Storage.
Zápis informací do STDOUT a STDERR
HDInsight protokoluje výstup skriptu, který je zapsán do STDOUT a STDERR. Tyto informace můžete zobrazit pomocí webového uživatelského rozhraní Ambari.
Poznámka:
Apache Ambari je k dispozici pouze v případě, že se cluster úspěšně vytvořil. Pokud při vytváření clusteru použijete akci skriptu a vytvoření se nezdaří, přečtěte si téma Řešení potíží s akcemi skriptu pro další způsoby přístupu k protokolovaným informacím.
Většina nástrojů a instalačních balíčků už zapisuje informace do STDOUT a STDERR, ale možná budete chtít přidat další protokolování. Chcete-li odeslat text do stDOUT, použijte echo
. Příklad:
echo "Getting ready to install Foo"
Ve výchozím nastavení echo
odešle řetězec do stDOUT. Chcete-li jej směrovat na STDERR, přidejte >&2
před echo
. Příklad:
>&2 echo "An error occurred installing Foo"
Tím se místo toho přesměrují informace napsané do STDOUT na STDERR (2). Další informace o přesměrování vstupně-výstupních operací najdete v tématu https://www.tldp.org/LDP/abs/html/io-redirection.html.
Další informace o zobrazení informací protokolovaných akcemi skriptu naleznete v tématu Řešení potíží s akcemi skriptu.
Uložení souborů jako ASCII s koncovkami řádků LF
Skripty Bash by měly být uložené ve formátu ASCII s řádky ukončenými LF. Soubory uložené jako UTF-8 nebo použití CRLF jako konec řádku můžou selhat s následující chybou:
$'\r': command not found
line 1: #!/usr/bin/env: No such file or directory
Použití logiky opakování k zotavení z přechodných chyb
Při stahování souborů může instalace balíčků pomocí apt-get nebo jiných akcí, které přenášejí data přes internet, selhat kvůli přechodným síťovým chybám. Vzdálený prostředek, se kterým komunikujete, může být například v procesu převzetí služeb při selhání do záložního uzlu.
Pokud chcete, aby byl skript odolný vůči přechodným chybám, můžete implementovat logiku opakování. Následující funkce ukazuje, jak implementovat logiku opakování. Opakuje operaci třikrát předtím, než selže.
#retry
MAXATTEMPTS=3
retry() {
local -r CMD="$@"
local -i ATTMEPTNUM=1
local -i RETRYINTERVAL=2
until $CMD
do
if (( ATTMEPTNUM == MAXATTEMPTS ))
then
echo "Attempt $ATTMEPTNUM failed. no more attempts left."
return 1
else
echo "Attempt $ATTMEPTNUM failed! Retrying in $RETRYINTERVAL seconds..."
sleep $(( RETRYINTERVAL ))
ATTMEPTNUM=$ATTMEPTNUM+1
fi
done
}
Následující příklady ukazují, jak tuto funkci používat.
retry ls -ltr foo
retry wget -O ./tmpfile.sh https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh
Pomocné metody pro vlastní skripty
Pomocné metody akcí skriptu jsou nástroje, které můžete použít při psaní vlastních skriptů. Tyto metody jsou obsaženy https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh ve skriptu. Pomocí následujícího příkazu si je můžete stáhnout a použít jako součást skriptu:
# Import the helper method module.
wget -O /tmp/HDInsightUtilities-v01.sh -q https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh && source /tmp/HDInsightUtilities-v01.sh && rm -f /tmp/HDInsightUtilities-v01.sh
Následující pomocné rutiny, které můžete použít ve skriptu:
Použití pomocné rutiny | Popis |
---|---|
download_file SOURCEURL DESTFILEPATH [OVERWRITE] |
Stáhne soubor ze zdrojového identifikátoru URI do zadané cesty k souboru. Ve výchozím nastavení nepřepíše existující soubor. |
untar_file TARFILE DESTDIR |
Extrahuje soubor tar (pomocí -xf ) do cílového adresáře. |
test_is_headnode |
Pokud skript běžel na hlavním uzlu clusteru, vraťte hodnotu 1; jinak, 0. |
test_is_datanode |
Pokud je aktuálním uzlem datový uzel (pracovní) uzel, vraťte hodnotu 1; jinak, 0. |
test_is_first_datanode |
Pokud je aktuálním uzlem první datový uzel (pracovní uzel) (s názvem workernode0), vrátí hodnotu 1; jinak, 0. |
get_headnodes |
Vrátí plně kvalifikovaný název domény hlavních uzlů v clusteru. Názvy jsou oddělené čárkami. Při chybě se vrátí prázdný řetězec. |
get_primary_headnode |
Získá plně kvalifikovaný název domény primárního hlavního uzlu. Při chybě se vrátí prázdný řetězec. |
get_secondary_headnode |
Získá plně kvalifikovaný název domény sekundárního hlavního uzlu. Při chybě se vrátí prázdný řetězec. |
get_primary_headnode_number |
Získá číselnou příponu primárního hlavního uzlu. Při chybě se vrátí prázdný řetězec. |
get_secondary_headnode_number |
Získá číselnou příponu sekundárního hlavního uzlu. Při chybě se vrátí prázdný řetězec. |
Běžné vzory použití
Tato část obsahuje pokyny k implementaci některých běžných vzorů použití, na které můžete narazit při psaní vlastního skriptu.
Předání parametrů skriptu
V některých případech může skript vyžadovat parametry. Při použití rozhraní Ambari REST API můžete například potřebovat heslo správce clusteru.
Parametry předané skriptu se označují jako poziční parametry a jsou přiřazeny $1
prvnímu parametru, $2
druhému a tak dále. $0
obsahuje název samotného skriptu.
Hodnoty předané skriptu jako parametry by měly být uzavřeny jednoduchými uvozovkami ('). Tím zajistíte, že se předaná hodnota považuje za literál.
Nastavení proměnných prostředí
Nastavení proměnné prostředí se provádí pomocí následujícího příkazu:
VARIABLENAME=value
V předchozím příkladu VARIABLENAME
je název proměnné. Pro přístup k proměnné použijte $VARIABLENAME
. Pokud například chcete přiřadit hodnotu poskytovanou pozičním parametrem jako proměnnou prostředí s názvem PASSWORD, použijte následující příkaz:
PASSWORD=$1
Následný přístup k informacím by pak mohl použít $PASSWORD
.
Proměnné prostředí nastavené v rámci skriptu existují pouze v rozsahu skriptu. V některých případech možná budete muset přidat proměnné prostředí pro celý systém, které se zachovají po dokončení skriptu. Chcete-li přidat proměnné prostředí pro celý systém, přidejte proměnnou do /etc/environment
souboru . Například následující příkaz přidá HADOOP_CONF_DIR
:
echo "HADOOP_CONF_DIR=/etc/hadoop/conf" | sudo tee -a /etc/environment
Přístup k umístěním, kde jsou uložené vlastní skripty
Skripty používané k přizpůsobení clusteru musí být uložené v jednom z následujících umístění:
Účet Azure Storage přidružený ke clusteru.
Další účet úložiště přidružený ke clusteru
Veřejně čitelný identifikátor URI. Například adresa URL pro data uložená na OneDrivu, Dropboxu nebo jiné hostitelské službě souborů.
Účet Azure Data Lake Storage, který je přidružený ke clusteru HDInsight. Další informace o používání služby Azure Data Lake Storage se službou HDInsight najdete v tématu Rychlý start: Nastavení clusterů v HDInsight.
Poznámka:
Instanční objekt HDInsight používá pro přístup ke službě Data Lake Storage přístup pro čtení ke skriptu.
Prostředky používané skriptem musí být také veřejně dostupné.
Ukládání souborů v účtu Azure Storage nebo Azure Data Lake Storage poskytuje rychlý přístup, jak v rámci sítě Azure.
Poznámka:
Formát identifikátoru URI použitý k odkazování na skript se liší v závislosti na používané službě. Pro účty úložiště přidružené ke clusteru HDInsight použijte wasb://
nebo wasbs://
. Pro veřejně čitelné identifikátory URI použijte http://
nebo https://
. Pro Data Lake Storage použijte adl://
.
Kontrolní seznam pro nasazení akce skriptu
Tady jsou kroky při přípravě na nasazení skriptu:
- Umístěte soubory, které obsahují vlastní skripty, na místo, které jsou přístupné uzly clusteru během nasazování. Například výchozí úložiště pro cluster. Soubory lze také ukládat ve veřejně čitelných hostitelských službách.
- Ověřte, že skript je idempotentní. Tím umožníte, aby se skript spustil vícekrát na stejném uzlu.
- Pomocí dočasného adresáře souborů /tmp uchovávejte stažené soubory používané skripty a po spuštění skriptů je vyčistíte.
- Pokud se změní nastavení na úrovni operačního systému nebo konfigurační soubory služby Hadoop, možná budete chtít restartovat služby HDInsight.
Spuštění akce skriptu
Akce skriptu můžete použít k přizpůsobení clusterů HDInsight pomocí následujících metod:
- portál Azure
- Azure PowerShell
- Šablony Azure Resource Manageru
- Sada HDInsight .NET SDK.
Další informace o použití jednotlivých metod naleznete v tématu Použití akce skriptu.
Ukázky vlastních skriptů
Microsoft poskytuje ukázkové skripty pro instalaci komponent do clusteru HDInsight. Viz Instalace a použití Hue v clusterech HDInsight jako ukázková akce skriptu.
Řešení problému
Při použití skriptů, které jste vyvinuli, se můžou vyskytnout následující chyby:
Chyba: $'\r': command not found
. Někdy následuje syntax error: unexpected end of file
.
Příčina: Tato chyba je způsobena, když řádky ve skriptu končí crLF. Systémy Unix očekávají jako konec čáry pouze LF.
K tomuto problému nejčastěji dochází, když je skript vytvořený v prostředí Windows, protože CRLF je běžný řádek končící mnoha textovými editory ve Windows.
Řešení: Pokud se jedná o možnost v textovém editoru, vyberte pro konec řádku formát unixu nebo LF. Můžete také použít následující příkazy v systému Unix ke změně CRLF na LF:
Poznámka:
Následující příkazy jsou přibližně ekvivalentní v tom, že by měly změnit konce řádků CRLF na LF. Vyberte jeden z nástrojů dostupných ve vašem systému.
Příkaz | Notes |
---|---|
unix2dos -b INFILE |
Původní soubor se zálohuje pomocí souboru . Rozšíření BAK |
tr -d '\r' < INFILE > OUTFILE |
OUTFILE obsahuje verzi pouze s koncovkami LF. |
perl -pi -e 's/\r\n/\n/g' INFILE |
Upraví soubor přímo. |
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE |
OUTFILE obsahuje verzi pouze s koncovkami LF. |
Chyba: line 1: #!/usr/bin/env: No such file or directory
.
Příčina: K této chybě dochází, když byl skript uložen jako UTF-8 se značkou pořadí bajtů (BOM).
Řešení: Uložte soubor buď jako ASCII, nebo jako UTF-8 bez kusovníku. K vytvoření souboru bez kusovníku můžete použít také následující příkaz v systému Linux nebo Unix:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Nahraďte INFILE
souborem obsahujícím kusovník. OUTFILE
by měl být nový název souboru, který obsahuje skript bez kusovníku.
Další kroky
- Zjistěte, jak přizpůsobit clustery HDInsight pomocí akce skriptu.
- Další informace o vytváření aplikací .NET, které spravují HDInsight, najdete v referenčních informacích k sadě HDInsight SDK.
- Pomocí rozhraní REST API služby HDInsight se dozvíte, jak pomocí REST provádět akce správy v clusterech HDInsight.