Delen via


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:

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.

Zie Problemen met scriptacties oplossen voor meer informatie over het weergeven van informatie die is vastgelegd door scriptacties.

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:

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