Sdílet prostřednictvím


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ů:

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/environmentsouboru . 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