Share via


Szkriptművelet-fejlesztés a HDInsighttal

Megtudhatja, hogyan szabhatja testre a HDInsight-fürtöt Bash-szkriptekkel. A szkriptműveletek segítségével testre szabhatja a HDInsightot a fürt létrehozása során vagy után.

Mik azok a szkriptműveletek?

A szkriptműveletek olyan Bash-szkriptek, amelyeket az Azure a fürtcsomópontokon futtat a konfiguráció módosításához vagy a szoftverek telepítéséhez. A szkriptműveletek gyökérként lesznek végrehajtva, és teljes hozzáférési jogosultságokat biztosítanak a fürtcsomópontokhoz.

A szkriptműveletek a következő módszerekkel alkalmazhatók:

Ezzel a módszerrel alkalmazhat szkriptet... Fürt létrehozása során... Futó fürtön...
Azure Portal
Azure PowerShell
Azure klasszikus parancssori felület  
HDInsight .NET SDK
Azure Resource Manager-sablon  

A szkriptműveletek alkalmazásával kapcsolatos további információkért lásd : HDInsight-fürtök testreszabása szkriptműveletekkel.

Ajánlott eljárások szkriptek fejlesztéséhez

Ha egyéni szkriptet fejleszt egy HDInsight-fürthöz, számos ajánlott eljárást érdemes szem előtt tartani:

Fontos

A szkriptműveletek 60 percen belül befejeződnek, vagy a folyamat meghiúsul. A csomópontok kiépítése során a szkript párhuzamosan fut más beállítási és konfigurációs folyamatokkal. Az erőforrások, például a processzoridő vagy a hálózati sávszélesség versenye miatt a szkript végrehajtása hosszabb időt vehet igénybe, mint a fejlesztési környezetben.

Az Apache Hadoop-verzió megcélzása

A HDInsight különböző verziói a Hadoop-szolgáltatások és -összetevők különböző verzióival rendelkeznek. Ha a szkript egy szolgáltatás vagy összetevő egy adott verzióját várja, akkor csak a HDInsight azon verziójával használja a szkriptet, amely tartalmazza a szükséges összetevőket. A HDInsight összetevőverzióiról a HDInsight-összetevő verziószámozási dokumentumával tájékozódhat.

Az operációs rendszer verziójának ellenőrzése

A HDInsight különböző verziói az Ubuntu adott verzióira támaszkodnak. Előfordulhat, hogy a szkriptben ellenőriznie kell az operációsrendszer-verziók közötti különbségeket. Előfordulhat például, hogy telepítenie kell egy olyan bináris fájlt, amely az Ubuntu verziójához van kötve.

Az operációs rendszer verziójának ellenőrzéséhez használja a következőt lsb_release: . A következő szkript például bemutatja, hogyan hivatkozhat egy adott tar-fájlra az operációs rendszer verziójától függően:

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

Az operációs rendszer verziójának megcélzása

A HDInsight az Ubuntu Linux-disztribúción alapul. A HDInsight különböző verziói az Ubuntu különböző verzióira támaszkodnak, ami megváltoztathatja a szkript viselkedését. A HDInsight 3.4 és korábbi verziói például az Upstartot használó Ubuntu-verziókon alapulnak. A 3.5-ös és újabb verziók az Ubuntu 16.04-en alapulnak, amely a Systemd. Systemd és az Upstart különböző parancsokra támaszkodik, ezért a szkriptet mindkét parancshoz meg kell írni.

Egy másik fontos különbség a HDInsight 3.4 és 3.5 között, hogy JAVA_HOME most a Java 8-ra mutat. Az alábbi kód bemutatja, hogyan állapítható meg, hogy a szkript az Ubuntu 14-en vagy 16-on fut-e:

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

A kódrészleteket tartalmazó teljes szkript a következő helyen https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.shtalálható: .

A HDInsight által használt Ubuntu verziót a HDInsight összetevő verziódokumentumában tekintheti meg.

A upstart és a upstart közötti Systemd különbségek megértéséhez tekintse meg Systemd a Upstart-felhasználókat.

Stabil hivatkozások biztosítása szkripterőforrásokhoz

A szkriptnek és a társított erőforrásoknak a fürt teljes élettartama alatt rendelkezésre kell állniuk. Ezekre az erőforrásokra akkor van szükség, ha a skálázási műveletek során új csomópontokat adnak hozzá a fürthöz.

Az ajánlott eljárás az, ha mindent letölt és archivál egy Azure Storage-fiókban az előfizetésében.

Fontos

A használt tárfióknak kell lennie a fürt alapértelmezett tárfiókjának vagy bármely más tárfiók nyilvános, írásvédett tárolójának.

A Microsoft által biztosított minták például a https://hdiconfigactions.blob.core.windows.net/ tárfiókban vannak tárolva. Ez a hely egy nyilvános, írásvédett tároló, amelyet a HDInsight csapata tart fenn.

Előre lefordított erőforrások használata

A szkript futtatásához szükséges idő csökkentése érdekében kerülje a forráskódból erőforrásokat fordító műveleteket. Például előre lefordíthatja az erőforrásokat, és egy Azure Storage-fiókblobban tárolhatja őket ugyanabban az adatközpontban, mint a HDInsight.

Győződjön meg arról, hogy a fürt testreszabási szkriptje idempotens

A szkripteknek idempotensnek kell lenniük. Ha a szkript többször is fut, a fürtnek minden alkalommal ugyanarra az állapotra kell visszaállnia.

Ha a szkript többször fut, a konfigurációs fájlokat módosító szkriptnek nem szabad ismétlődő bejegyzéseket hozzáadnia.

A fürtarchitektúra magas rendelkezésre állásának biztosítása

A Linux-alapú HDInsight-fürtök két, a fürtben aktív fő csomópontot biztosítanak, és a szkriptműveletek mindkét csomóponton futnak. Ha a telepített összetevők csak egy fejcsomópontot várnak, ne telepítse az összetevőket mindkét fejcsomópontra.

Fontos

A HDInsight részeként nyújtott szolgáltatások úgy vannak kialakítva, hogy szükség szerint feladatátvételt vezessenek be a két fő csomópont között. Ez a funkció nem terjed ki a szkriptműveletekkel telepített egyéni összetevőkre. Ha magas rendelkezésre állásra van szüksége az egyéni összetevőkhöz, saját feladatátvételi mechanizmust kell implementálnia.

Az egyéni összetevők konfigurálása az Azure Blob Storage használatára

Előfordulhat, hogy a fürtre telepített összetevők alapértelmezett konfigurációja Apache Hadoop Distributed File System (HDFS) tárolót használ. A HDInsight alapértelmezett tárolóként az Azure Storage-t vagy a Data Lake Storage-t használja. Mindkettő HDFS-kompatibilis fájlrendszert biztosít, amely akkor is megőrzi az adatokat, ha a fürt törölve van. Előfordulhat, hogy konfigurálnia kell a telepített összetevőket, hogy a HDFS helyett WASB-t vagy ADL-t használjon.

A legtöbb művelethez nem kell megadnia a fájlrendszert. A következő például átmásolja a hadoop-common.jar fájlt a helyi fájlrendszerből a fürttárolóba:

hdfs dfs -put /usr/hdp/current/hadoop-client/hadoop-common.jar /example/jars/

Ebben a példában a hdfs parancs transzparens módon használja az alapértelmezett fürttárolót. Egyes műveleteknél előfordulhat, hogy meg kell adnia az URI-t. Például adl:///example/jars az Azure Data Lake Storage Gen1, abfs:///example/jars a Data Lake Storage Gen2 vagy wasb:///example/jars az Azure Storage esetében.

Adatok írása az STDOUT-ba és az STDERR-be

A HDInsight naplózza az STDOUT-ba és az STDERR-be írt szkriptkimenetet. Ezeket az információkat az Ambari webes felhasználói felületén tekintheti meg.

Feljegyzés

Az Apache Ambari csak akkor érhető el, ha a fürt sikeresen létrejött. Ha szkriptműveletet használ a fürt létrehozásakor, és a létrehozás sikertelen, olvassa el a naplózott adatok elérésének egyéb módjaihoz kapcsolódó szkriptműveletek hibaelhárítását ismertető szakaszt.

A legtöbb segédprogram és telepítési csomag már ír adatokat az STDOUT-ba és az STDERR-be, de érdemes lehet további naplózást hozzáadnia. Ha szöveget szeretne küldeni az STDOUT-nak, használja a következőt echo: . Példa:

echo "Getting ready to install Foo"

Alapértelmezés szerint echo elküldi a sztringet az STDOUT-nak. Ha az STDERR-hez szeretné irányítani, adja hozzá >&2 korábban echo. Példa:

>&2 echo "An error occurred installing Foo"

Ez átirányítja az STDOUT-ba írt információkat az STDERR -be (2). Az IO-átirányítással kapcsolatos további információkért lásd: https://www.tldp.org/LDP/abs/html/io-redirection.html.

A szkriptműveletek által naplózott információk megtekintéséről további információt a szkriptműveletek hibaelhárítása című témakörben talál.

Fájlok mentése ASCII-ként LF-sorvégződésekkel

A Bash-szkripteket ASCII formátumban kell tárolni, a sorokat az LF leállítja. Az UTF-8-ként tárolt vagy a sorvégződésként használt CRLF-fájlokat a következő hibával hiúsíthatja meg:

$'\r': command not found
line 1: #!/usr/bin/env: No such file or directory

Újrapróbálkozási logika használata átmeneti hibák utáni helyreállításhoz

Ha fájlokat tölt le, csomagokat telepít apt-get vagy más, az interneten keresztül továbbítja az adatokat, a művelet átmeneti hálózati hibák miatt meghiúsulhat. Előfordulhat például, hogy a távoli erőforrás, amellyel kommunikál, egy biztonsági mentési csomópontra való feladatátvétel folyamatban lehet.

Ha rugalmassá szeretné tenni a szkriptet az átmeneti hibákra, újrapróbálkozási logikát alkalmazhat. Az alábbi függvény bemutatja az újrapróbálkozások logikájának implementálását. A sikertelenség előtt háromszor újrapróbálkozza a műveletet.

#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
}

Az alábbi példák bemutatják a függvény használatát.

retry ls -ltr foo

retry wget -O ./tmpfile.sh https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh

Segédmetenek egyéni szkriptekhez

A szkriptművelet-segítő metódusok olyan segédprogramok, amelyeket egyéni szkriptek írása során használhat. Ezek a metódusok a https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh szkriptben találhatók. Töltse le és használja azokat a szkript részeként az alábbi módon:

# 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

A szkriptben a következő segítők használhatók:

Segédek használata Leírás
download_file SOURCEURL DESTFILEPATH [OVERWRITE] Letölt egy fájlt a forrás URI-ból a megadott elérési útra. Alapértelmezés szerint nem írja felül a meglévő fájlokat.
untar_file TARFILE DESTDIR Kinyer egy kátrányfájlt (a használatával -xf) a célkönyvtárba.
test_is_headnode Ha a szkript egy fürtfőcsomóponton futott, adja vissza az 1 értéket; ellenkező esetben 0.
test_is_datanode Ha az aktuális csomópont adatcsomópont (feldolgozó) csomópont, egy 1 értéket ad vissza; ellenkező esetben 0.
test_is_first_datanode Ha az aktuális csomópont az első adatcsomópont (workernode0 néven) egy 1 értéket ad vissza; ellenkező esetben 0.
get_headnodes Adja vissza a fürtben lévő átjárócsomópontok teljes tartománynevét. A nevek vesszővel tagoltak. Hiba esetén egy üres sztring jelenik meg.
get_primary_headnode Lekéri az elsődleges átjárócsomópont teljes tartománynevét. Hiba esetén egy üres sztring jelenik meg.
get_secondary_headnode Lekéri a másodlagos átjárócsomópont teljes tartománynevét. Hiba esetén egy üres sztring jelenik meg.
get_primary_headnode_number Lekéri az elsődleges fejcsomópont numerikus utótagját. Hiba esetén egy üres sztring jelenik meg.
get_secondary_headnode_number Lekéri a másodlagos fejcsomópont numerikus utótagját. Hiba esetén egy üres sztring jelenik meg.

Gyakori használati minták

Ez a szakasz útmutatást nyújt a saját egyéni szkript írása során esetleg előforduló gyakori használati minták implementálásához.

Paraméterek átadása szkriptnek

Bizonyos esetekben előfordulhat, hogy a szkript paramétereket igényel. Szükség lehet például a fürt rendszergazdai jelszavára az Ambari REST API használatakor.

A szkriptnek átadott paraméterek pozícióparaméterek, és $1 az első paraméterhez, $2 a másodikhoz és így tovább. $0 a szkript nevét tartalmazza.

A szkriptnek paraméterekként átadott értékeket egyetlen idézőjelnek (') kell csatolnia. Ezzel biztosítja, hogy az átadott érték konstansként legyen kezelve.

Környezeti változók beállítása

A környezeti változó beállítását a következő utasítás hajtja végre:

VARIABLENAME=value

Az előző példában VARIABLENAME a változó neve látható. A változó eléréséhez használja $VARIABLENAMEa következőt: . Ha például egy pozícióparaméter által megadott értéket szeretne hozzárendelni EGY JELSZÓ nevű környezeti változóhoz, a következő utasítást kell használnia:

PASSWORD=$1

Ezt követően az információkhoz való későbbi hozzáférés is használható $PASSWORD.

A szkripten belül beállított környezeti változók csak a szkript hatókörén belül léteznek. Bizonyos esetekben előfordulhat, hogy olyan rendszerszintű környezeti változókat kell hozzáadnia, amelyek a szkript befejezése után is megmaradnak. A rendszerszintű környezeti változók hozzáadásához adja hozzá a változót a következőhöz /etc/environment: . A következő utasítás például hozzáadja a következőt HADOOP_CONF_DIR:

echo "HADOOP_CONF_DIR=/etc/hadoop/conf" | sudo tee -a /etc/environment

Hozzáférés azokhoz a helyekhez, ahol az egyéni szkriptek vannak tárolva

A fürtök testreszabásához használt szkripteket az alábbi helyek egyikén kell tárolni:

  • A fürthöz társított Azure Storage-fiók .

  • A fürthöz társított további tárfiók .

  • Nyilvánosan olvasható URI. Például a OneDrive-on, a Dropboxban vagy más fájlkezelő szolgáltatásban tárolt adatok URL-címe.

  • A HDInsight-fürthöz társított Azure Data Lake Storage-fiók . További információ az Azure Data Lake Storage HDInsighttal való használatáról: Rövid útmutató: Fürtök beállítása a HDInsightban.

    Feljegyzés

    A Data Lake Storage eléréséhez használt egyszerű HDInsight szolgáltatásnak olvasási hozzáféréssel kell rendelkeznie a szkripthez.

A szkript által használt erőforrásoknak nyilvánosan is elérhetőnek kell lenniük.

A fájlok Azure Storage-fiókban vagy Azure Data Lake Storage-ban való tárolása gyors hozzáférést biztosít, mivel mindkettő az Azure-hálózaton belül található.

Feljegyzés

A szkriptre való hivatkozáshoz használt URI formátum a használt szolgáltatástól függően eltérő. A HDInsight-fürthöz társított tárfiókok esetében használja wasb:// vagy wasbs://. Nyilvánosan olvasható URI-k esetén használja http:// vagy https://. A Data Lake Storage-hoz használja a következőt adl://: .

Ellenőrzőlista szkriptművelet üzembe helyezéséhez

A szkript üzembe helyezésének előkészítése során az alábbi lépéseket kell elvégeznie:

  • Helyezze az egyéni szkripteket tartalmazó fájlokat a fürtcsomópontok által elérhető helyre az üzembe helyezés során. Például a fürt alapértelmezett tárolója. A fájlok nyilvánosan olvasható üzemeltetési szolgáltatásokban is tárolhatók.
  • Ellenőrizze, hogy a szkript idempotens-e. Ezzel lehetővé teszi a szkript többszöri végrehajtását ugyanazon a csomóponton.
  • Egy ideiglenes fájlkönyvtár /tmp használatával tartsa meg a szkriptek által használt letöltött fájlokat, majd törölje őket a szkriptek végrehajtása után.
  • Ha az operációsrendszer-szintű beállítások vagy a Hadoop-szolgáltatás konfigurációs fájljai módosulnak, érdemes lehet újraindítani a HDInsight-szolgáltatásokat.

Szkriptművelet futtatása

Szkriptműveletekkel testre szabhatja a HDInsight-fürtöket az alábbi módszerekkel:

  • Azure Portal
  • Azure PowerShell
  • Azure Resource Manager-sablonok
  • A HDInsight .NET SDK.

Az egyes metódusok használatáról további információt a szkriptműveletek használata című témakörben talál.

Egyéni szkriptminták

A Microsoft mintaszkripteket biztosít az összetevők HDInsight-fürtön való telepítéséhez. Lásd: Hue telepítése és használata HDInsight-fürtökön példaszkript-műveletként.

Hibaelhárítás

Az alábbiakban azokat a hibákat tapasztalhatja, amelyek a kifejlesztett szkriptek használatakor fordulhatnak elő:

Hiba: $'\r': command not found. Néha követik a syntax error: unexpected end of file.

Ok: Ez a hiba akkor fordul elő, ha egy szkript sorai CRLF-sel végződnek. A Unix-rendszerek csak az LF-t várják a sorvégződésként.

Ez a probléma leggyakrabban akkor fordul elő, ha a szkriptet Windows-környezetben szerkesztik, mivel a CRLF a Windows számos szövegszerkesztőjének gyakori vonalvégződése.

Megoldás: Ha ez egy lehetőség a szövegszerkesztőben, válassza a Unix formátumot vagy az LF lehetőséget a sorvégződéshez. A Következő parancsokat is használhatja Egy Unix-rendszeren a CRLF LF-re való módosításához:

Feljegyzés

Az alábbi parancsok nagyjából egyenértékűek azzal, hogy a CRLF-sorvégződéseket LF értékre kell módosítaniuk. Válasszon egyet a rendszeren elérhető segédprogramok alapján.

Parancs Jegyzetek
unix2dos -b INFILE Az eredeti fájl biztonsági mentése egy . BAK-bővítmény
tr -d '\r' < INFILE > OUTFILE Az OUTFILE csak LF végződésű verziót tartalmaz
perl -pi -e 's/\r\n/\n/g' INFILE Közvetlenül módosítja a fájlt
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE Az OUTFILE csak LF végződésű verziót tartalmaz.

Hiba: line 1: #!/usr/bin/env: No such file or directory.

Ok: Ez a hiba akkor fordul elő, ha a szkriptet UTF-8-ként mentette egy bájtrendelési jellel (BOM).

Megoldás: Mentse a fájlt ASCII-ként vagy UTF-8-ként BOM nélkül. Linux vagy Unix rendszeren a következő paranccsal is létrehozhat fájlokat a BOM nélkül:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

Cserélje le INFILE a BOM-t tartalmazó fájlra. OUTFILE egy új fájlnévnek kell lennie, amely tartalmazza a szkriptet a BOM nélkül.

Következő lépések