Entwickeln von Skriptaktionen mit HDInsightScript action development with HDInsight

Erfahren Sie, wie Sie Ihr HDInsight-Cluster mit Bash-Skripts anpassen können.Learn how to customize your HDInsight cluster using Bash scripts. Mit Skriptaktionen können Sie HDInsight während oder nach der Erstellung eines Clusters anpassen.Script actions are a way to customize HDInsight during or after cluster creation.

Was sind Skriptaktionen?What are script actions

Skriptaktionen sind Bash-Skripts, die Azure auf dem Clusterknoten ausführt, um Konfigurationsänderungen vorzunehmen oder Software zu installieren.Script actions are Bash scripts that Azure runs on the cluster nodes to make configuration changes or install software. Eine Skriptaktion wird als Stamm ausgeführt und bietet Vollzugriffsrechte auf die Clusterknoten.A script action is executed as root, and provides full access rights to the cluster nodes.

Skriptaktionen können mithilfe der folgenden Methoden angewendet werden:Script actions can be applied through the following methods:

Verwenden Sie diese Methode, um ein Skript anzuwenden...Use this method to apply a script... Während der Clustererstellung...During cluster creation... In einem ausgeführten Cluster...On a running cluster...
Azure-PortalAzure portal
Azure PowerShellAzure PowerShell
Die klassische Azure CLIAzure Classic CLI  
HDInsight .NET-SDKHDInsight .NET SDK
Azure Resource Manager-VorlageAzure Resource Manager Template  

Weitere Informationen zur Verwendung dieser Methoden zum Anwenden von Skriptaktionen finden Sie unter Anpassen Linux-basierter HDInsight-Cluster mithilfe von Skriptaktionen.For more information on using these methods to apply script actions, see Customize HDInsight clusters using script actions.

Bewährte Methoden für die Entwicklung von SkriptsBest practices for script development

Wenn Sie ein benutzerdefiniertes Skript für einen HDInsight-Cluster entwickeln, sollten Sie mehrere bewährte Methoden beachten:When you develop a custom script for an HDInsight cluster, there are several best practices to keep in mind:

Wichtig

Skriptaktionen müssen innerhalb von 60 Minuten abgeschlossen sein, andernfalls schlägt der Prozess fehl.Script actions must complete within 60 minutes or the process fails. Während der Knotenbereitstellung wird das Skript gleichzeitig mit anderen Einrichtungs- und Konfigurationsprozessen ausgeführt.During node provisioning, the script runs concurrently with other setup and configuration processes. Der Wettbewerb um Ressourcen wie CPU-Zeit oder Netzwerkbandbreite kann dazu führen, dass es länger als in Ihrer Entwicklungsumgebung dauert, bis das Skript abgeschlossen ist.Competition for resources such as CPU time or network bandwidth may cause the script to take longer to finish than it does in your development environment.

Auswählen der Apache Hadoop-VersionTarget the Apache Hadoop version

In den verschiedenen HDInsight-Versionen sind unterschiedliche Versionen von Hadoop-Diensten und Hadoop-Komponenten installiert.Different versions of HDInsight have different versions of Hadoop services and components installed. Wenn bei Ihrem Skript eine bestimmte Version eines Diensts oder einer Komponente vorausgesetzt wird, sollten Sie das Skript nur mit der HDInsight-Version verwenden, die die erforderlichen Komponenten enthält.If your script expects a specific version of a service or component, you should only use the script with the version of HDInsight that includes the required components. Informationen zu den in HDInsight enthaltenen Komponentenversionen finden Sie im Dokument Neuheiten in den von HDInsight bereitgestellten Hadoop-Clusterversionen .You can find information on component versions included with HDInsight using the HDInsight component versioning document.

Überprüfen der BetriebssystemversionChecking the operating system version

Unterschiedliche Versionen von HDInsight basieren auf bestimmten Versionen von Ubuntu.Different versions of HDInsight rely on specific versions of Ubuntu. Unter Umständen bestehen Unterschiede zwischen den Betriebssystemversionen, die Sie für Ihr Skript überprüfen sollten.There may be differences between OS versions that you must check for in your script. Beispielweise müssen Sie ggf. eine Binärdatei installieren, die an die Version von Ubuntu gebunden ist.For example, you may need to install a binary that is tied to the version of Ubuntu.

Verwenden Sie lsb_release, um die Betriebssystemversion zu überprüfen.To check the OS version, use lsb_release. Das folgende Skript veranschaulicht beispielsweise, wie Sie je nach Betriebssystemversion auf eine spezifische TAR-Datei verweisen:For example, the following script demonstrates how to reference a specific tar file depending on the OS version:

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

Ausrichten auf die BetriebssystemversionTarget the operating system version

Linux-basiertes HDInsight basiert auf der Ubuntu Linux-Distribution.Linux-based HDInsight is based on the Ubuntu Linux distribution. Da unterschiedliche Versionen von HDInsight auf verschiedenen Versionen von Ubuntu basieren, können sich Auswirkungen auf das Skriptverhalten ergeben.Different versions of HDInsight rely on different versions of Ubuntu, which may change how your script behaves. Beispielsweise basiert HDInsight 3.4 und früher auf Ubuntu-Versionen, für die Upstart genutzt wird.For example, HDInsight 3.4 and earlier are based on Ubuntu versions that use Upstart. Version 3.5 und höher basieren auf Ubuntu 16.04 mit Verwendung von Systemd.Versions 3.5 and greater are based on Ubuntu 16.04, which uses Systemd. Für Systemd und Upstart sind unterschiedliche Befehle erforderlich, und Ihr Skript sollte so geschrieben sein, dass es für beide Fälle funktioniert.Systemd and Upstart rely on different commands, so your script should be written to work with both.

Ein weiterer wichtiger Unterschied zwischen HDInsight 3.4 und 3.5 besteht darin, dass JAVA_HOME jetzt auf Java 8 verweist.Another important difference between HDInsight 3.4 and 3.5 is that JAVA_HOME now points to Java 8. Der folgende Code veranschaulicht, wie ermittelt werden kann, ob das Skript unter Ubuntu 14 oder 16 ausgeführt wird:The following code demonstrates how to determine if the script is running on Ubuntu 14 or 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

Das vollständige Skript mit diesen Codeausschnitten finden Sie unter https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh.You can find the full script that contains these snippets at https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh.

Informationen zur Version von Ubuntu, die von HDInsight verwendet wird, finden Sie im Dokument HDInsight-Komponentenversion.For the version of Ubuntu that is used by HDInsight, see the HDInsight component version document.

Informationen zu den Unterschieden zwischen Systemd und Upstart finden Sie unter Systemd for Upstart users (Systemd für Upstart-Benutzer).To understand the differences between Systemd and Upstart, see Systemd for Upstart users.

Einrichten stabiler Verknüpfungen mit SkriptressourcenProvide stable links to script resources

Das Skript und die damit verknüpften Ressourcen müssen während des gesamten Lebenszyklus des Clusters verfügbar sein.The script and associated resources must remain available throughout the lifetime of the cluster. Diese Ressourcen werden benötigt, wenn während der Skalierungsvorgänge neue Knoten zum Cluster hinzugefügt werden.These resources are required if new nodes are added to the cluster during scaling operations.

Die bewährte Methode ist das Herunterladen und Archivieren aller Daten in einem Azure-Speicherkonto Ihres Abonnements.The best practice is to download and archive everything in an Azure Storage account on your subscription.

Wichtig

Bei dem verwendeten Speicherkonto muss es sich um das Standardspeicherkonto des Clusters oder um einen öffentlichen, schreibgeschützten Container eines anderen Speicherkontos handeln.The storage account used must be the default storage account for the cluster or a public, read-only container on any other storage account.

Die von Microsoft bereitgestellten Beispiele sind beispielsweise im Speicherkonto https://hdiconfigactions.blob.core.windows.net/ gespeichert.For example, the samples provided by Microsoft are stored in the https://hdiconfigactions.blob.core.windows.net/ storage account. Bei diesem Speicherort handelt es sich um einen öffentlichen, schreibgeschützten Container, der vom HDInsight-Team verwaltet wird.This location is a public, read-only container maintained by the HDInsight team.

Verwenden vorkompilierter RessourcenUse pre-compiled resources

Zur Verringerung des Zeitraums, der für die Ausführung des Skripts benötigt wird, sollten Sie Vorgänge vermeiden, mit denen Ressourcen aus dem Quellcode kompiliert werden.To reduce the time it takes to run the script, avoid operations that compile resources from source code. Sie können Ressourcen beispielsweise vorkompilieren und sie in einem Azure-Speicherkonto-Blob speicher, das sich im selben Rechenzentrum wie HDInsight befindet.For example, pre-compile resources and store them in an Azure Storage account blob in the same data center as HDInsight.

Sicherstellen, dass das Clusteranpassungsskript idempotent istEnsure that the cluster customization script is idempotent

Skripts müssen idempotent sein.Scripts must be idempotent. Wenn das Skript mehrfach ausgeführt wird, sollte es den Cluster jedes Mal in den gleichen Zustand zurückversetzen.If the script runs multiple times, it should return the cluster to the same state every time.

Ein Skript, dass Konfigurationsdateien modifiziert, sollte z.B. keine doppelten Einträge hinzufügen, wenn es mehrfach ausgeführt wird.For example, a script that modifies configuration files should not add duplicate entries if ran multiple times.

Sicherstellen einer hohen Verfügbarkeit der ClusterarchitekturEnsure high availability of the cluster architecture

Linux-basierte HDInsight-Cluster stellen zwei Hauptknoten bereit, die im Cluster aktiv sind. Skriptaktionen werden auf beiden Knoten ausgeführt.Linux-based HDInsight clusters provide two head nodes that are active within the cluster, and script actions run on both nodes. Wenn die von Ihnen installierten Komponenten nur einen Hauptknoten erwarten, installieren Sie die Komponenten nicht auf beiden Hauptknoten.If the components you install expect only one head node, do not install the components on both head nodes.

Wichtig

Dienste, die im Rahmen von HDInsight bereitgestellt werden, wurden entwickelt, um bei Bedarf ein Failover zwischen den beiden Hauptknoten auszuführen.Services provided as part of HDInsight are designed to fail over between the two head nodes as needed. Diese Funktion gilt nicht für benutzerdefinierte Komponenten, die mit Skriptaktionen installiert wurden.This functionality is not extended to custom components installed through script actions. Wenn Sie Hochverfügbarkeit für benutzerdefinierte Komponenten benötigen, müssen Sie Ihren eigenen Failovermechanismus implementieren.If you need high availability for custom components, you must implement your own failover mechanism.

Konfigurieren benutzerdefinierter Komponenten zur Verwendung von Azure-BlobspeicherConfigure the custom components to use Azure Blob storage

Die Komponenten, die Sie auf dem Cluster installieren, sind möglicherweise standardmäßig so konfiguriert, dass sie den HDFS-Speicher (Apache Hadoop Distributed File System) verwenden.Components that you install on the cluster might have a default configuration that uses Apache Hadoop Distributed File System (HDFS) storage. HDInsight verwendet als Standardspeicher entweder Azure Storage oder Azure Data Lake Storage.HDInsight uses either Azure Storage or Data Lake Storage as the default storage. Diese bieten ein mit HDFS kompatibles Dateisystem, das Daten auch dann beibehält, wenn der Cluster gelöscht wird.Both provide an HDFS compatible file system that persists data even if the cluster is deleted. Möglicherweise müssen Sie die Komponenten, die Sie installieren, so konfigurieren, dass sie WASB oder ADL anstelle von HDFS verwenden.You may need to configure components you install to use WASB or ADL instead of HDFS.

Für die meisten Vorgänge müssen Sie das Dateisystem nicht angeben.For most operations, you do not need to specify the file system. Mit dem folgenden Code wird beispielsweise die Datei „hadoop-common.jar“ aus dem lokalen Dateisystem in den Clusterspeicher kopiert:For example, the following copies the hadoop-common.jar file from the local file system to cluster storage:

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

In diesem Beispiel verwendet der Befehl hdfs auf transparente Weise den Standardclusterspeicher.In this example, the hdfs command transparently uses the default cluster storage. Für manche Vorgänge müssen Sie möglicherweise den URI angeben.For some operations, you may need to specify the URI. Geben Sie beispielsweise adl:///example/jars für Azure Data Lake Storage Gen1, abfs:///example/jars für Data Lake Storage Gen2 oder wasb:///example/jars für Azure Storage an.For example, adl:///example/jars for Azure Data Lake Storage Gen1, abfs:///example/jars for Data Lake Storage Gen2 or wasb:///example/jars for Azure Storage.

Schreiben von Informationen in STDOUT und STDERRWrite information to STDOUT and STDERR

HDInsight protokolliert Skriptausgaben, die in STDOUT oder STDERR geschrieben werden.HDInsight logs script output that is written to STDOUT and STDERR. Diese Informationen können Sie mit der Ambari-Webbenutzeroberfläche anzeigen.You can view this information using the Ambari web UI.

Hinweis

Apache Ambari ist nur dann verfügbar, wenn der Cluster erfolgreich erstellt wurde.Apache Ambari is only available if the cluster is successfully created. Wenn Sie während der Clustererstellung eine Skriptaktion verwenden, und ein Fehler bei der Erstellung auftritt, finden Sie im Abschnitt zur Problembehandlung unter Anpassen Linux-basierter HDInsight-Cluster mithilfe von Skriptaktionen andere Möglichkeiten, um auf protokollierte Informationen zuzugreifen.If you use a script action during cluster creation, and creation fails, see the troubleshooting section Customize HDInsight clusters using script action for other ways of accessing logged information.

Die meisten Dienstprogramme und Installationspakete schreiben bereits Informationen in STDOUT und STDERR. Möglicherweise möchten Sie jedoch weitere Protokollierungsinformationen hinzufügen.Most utilities and installation packages already write information to STDOUT and STDERR, however you may want to add additional logging. Verwenden Sie echo, um Text an STDOUT zu senden.To send text to STDOUT, use echo. Beispiel:For example:

echo "Getting ready to install Foo"

Standardmäßig sendet echo die Zeichenfolge an STDOUT.By default, echo sends the string to STDOUT. Soll dieser an STDERR geleitet werden, setzen Sie >&2 vor echo.To direct it to STDERR, add >&2 before echo. Beispiel:For example:

>&2 echo "An error occurred installing Foo"

So werden in STDOUT geschriebene Informationen stattdessen an STDERR (2) weitergeleitet.This redirects information written to STDOUT to STDERR (2) instead. Weitere Informationen zur E/A-Umleitung finden Sie unter https://www.tldp.org/LDP/abs/html/io-redirection.html.For more information on IO redirection, see https://www.tldp.org/LDP/abs/html/io-redirection.html.

Weitere Informationen zum Anzeigen der durch Skriptaktionen protokollierten Daten finden Sie unter Anpassen Linux-basierter HDInsight-Cluster mithilfe von SkriptaktionenFor more information on viewing information logged by script actions, see Customize HDInsight clusters using script action

Speichern von Dateien im ASCII-Format mit LF-ZeilenendenSave files as ASCII with LF line endings

Bash-Skripts sollten im ASCII-Format und mit LF als Zeilenende gespeichert werden.Bash scripts should be stored as ASCII format, with lines terminated by LF. Dateien, die als UTF-8 gespeichert wurden, oder die CRLF als Zeilenende verwenden, schlagen möglicherweise mit folgendem Fehler fehl:Files that are stored as UTF-8, or use CRLF as the line ending may fail with the following error:

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

Verwenden von Wiederholungsversuchlogik zum Wiederherstellen bei vorübergehenden FehlernUse retry logic to recover from transient errors

