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:
- Az Apache Hadoop-verzió megcélzása
- Az operációs rendszer verziójának megcélzása
- Stabil hivatkozások biztosítása szkripterőforrásokhoz
- Előre lefordított erőforrások használata
- Győződjön meg arról, hogy a fürt testreszabási szkriptje idempotens
- A fürtarchitektúra magas rendelkezésre állásának biztosítása
- Az egyéni összetevők konfigurálása az Azure Blob Storage használatára
- Adatok írása az STDOUT-ba és az STDERR-be
- Fájlok mentése ASCII-ként LF-sorvégződésekkel
- Újrapróbálkozási logika használata átmeneti hibák utáni helyreállításhoz
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 $VARIABLENAME
a 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
- Megtudhatja, hogyan szabhatja testre a HDInsight-fürtöket szkriptműveletekkel
- A HDInsight .NET SDK-hivatkozással további információt kaphat a HDInsightot kezelő .NET-alkalmazások létrehozásáról
- A HDInsight REST API használatával megtudhatja, hogyan végezhet felügyeleti műveleteket a HDInsight-fürtökön a REST használatával.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: