Scriptactie ontwikkelen met HDInsight
Meer informatie over het aanpassen van uw HDInsight-cluster met behulp van Bash-scripts. Scriptacties zijn een manier om HDInsight aan te passen tijdens of na het maken van het cluster.
Wat zijn scriptacties?
Scriptacties zijn Bash-scripts die Azure uitvoert op de clusterknooppunten om configuratiewijzigingen aan te brengen of software te installeren. Een scriptactie wordt uitgevoerd als hoofdmap en biedt volledige toegangsrechten voor de clusterknooppunten.
Scriptacties kunnen worden toegepast via de volgende methoden:
Gebruik deze methode om een script toe te passen... | Tijdens het maken van het cluster... | Op een actief cluster... |
---|---|---|
Azure Portal | ✓ | ✓ |
Azure PowerShell | ✓ | ✓ |
Klassieke versie van Azure-CLI | ✓ | |
HDInsight .NET-SDK | ✓ | ✓ |
Azure Resource Manager-sjabloon | ✓ |
Zie HDInsight-clusters aanpassen met behulp van scriptacties voor meer informatie over het gebruik van deze methoden om scriptacties toe te passen.
Aanbevolen procedures voor scriptontwikkeling
Wanneer u een aangepast script voor een HDInsight-cluster ontwikkelt, zijn er verschillende aanbevolen procedures om rekening mee te houden:
- De Apache Hadoop-versie targeten
- Doel van de versie van het besturingssysteem
- Stabiele koppelingen naar scriptresources bieden
- Vooraf gecompileerde resources gebruiken
- Zorg ervoor dat het script voor clusteraanpassing idempotent is
- Hoge beschikbaarheid van de clusterarchitectuur garanderen
- De aangepaste onderdelen configureren voor het gebruik van Azure Blob Storage
- Gegevens schrijven naar STDOUT en STDERR
- Bestanden opslaan als ASCII met LF-regeleinden
- Logica voor opnieuw proberen gebruiken om te herstellen van tijdelijke fouten
Belangrijk
Scriptacties moeten binnen 60 minuten worden voltooid of het proces mislukt. Tijdens het inrichten van knooppunten wordt het script gelijktijdig uitgevoerd met andere installatie- en configuratieprocessen. Concurrentie voor resources zoals CPU-tijd of netwerkbandbreedte kan ertoe leiden dat het script langer duurt dan in uw ontwikkelomgeving.
De Apache Hadoop-versie targeten
Verschillende versies van HDInsight hebben verschillende versies van Hadoop-services en -onderdelen geïnstalleerd. Als uw script een specifieke versie van een service of onderdeel verwacht, moet u alleen het script gebruiken met de versie van HDInsight die de vereiste onderdelen bevat. U vindt informatie over onderdeelversies die zijn opgenomen in HDInsight met behulp van het versiebeheerdocument voor HDInsight-onderdelen.
De versie van het besturingssysteem controleren
Verschillende versies van HDInsight zijn afhankelijk van specifieke versies van Ubuntu. Er kunnen verschillen zijn tussen besturingssysteemversies die u moet controleren in uw script. Mogelijk moet u bijvoorbeeld een binair bestand installeren dat is gekoppeld aan de versie van Ubuntu.
Als u de versie van het besturingssysteem wilt controleren, gebruikt u lsb_release
. Het volgende script laat bijvoorbeeld zien hoe u naar een specifiek tar-bestand verwijst, afhankelijk van de versie van het besturingssysteem:
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
Doel van de versie van het besturingssysteem
HDInsight is gebaseerd op de Ubuntu Linux-distributie. Verschillende versies van HDInsight zijn afhankelijk van verschillende versies van Ubuntu, waardoor het gedrag van uw script kan veranderen. HDInsight 3.4 en eerder zijn bijvoorbeeld gebaseerd op Ubuntu-versies die gebruikmaken van Upstart. Versies 3.5 en hoger zijn gebaseerd op Ubuntu 16.04, die gebruikmaakt van Systemd
. Systemd
en Upstart zijn afhankelijk van verschillende opdrachten, dus uw script moet worden geschreven om met beide te werken.
Een ander belangrijk verschil tussen HDInsight 3.4 en 3.5 is dat JAVA_HOME
nu verwijst naar Java 8. De volgende code laat zien hoe u kunt bepalen of het script wordt uitgevoerd op Ubuntu 14 of 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
U vindt het volledige script met deze fragmenten op https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh.
Zie het hdInsight-onderdeelversiedocument voor de versie van ubuntu die wordt gebruikt door HDInsight.
Als u de verschillen tussen Systemd
en Upstart wilt begrijpen, raadpleegt Systemd
u voor Upstart-gebruikers.
Stabiele koppelingen naar scriptresources bieden
Het script en de bijbehorende resources moeten gedurende de levensduur van het cluster beschikbaar blijven. Deze resources zijn vereist als er tijdens schaalbewerkingen nieuwe knooppunten aan het cluster worden toegevoegd.
U kunt het beste alles in een Azure Storage-account in uw abonnement downloaden en archiveren.
Belangrijk
Het gebruikte opslagaccount moet het standaardopslagaccount zijn voor het cluster of een openbare, alleen-lezen container in een ander opslagaccount.
De voorbeelden van Microsoft worden bijvoorbeeld opgeslagen in het https://hdiconfigactions.blob.core.windows.net/
opslagaccount. Deze locatie is een openbare, alleen-lezen container die wordt onderhouden door het HDInsight-team.
Vooraf gecompileerde resources gebruiken
Als u de tijd wilt beperken die nodig is om het script uit te voeren, vermijdt u bewerkingen die resources compileren vanuit broncode. U kunt bijvoorbeeld vooraf resources compileren en opslaan in een Blob van een Azure Storage-account in hetzelfde datacenter als HDInsight.
Zorg ervoor dat het script voor clusteraanpassing idempotent is
Scripts moeten idempotent zijn. Als het script meerdere keren wordt uitgevoerd, moet het cluster elke keer dezelfde status hebben.
Als het script meerdere keren wordt uitgevoerd, moet het script waarmee configuratiebestanden worden gewijzigd, geen dubbele vermeldingen toevoegen.
Hoge beschikbaarheid van de clusterarchitectuur garanderen
HDInsight-clusters op basis van Linux bieden twee hoofdknooppunten die actief zijn in het cluster en scriptacties worden uitgevoerd op beide knooppunten. Als de onderdelen die u installeert slechts één hoofdknooppunt verwachten, installeert u de onderdelen niet op beide hoofdknooppunten.
Belangrijk
Services die worden geleverd als onderdeel van HDInsight, zijn zo nodig ontworpen om een failover uit te voeren tussen de twee hoofdknooppunten. Deze functionaliteit wordt niet uitgebreid naar aangepaste onderdelen die zijn geïnstalleerd via scriptacties. Als u hoge beschikbaarheid nodig hebt voor aangepaste onderdelen, moet u uw eigen failovermechanisme implementeren.
De aangepaste onderdelen configureren voor het gebruik van Azure Blob Storage
Onderdelen die u op het cluster installeert, hebben mogelijk een standaardconfiguratie die gebruikmaakt van HDFS-opslag (Apache Hadoop Distributed File System). HDInsight maakt gebruik van Azure Storage of Data Lake Storage als de standaardopslag. Beide bieden een HDFS-compatibel bestandssysteem waarmee gegevens worden bewaard, zelfs als het cluster wordt verwijderd. Mogelijk moet u onderdelen configureren die u installeert om WASB of ADL te gebruiken in plaats van HDFS.
Voor de meeste bewerkingen hoeft u het bestandssysteem niet op te geven. Met het volgende kopieert u bijvoorbeeld het hadoop-common.jar-bestand van het lokale bestandssysteem naar clusteropslag:
hdfs dfs -put /usr/hdp/current/hadoop-client/hadoop-common.jar /example/jars/
In dit voorbeeld maakt de hdfs
opdracht transparant gebruik van de standaardclusteropslag. Voor sommige bewerkingen moet u mogelijk de URI opgeven. Bijvoorbeeld adl:///example/jars
voor Azure Data Lake Storage Gen1, abfs:///example/jars
voor Data Lake Storage Gen2 of wasb:///example/jars
voor Azure Storage.
Gegevens schrijven naar STDOUT en STDERR
HDInsight registreert scriptuitvoer die is geschreven naar STDOUT en STDERR. U kunt deze informatie weergeven met behulp van de Ambari-webgebruikersinterface.
Notitie
Apache Ambari is alleen beschikbaar als het cluster is gemaakt. Als u een scriptactie gebruikt tijdens het maken van een cluster en het maken mislukt, raadpleegt u Scriptacties oplossen voor andere manieren om vastgelegde informatie te openen.
De meeste hulpprogramma's en installatiepakketten schrijven al informatie naar STDOUT en STDERR, maar mogelijk wilt u extra logboekregistratie toevoegen. Als u tekst naar STDOUT wilt verzenden, gebruikt u echo
. Voorbeeld:
echo "Getting ready to install Foo"
echo
Standaard verzendt u de tekenreeks naar STDOUT. Als u deze wilt omsturen naar STDERR, voegt u >&2
het toe vóór echo
. Voorbeeld:
>&2 echo "An error occurred installing Foo"
Hiermee wordt informatie die naar STDOUT is geschreven, omgeleid naar STDERR (2). Zie voor meer informatie over IO-omleiding https://www.tldp.org/LDP/abs/html/io-redirection.html.
Bestanden opslaan als ASCII met LF-regeleinden
Bash-scripts moeten worden opgeslagen als ASCII-indeling, waarbij regels worden beëindigd door LF. Bestanden die zijn opgeslagen als UTF-8 of CRLF gebruiken als het einde van de regel, kunnen mislukken met de volgende fout:
$'\r': command not found
line 1: #!/usr/bin/env: No such file or directory
Logica voor opnieuw proberen gebruiken om te herstellen van tijdelijke fouten
Wanneer u bestanden downloadt, pakketten installeert met apt-get of andere acties die gegevens verzenden via internet, kan de actie mislukken vanwege tijdelijke netwerkfouten. De externe resource waarmee u communiceert, kan bijvoorbeeld een failover naar een back-upknooppunt uitvoeren.
Als u uw script bestand wilt maken tegen tijdelijke fouten, kunt u logica voor opnieuw proberen implementeren. De volgende functie laat zien hoe u logica voor opnieuw proberen implementeert. De bewerking wordt drie keer opnieuw uitgevoerd voordat de bewerking mislukt.
#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
}
In de volgende voorbeelden ziet u hoe u deze functie gebruikt.
retry ls -ltr foo
retry wget -O ./tmpfile.sh https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh
Helpermethoden voor aangepaste scripts
Helpermethoden voor scriptacties zijn hulpprogramma's die u kunt gebruiken tijdens het schrijven van aangepaste scripts. Deze methoden zijn opgenomen in het https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh script. Gebruik het volgende om ze te downloaden en te gebruiken als onderdeel van uw script:
# 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
De volgende helpers die beschikbaar zijn voor gebruik in uw script:
Helpergebruik | Beschrijving |
---|---|
download_file SOURCEURL DESTFILEPATH [OVERWRITE] |
Hiermee downloadt u een bestand van de bron-URI naar het opgegeven bestandspad. Standaard wordt een bestaand bestand niet overschreven. |
untar_file TARFILE DESTDIR |
Extraheert een tar-bestand (met behulp van -xf ) naar de doelmap. |
test_is_headnode |
Als het script is uitgevoerd op een clusterhoofdknooppunt, retourneer dan 1; anders, 0. |
test_is_datanode |
Als het huidige knooppunt een gegevensknooppunt (werkrol) is, retourneer dan een 1; anders, 0. |
test_is_first_datanode |
Als het huidige knooppunt het eerste gegevensknooppunt (worker) (workernode0) is, retourneert u een 1; anders, 0. |
get_headnodes |
Retourneert de volledig gekwalificeerde domeinnaam van de hoofdknooppunten in het cluster. Namen zijn door komma's gescheiden. Er wordt een lege tekenreeks geretourneerd bij een fout. |
get_primary_headnode |
Hiermee haalt u de volledig gekwalificeerde domeinnaam van het primaire hoofdknooppunt op. Er wordt een lege tekenreeks geretourneerd bij een fout. |
get_secondary_headnode |
Hiermee haalt u de volledig gekwalificeerde domeinnaam van het secundaire hoofdknooppunt op. Er wordt een lege tekenreeks geretourneerd bij een fout. |
get_primary_headnode_number |
Hiermee haalt u het numerieke achtervoegsel van het primaire hoofdknooppunt op. Er wordt een lege tekenreeks geretourneerd bij een fout. |
get_secondary_headnode_number |
Hiermee haalt u het numerieke achtervoegsel van het secundaire hoofdknooppunt op. Er wordt een lege tekenreeks geretourneerd bij een fout. |
Algemene gebruikspatronen
Deze sectie bevat richtlijnen voor het implementeren van enkele algemene gebruikspatronen die u kunt tegenkomen tijdens het schrijven van uw eigen aangepaste script.
Parameters doorgeven aan een script
In sommige gevallen zijn voor uw script mogelijk parameters vereist. U hebt bijvoorbeeld het beheerderswachtwoord voor het cluster nodig wanneer u de Ambari REST API gebruikt.
Parameters die aan het script worden doorgegeven, worden positionele parameters genoemd en worden toegewezen aan $1
de eerste parameter, $2
voor de tweede, enzovoort. $0
bevat de naam van het script zelf.
Waarden die als parameters worden doorgegeven aan het script, moeten tussen enkele aanhalingstekens (')worden geplaatst. Dit zorgt ervoor dat de doorgegeven waarde wordt behandeld als een letterlijke waarde.
Omgevingsvariabelen instellen
Het instellen van een omgevingsvariabele wordt uitgevoerd met de volgende instructie:
VARIABLENAME=value
In het voorgaande voorbeeld VARIABLENAME
is dit de naam van de variabele. Als u toegang wilt krijgen tot de variabele, gebruikt u $VARIABLENAME
. Als u bijvoorbeeld een waarde wilt toewijzen die wordt geleverd door een positionele parameter als een omgevingsvariabele met de naam PASSWORD, gebruikt u de volgende instructie:
PASSWORD=$1
Volgende toegang tot de informatie kan vervolgens worden gebruikt $PASSWORD
.
Omgevingsvariabelen die zijn ingesteld binnen het script, bestaan alleen binnen het bereik van het script. In sommige gevallen moet u mogelijk omgevingsvariabelen voor het hele systeem toevoegen die behouden blijven nadat het script is voltooid. Als u omgevingsvariabelen voor het hele systeem wilt toevoegen, voegt u de variabele toe aan /etc/environment
. Met de volgende instructie wordt bijvoorbeeld het volgende toegevoegd HADOOP_CONF_DIR
:
echo "HADOOP_CONF_DIR=/etc/hadoop/conf" | sudo tee -a /etc/environment
Toegang tot locaties waar de aangepaste scripts worden opgeslagen
Scripts die worden gebruikt om een cluster aan te passen, moeten worden opgeslagen op een van de volgende locaties:
Een Azure Storage-account dat is gekoppeld aan het cluster.
Een extra opslagaccount dat is gekoppeld aan het cluster.
Een openbaar leesbare URI. Bijvoorbeeld een URL naar gegevens die zijn opgeslagen in OneDrive, Dropbox of een andere service voor het hosten van bestanden.
Een Azure Data Lake Storage-account dat is gekoppeld aan het HDInsight-cluster. Zie de quickstart: Clusters instellen in HDInsight voor meer informatie over het gebruik van Azure Data Lake Storage met HDInsight.
Notitie
De service-principal die HDInsight gebruikt voor toegang tot Data Lake Storage, moet leestoegang hebben tot het script.
Resources die door het script worden gebruikt, moeten ook openbaar beschikbaar zijn.
Het opslaan van de bestanden in een Azure Storage-account of Azure Data Lake Storage biedt snelle toegang, zowel binnen het Azure-netwerk.
Notitie
De URI-indeling die wordt gebruikt om naar het script te verwijzen, verschilt afhankelijk van de service die wordt gebruikt. Gebruik of voor opslagaccounts die zijn gekoppeld aan het HDInsight-clusterwasb://
.wasbs://
Voor openbaar leesbare URI's gebruikt http://
of https://
. Voor Data Lake Storage gebruikt u adl://
.
Controlelijst voor het implementeren van een scriptactie
Dit zijn de stappen die worden uitgevoerd bij het voorbereiden van het implementeren van een script:
- Plaats de bestanden die de aangepaste scripts bevatten op een plaats die tijdens de implementatie toegankelijk is voor de clusterknooppunten. Bijvoorbeeld de standaardopslag voor het cluster. Bestanden kunnen ook worden opgeslagen in openbaar leesbare hostingservices.
- Controleer of het script idempotent is. Hierdoor kan het script meerdere keren op hetzelfde knooppunt worden uitgevoerd.
- Gebruik een tijdelijke bestandsmap /tmp om de gedownloade bestanden die door de scripts worden gebruikt te bewaren en deze vervolgens op te schonen nadat scripts zijn uitgevoerd.
- Als instellingen op besturingssysteemniveau of hadoop-serviceconfiguratiebestanden worden gewijzigd, kunt u HDInsight-services opnieuw starten.
Een scriptactie uitvoeren
U kunt scriptacties gebruiken om HDInsight-clusters aan te passen met behulp van de volgende methoden:
- Azure Portal
- Azure PowerShell
- Azure Resource Manager-sjablonen
- De HDInsight .NET SDK.
Zie Scriptactie gebruiken voor meer informatie over het gebruik van elke methode.
Voorbeelden van aangepaste scripts
Microsoft biedt voorbeeldscripts voor het installeren van onderdelen in een HDInsight-cluster. Zie Hue installeren en gebruiken in HDInsight-clusters als voorbeeldscriptactie.
Probleemoplossing
Hieronder vindt u fouten die u kunt tegenkomen bij het gebruik van scripts die u hebt ontwikkeld:
Fout: $'\r': command not found
. Soms gevolgd door syntax error: unexpected end of file
.
Oorzaak: Deze fout wordt veroorzaakt wanneer de regels in een script eindigen met CRLF. Unix-systemen verwachten alleen LF als het einde van de lijn.
Dit probleem treedt meestal op wanneer het script is geschreven in een Windows-omgeving, omdat CRLF een veelvoorkomende regel is die eindigt voor veel teksteditors in Windows.
Oplossing: Als het een optie is in de teksteditor, selecteert u Unix-indeling of LF voor het einde van de regel. U kunt ook de volgende opdrachten op een Unix-systeem gebruiken om de CRLF te wijzigen in een LF:
Notitie
De volgende opdrachten zijn ongeveer gelijkwaardig omdat ze de CRLF-regeleinden moeten wijzigen in LF. Selecteer een hulpprogramma op basis van de hulpprogramma's die beschikbaar zijn op uw systeem.
Opdracht | Opmerkingen |
---|---|
unix2dos -b INFILE |
Er wordt een back-up gemaakt van het oorspronkelijke bestand met een . BAK-extensie |
tr -d '\r' < INFILE > OUTFILE |
OUTFILE bevat een versie met alleen LF-einden |
perl -pi -e 's/\r\n/\n/g' INFILE |
Het bestand rechtstreeks wijzigen |
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE |
OUTFILE bevat een versie met alleen LF-einden. |
Fout: line 1: #!/usr/bin/env: No such file or directory
.
Oorzaak: Deze fout treedt op wanneer het script is opgeslagen als UTF-8 met een Byte Order Mark (BOM).
Oplossing: Sla het bestand op als ASCII of als UTF-8 zonder bom. U kunt ook de volgende opdracht op een Linux- of Unix-systeem gebruiken om een bestand te maken zonder de bom:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Vervang INFILE
door het bestand met de BOM. OUTFILE
moet een nieuwe bestandsnaam zijn, die het script zonder bom bevat.
Volgende stappen
- Meer informatie over het aanpassen van HDInsight-clusters met behulp van scriptactie
- Gebruik de naslaginformatie over de .NET SDK voor HDInsight voor meer informatie over het maken van .NET-toepassingen die HDInsight beheren
- Gebruik de HDInsight REST API om te leren hoe u REST gebruikt om beheeracties uit te voeren op HDInsight-clusters.