Beim Herunterladen von Dateien, die Pakete mit apt-get installieren, oder anderen Aktionen, die Daten über das Internet übertragen, können vorübergehende Netzwerkfehler die erfolgreiche Ausführung verhindern.When downloading files, installing packages using apt-get, or other actions that transmit data over the internet, the action may fail due to transient networking errors. Für die Remoteressource, mit der Sie kommunizieren, könnte z.B. gerade ein Failover zu einem Sicherungsknoten durchgeführt werden.For example, the remote resource you are communicating with may be in the process of failing over to a backup node.

Damit Ihr Skript gegenüber vorübergehenden Fehlern stabil ist, können Sie die Wiederholungsversuchlogik implementieren.To make your script resilient to transient errors, you can implement retry logic. Die folgende Funktion veranschaulicht, wie Sie Wiederholungslogik implementieren können.The following function demonstrates how to implement retry logic. Der Vorgang wird dreimal wiederholt, bevor er fehlschlägt.It retries the operation three times before failing.

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

Die folgenden Beispiele veranschaulichen, wie Sie diese Funktion verwenden können.The following examples demonstrate how to use this function.

retry ls -ltr foo

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

Hilfsmethoden für benutzerdefinierte SkriptsHelper methods for custom scripts

Hilfsmethoden für Skriptaktionen sind Hilfsprogramme, die Sie zum Schreiben von benutzerdefinierten Skripts verwenden können.Script action helper methods are utilities that you can use while writing custom scripts. Diese Methoden sind in im Skript https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh enthalten.These methods are contained in the https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh script. Verwenden Sie Folgendes, um sie herunterzuladen und als Teil Ihres Skripts zu verwenden:Use the following to download and use them as part of your 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

Folgende Hilfsprogramme stehen für das Verwenden in Ihrem Skript zur Verfügung:The following helpers available for use in your script:

HilfsprogrammHelper usage BESCHREIBUNGDescription
download_file SOURCEURL DESTFILEPATH [OVERWRITE] Lädt eine Datei aus dem Quell-URI in den angegebenen Dateipfad herunter.Downloads a file from the source URI to the specified file path. Standardmäßig wird eine vorhandene Datei nicht überschrieben.By default, it does not overwrite an existing file.
untar_file TARFILE DESTDIR Extrahiert eine TAR-Datei (mit -xf) in das ZielverzeichnisExtracts a tar file (using -xf) to the destination directory.
test_is_headnode Bei Ausführung auf dem Hauptknoten eines Clusters wird „1“ zurückgegeben, andernfalls „0“.If ran on a cluster head node, return 1; otherwise, 0.
test_is_datanode Wenn der aktuelle Knoten ein Datenknoten (Workerknoten) ist, wird „1“ zurückgegeben, andernfalls „0“.If the current node is a data (worker) node, return a 1; otherwise, 0.
test_is_first_datanode Wenn der aktuelle Knoten der erste Datenknoten (Workerknoten) ist (mit dem Namen „workernode0“), wird „1“ zurückgegeben, andernfalls „0“.If the current node is the first data (worker) node (named workernode0) return a 1; otherwise, 0.
get_headnodes Gibt den vollqualifizierten Domänennamen der Hauptknoten im Cluster zurück.Return the fully qualified domain name of the headnodes in the cluster. Namen sind durch Kommas getrennt.Names are comma delimited. Bei einem Fehler wird eine leere Zeichenfolge zurückgegeben.An empty string is returned on error.
get_primary_headnode Ruft den vollqualifizierten Domänennamen des primären Hauptknotens ab.Gets the fully qualified domain name of the primary headnode. Bei einem Fehler wird eine leere Zeichenfolge zurückgegeben.An empty string is returned on error.
get_secondary_headnode Ruft den vollqualifizierten Domänennamen des sekundären Hauptknotens ab.Gets the fully qualified domain name of the secondary headnode. Bei einem Fehler wird eine leere Zeichenfolge zurückgegeben.An empty string is returned on error.
get_primary_headnode_number Ruft das numerische Suffix des primären Hauptknotens ab.Gets the numeric suffix of the primary headnode. Bei einem Fehler wird eine leere Zeichenfolge zurückgegeben.An empty string is returned on error.
get_secondary_headnode_number Ruft das numerische Suffix des sekundären Hauptknotens ab.Gets the numeric suffix of the secondary headnode. Bei einem Fehler wird eine leere Zeichenfolge zurückgegeben.An empty string is returned on error.

Gängige VerwendungsmusterCommon usage patterns

Dieser Abschnitt enthält Anweisungen für das Implementieren einiger gängiger Verwendungsmuster, die Ihnen beim Schreiben Ihrer eigenen benutzerdefinierten Skripts begegnen können.This section provides guidance on implementing some of the common usage patterns that you might run into while writing your own custom script.

Übergeben von Parametern an ein SkriptPassing parameters to a script

In einigen Fällen müssen Sie Parameter für das Skript angeben.In some cases, your script may require parameters. Beispielsweise müssen Sie das Administratorkennwort für den Cluster angeben, wenn Sie die Ambari-REST-API verwenden.For example, you may need the admin password for the cluster when using the Ambari REST API.

Parameter, die an das Skript übergeben werden, werden als Positionsparameter bezeichnet und für den ersten Parameter $1 zugewiesen, dann für den zweiten Parameter $2 usw.Parameters passed to the script are known as positional parameters, and are assigned to $1 for the first parameter, $2 for the second, and so-on. $0 enthält den Namen des Skripts.$0 contains the name of the script itself.

Werte, die als Parameter an das Skript übergeben wurden, sollten mit einfache Anführungszeichen (‚‘) verwendet werden.Values passed to the script as parameters should be enclosed by single quotes ('). So stellen Sie sicher, dass der übergebene Wert als Literal behandelt wird.Doing so ensures that the passed value is treated as a literal.

Festlegen von UmgebungsvariablenSetting environment variables

Eine Umgebungsvariable wird mit folgender Anweisung festgelegt:Setting an environment variable is performed by the following statement:

VARIABLENAME=value

Dabei ist VARIABLENNAME der Name der Variable.Where VARIABLENAME is the name of the variable. Verwenden Sie $VARIABLENAME, um auf die Variable zuzugreifen.To access the variable, use $VARIABLENAME. Verwenden Sie beispielsweise folgende Anweisung, um einen Wert, der von einem Positionsparameter bereitgestellt wird, als Umgebungsvariable mit dem Namen „PASSWORD“ zuzuweisen:For example, to assign a value provided by a positional parameter as an environment variable named PASSWORD, you would use the following statement:

PASSWORD=$1

Für den anschließenden Zugriff auf die Informationen kann dann $PASSWORD verwendet werden.Subsequent access to the information could then use $PASSWORD.

Umgebungsvariablen, die im Skript festgelegt werden, gelten nur innerhalb des Gültigkeitsbereichs des Skripts.Environment variables set within the script only exist within the scope of the script. In einigen Fällen müssen Sie möglicherweise systemweite Umgebungsvariablen hinzufügen, die nach Abschluss des Skripts beibehalten werden.In some cases, you may need to add system-wide environment variables that will persist after the script has finished. Fügen Sie die Variable in /etc/environment ein, um systemweite Umgebungsvariablen hinzuzufügen.To add system-wide environment variables, add the variable to /etc/environment. Die folgende Anweisung fügt beispielsweise HADOOP_CONF_DIR hinzu:For example, the following statement adds HADOOP_CONF_DIR:

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

Zugriff auf Speicherorte benutzerdefinierter SkriptsAccess to locations where the custom scripts are stored

Skripts zum Anpassen eines Clusters müssen an einem der folgenden Speicherorte gespeichert werden:Scripts used to customize a cluster needs to be stored in one of the following locations:

  • Ein Azure-Speicherkonto, das dem Cluster zugeordnet ist.An Azure Storage account that is associated with the cluster.

  • Zusätzliches Speicherkonto, das dem Cluster zugeordnet istAn additional storage account associated with the cluster.

  • Ein öffentlich lesbarer URIA publicly readable URI. Beispielsweise eine Daten-URL, die in OneDrive, Dropbox oder in einem anderen Dateihostingdienst gespeichert istFor example, a URL to data stored on OneDrive, Dropbox, or other file hosting service.

  • Azure Data Lake Storage-Konto, das dem HDInsight-Cluster zugeordnet ist.An Azure Data Lake Storage account that is associated with the HDInsight cluster. Weitere Informationen zur Verwendung von Azure Data Lake Storage mit HDInsight finden Sie unter Schnellstart: Einrichten von Clustern in HDInsight.For more information on using Azure Data Lake Storage with HDInsight, see Quickstart: Set up clusters in HDInsight.

    Hinweis

    Der Dienstprinzipal, der von HDInsight zum Zugreifen auf Data Lake Storage genutzt wird, muss über Lesezugriff auf das Skript verfügen.The service principal HDInsight uses to access Data Lake Storage must have read access to the script.

Vom Skript verwendete Ressourcen müssen ebenfalls öffentlich verfügbar sein.Resources used by the script must also be publicly available.

Durch das Speichern von Dateien in einem Azure Storage-Konto oder in Azure Data Lake Storage erhalten Sie schnellen Zugriff, da sich beide innerhalb des Azure-Netzwerks befinden.Storing the files in an Azure Storage account or Azure Data Lake Storage provides fast access, as both within the Azure network.

Hinweis

Das URI-Format zum Verweisen auf das Skript unterscheidet sich je nach dem verwendeten Dienst.The URI format used to reference the script differs depending on the service being used. Verwenden Sie für Speicherkonten, die dem HDInsight-Cluster zugeordnet sind, wasb:// oder wasbs://.For storage accounts associated with the HDInsight cluster, use wasb:// or wasbs://. Verwenden Sie für öffentlich lesbare URIs http:// oder https://.For publicly readable URIs, use http:// or https://. Verwenden Sie für Data Lake Storage adl://.For Data Lake Storage, use adl://.

Prüfliste für die Bereitstellung einer SkriptaktionChecklist for deploying a script action

Es folgen die Schritte zur Vorbereitung der Bereitstellung eines Skripts:Here are the steps take when preparing to deploy a script:

  • Legen Sie Daten mit den benutzerdefinierten Skripts an einem Speicherort ab, auf den die Clusterknoten während der Bereitstellung zugreifen können.Put the files that contain the custom scripts in a place that is accessible by the cluster nodes during deployment. Z.B. der Standardspeicher für den ClusterFor example, the default storage for the cluster. Dateien können außerdem in öffentlich lesbaren Hostingdiensten gespeichert werden.Files can also be stored in publicly readable hosting services.
  • Vergewissern Sie sich, dass das Skript idempotent ist.Verify that the script is idempotent. Damit kann das Skript mehrfach auf demselben Knoten ausgeführt werden.Doing so allows the script to be executed multiple times on the same node.
  • Legen Sie die heruntergeladenen von den Skripts verwendeten Dateien in einem temporären Dateiverzeichnis ab (z. B. "/tmp"), und löschen Sie sie nach der Ausführung der Skripts.Use a temporary file directory /tmp to keep the downloaded files used by the scripts and then clean them up after scripts have executed.
  • Wenn die Einstellungen auf Betriebssystemebene oder Dienstkonfigurationsdateien geändert werden, sollten Sie HDInsight-Dienste neu starten.If OS-level settings or Hadoop service configuration files are changed, you may want to restart HDInsight services.

Ausführen einer SkriptaktionHow to run a script action

Sie können Skriptaktionen verwenden, um HDInsight-Cluster mit der folgenden Methode anzupassen:You can use script actions to customize HDInsight clusters using the following methods:

  • Azure-PortalAzure portal
  • Azure PowerShellAzure PowerShell
  • Azure-Ressourcen-Manager-VorlagenAzure Resource Manager templates
  • Das HDInsight .NET SDKThe HDInsight .NET SDK.

Weitere Informationen zur Verwendung jeder Methode finden Sie unter Anpassen Linux-basierter HDInsight-Cluster mithilfe von Skriptaktionen.For more information on using each method, see How to use script action.

Beispiele benutzerdefinierter SkriptsCustom script samples

Microsoft bietet Beispielskripts für die Installation von Komponenten in einem HDInsight-Cluster.Microsoft provides sample scripts to install components on an HDInsight cluster. Unter folgenden Links finden Sie weitere Beispiele für Skriptaktionen.See the following links for more example script actions.

ProblembehandlungTroubleshooting

Bei der Verwendung der von Ihnen entwickelten Skripts können die folgenden Fehler auftreten:The following are errors you may encounter when using scripts you have developed:

Fehler: $'\r': command not found.Error: $'\r': command not found. Manchmal gefolgt von syntax error: unexpected end of file.Sometimes followed by syntax error: unexpected end of file.

Ursache: Dieser Fehler tritt auf, wenn die Zeilen in einem Skript mit CR-LF enden.Cause: This error is caused when the lines in a script end with CRLF. In UNIX-Systemen wird als Zeilenende nur LF erwartet.Unix systems expect only LF as the line ending.

Dieses Problem tritt am häufigsten auf, wenn das Skript in einer Windows-Umgebung erstellt wird, da CR-LF in vielen Text-Editoren unter Windows als gängiges Zeilenende verwendet wird.This problem most often occurs when the script is authored on a Windows environment, as CRLF is a common line ending for many text editors on Windows.

Lösung: Wenn Ihr Text-Editor über die entsprechende Option verfügt, wählen Sie UNIX als Format oder LF für das Zeilenende aus.Resolution: If it is an option in your text editor, select Unix format or LF for the line ending. In einem UNIX-System können Sie außerdem die folgenden Befehle verwenden, um CR-LF in LF zu ändern:You may also use the following commands on a Unix system to change the CRLF to an LF:

Hinweis

Mit den folgenden annähernd gleichwertigen Befehlen sollten sich die CR-LF-Zeilenenden in LF ändern lassen.The following commands are roughly equivalent in that they should change the CRLF line endings to LF. Wählen Sie einen Befehl entsprechend den in Ihrem System verfügbaren Dienstprogrammen aus.Select one based on the utilities available on your system.

Get-HelpCommand NotizenNotes
unix2dos -b INFILE Die ursprüngliche Datei wird mit einer BAK-Erweiterung gesichertThe original file is backed up with a .BAK extension
tr -d '\r' < INFILE > OUTFILE OUTFILE enthält eine Version, die ausschließlich LF-Zeilenenden umfasstOUTFILE contains a version with only LF endings
perl -pi -e 's/\r\n/\n/g' INFILE Modifiziert die Datei direktModifies the file directly
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE OUTFILE enthält eine Version, die ausschließlich LF-Zeilenenden umfasst.OUTFILE contains a version with only LF endings.

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

Ursache: Dieser Fehler tritt auf, wenn das Skript im Format UTF-8 mit einer Bytereihenfolge-Marke (BOM) gespeichert wurde.Cause: This error occurs when the script was saved as UTF-8 with a Byte Order Mark (BOM).

Lösung: Speichern Sie die Datei entweder im ASCII-Format oder im UTF-8-Format ohne Bytereihenfolge-Marke.Resolution: Save the file either as ASCII, or as UTF-8 without a BOM. In einem Linux- oder UNIX-System können Sie auch mit dem folgenden Befehl eine Datei ohne Bytereihenfolge-Marke (BOM) erstellen:You may also use the following command on a Linux or Unix system to create a file without the BOM:

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

Ersetzen Sie INFILE durch die Datei ohne BOM.Replace INFILE with the file containing the BOM. Für OUTFILE sollte ein neuer Dateiname eingegeben werden. Die Datei enthält dann das Skript ohne BOM.OUTFILE should be a new file name, which contains the script without the BOM.

Nächste SchritteNext steps