Sviluppo di azioni script con HDInsightScript action development with HDInsight

Informazioni su come personalizzare il cluster HDInsight tramite script Bash.Learn how to customize your HDInsight cluster using Bash scripts. Le azioni script consentono di personalizzare HDInsight durante o dopo la creazione del cluster.Script actions are a way to customize HDInsight during or after cluster creation.

Importante

I passaggi descritti in questo documento richiedono un cluster HDInsight che usa Linux.The steps in this document require an HDInsight cluster that uses Linux. Linux è l'unico sistema operativo usato in HDInsight versione 3.4 o successiva.Linux is the only operating system used on HDInsight version 3.4 or greater. Per altre informazioni, vedere la sezione relativa al ritiro di HDInsight in Windows.For more information, see HDInsight retirement on Windows.

Definizione di azioni scriptWhat are script actions

Le azioni script sono script Bash eseguiti da Azure sui nodi del cluster per apportare modifiche alla configurazione o installare software.Script actions are Bash scripts that Azure runs on the cluster nodes to make configuration changes or install software. Un'azione script viene eseguita come radice e fornisce diritti di accesso completo ai nodi del cluster.A script action is executed as root, and provides full access rights to the cluster nodes.

L'azione script può essere applicata usando i metodi seguenti:Script actions can be applied through the following methods:

Usare questo metodo per applicare uno script...Use this method to apply a script... Durante la creazione di un cluster...During cluster creation... In un cluster in esecuzione...On a running cluster...
Portale di AzureAzure portal
Azure PowerShellAzure PowerShell
Interfaccia della riga di comando di AzureAzure CLI  
HDInsight .NET SDKHDInsight .NET SDK
Modello di Azure Resource ManagerAzure Resource Manager Template  

Per altre informazioni sull'uso di questi metodi per l'applicazione di azioni script, vedere Personalizzare cluster HDInsight tramite azioni script.For more information on using these methods to apply script actions, see Customize HDInsight clusters using script actions.

Procedure consigliate per lo sviluppo di scriptBest practices for script development

Quando si sviluppa uno script personalizzato per un cluster HDInsight, è opportuno seguire le procedure consigliate indicate di seguito:When you develop a custom script for an HDInsight cluster, there are several best practices to keep in mind:

Importante

Le azioni di script devono essere completate entro 60 minuti; in caso contrario il processo avrà esito negativo.Script actions must complete within 60 minutes or the process fails. Durante il provisioning dei nodi, lo script viene eseguito contemporaneamente ad altri processi di installazione e configurazione.During node provisioning, the script runs concurrently with other setup and configuration processes. In caso di concorrenza per risorse come il tempo di CPU o la larghezza di banda di rete, lo script può richiedere più tempo per completare l'operazione rispetto al tempo che impiegherebbe in un ambiente di sviluppo.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.

Usare la versione di HadoopTarget the Hadoop version

Nelle diverse versioni di HDInsight sono installate versioni diverse di servizi e componenti di Hadoop.Different versions of HDInsight have different versions of Hadoop services and components installed. Se lo script prevede una versione specifica di un servizio o un componente, si dovrà usare lo script solo con la versione di HDInsight che include i componenti richiesti.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. Per trovare informazioni sulle versioni dei componenti incluse in HDInsight, usare il documento relativo al controllo delle versioni dei componenti di HDInsight .You can find information on component versions included with HDInsight using the HDInsight component versioning document.

Usare la versione del sistema operativoTarget the OS version

HDInsight basato su Linux si basa sulla distribuzione di Ubuntu Linux.Linux-based HDInsight is based on the Ubuntu Linux distribution. Versioni diverse di HDInsight si basano su versioni differenti di Ubuntu e questo può influire sul comportamento dello script.Different versions of HDInsight rely on different versions of Ubuntu, which may change how your script behaves. HDInsight 3.4 e versioni precedenti si basano ad esempio su versioni di Ubuntu che usano Upstart.For example, HDInsight 3.4 and earlier are based on Ubuntu versions that use Upstart. La versione 3.5 e le versioni superiori si basano su Ubuntu 16.04 che usa Systemd.Versions 3.5 and greater are based on Ubuntu 16.04, which uses Systemd. Systemd e Upstart si basano su comandi diversi, quindi lo script deve essere scritto in modo da funzionare con entrambi.Systemd and Upstart rely on different commands, so your script should be written to work with both.

Un'altra differenza importante tra HDInsight 3.4 e 3.5 è che JAVA_HOME punta ora a Java 8.Another important difference between HDInsight 3.4 and 3.5 is that JAVA_HOME now points to Java 8.

È possibile verificare la versione del sistema operativo con lsb_release.You can check the OS version by using lsb_release. Il codice seguente illustra come determinare se lo script è in esecuzione su Ubuntu 14 o 16: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 verion is $OS_VERSION. Using hue-binaries-14-04."
    HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
    echo "OS verion 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

Lo script completo contenente questi frammenti è disponibile all'indirizzo 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.

Per la versione di Ubuntu usata da HDInsight, vedere il documento sulle versioni dei componenti HDInsight.For the version of Ubuntu that is used by HDInsight, see the HDInsight component version document.

Per comprendere le differenze tra Systemd e Upstart, vedere Systemd per gli utenti di Upstart.To understand the differences between Systemd and Upstart, see Systemd for Upstart users.

Fornire collegamenti stabili alle risorse di scriptProvide stable links to script resources

Lo script e le risorse associate devono rimanere disponibili per tutta la durata del cluster.The script and associated resources must remain available throughout the lifetime of the cluster. Queste risorse sono necessarie se vengono aggiunti nuovi nodi al cluster durante operazioni di ridimensionamento.These resources are required if new nodes are added to the cluster during scaling operations.

È consigliabile scaricare e archiviare tutti gli elementi in un account di archiviazione di Azure nella propria sottoscrizione.The best practice is to download and archive everything in an Azure Storage account on your subscription.

Importante

L'account di archiviazione usato deve essere quello predefinito per il cluster o un contenitore pubblico di sola lettura per qualsiasi altro account di archiviazione.The storage account used must be the default storage account for the cluster or a public, read-only container on any other storage account.

Gli esempi forniti da Microsoft, ad esempio, vengono archiviati nell'account di archiviazione https://hdiconfigactions.blob.core.windows.net/.For example, the samples provided by Microsoft are stored in the https://hdiconfigactions.blob.core.windows.net/ storage account. Si tratta di un contenitore pubblico e di sola lettura, gestito dal team di HDInsight.This is a public, read-only container maintained by the HDInsight team.

Usare risorse precompilateUse pre-compiled resources

Per ridurre il tempo necessario per eseguire lo script, evitare operazioni di compilazione delle risorse dal codice sorgente.To reduce the time it takes to run the script, avoid operations that compile resources from source code. Ad esempio, precompilare le risorse e archiviarle in un BLOB dell'account di archiviazione di Azure nello stesso data center di HDInsight.For example, pre-compile resources and store them in an Azure Storage account blob in the same data center as HDInsight.

Assicurarsi che lo script di personalizzazione del cluster sia idempotenteEnsure that the cluster customization script is idempotent

Gli script devono essere idempotenti.Scripts must be idempotent. Se lo script viene eseguito più volte, ogni volta deve riportare il cluster allo stato iniziale.If the script runs multiple times, it should return the cluster to the same state every time.

Uno script che modifica i file di configurazione, ad esempio, non deve aggiungere voci duplicate se viene eseguito più volte.For example, a script that modifies configuration files should not add duplicate entries if ran multiple times.

Verificare la disponibilità elevata dell'architettura del clusterEnsure high availability of the cluster architecture

I cluster HDInsight basati su Linux forniscono due nodi head attivi all'interno del cluster e le azioni script vengono eseguite per entrambi i nodi.Linux-based HDInsight clusters provide two head nodes that are active within the cluster, and script actions run on both nodes. Se i componenti da installare prevedono un solo nodo head, non installare i componenti in entrambi i nodi head.If the components you install expect only one head node, do not install the components on both head nodes.

Importante

I servizi forniti nell'ambito di HDInsight sono progettati per supportare il failover tra i due nodi head, se necessario.Services provided as part of HDInsight are designed to fail over between the two head nodes as needed. Questa funzionalità non è estesa ai componenti personalizzati installati tramite azioni script.This functionality is not extended to custom components installed through script actions. Se i componenti personalizzati richiedono una disponibilità elevata, è necessario implementare un meccanismo di failover personalizzato.If you need high availability for custom components, you must implement your own failover mechanism.

Configurare i componenti personalizzati per l'uso dell'archivio BLOB di AzureConfigure the custom components to use Azure Blob storage

I componenti installati nel cluster possono avere una configurazione predefinita che usa l'archiviazione di Hadoop Distributed File System (HDFS).Components that you install on the cluster might have a default configuration that uses Hadoop Distributed File System (HDFS) storage. HDInsight usa l'archiviazione di Azure o Azure Data Lake Store come risorsa di archiviazione predefinita,HDInsight uses either Azure Storage or Data Lake Store as the default storage. poiché entrambi forniscono un file system compatibile con HDFS che rende permanenti i dati anche se il cluster viene eliminato.Both provide an HDFS compatible file system that persists data even if the cluster is deleted. In alcuni casi, è possibile che sia necessario configurare i componenti installati in modo da usare WASB o ADL anziché HDFS.You may need to configure components you install to use WASB or ADL instead of HDFS.

Per la maggior parte delle operazioni, tuttavia, non è necessario specificare il file system.For most operations, you do not need to specify the file system. Il codice seguente, ad esempio, copia il file giraph-examples.jar dal file system locale alla risorsa di archiviazione del cluster:For example, the following copies the giraph-examples.jar file from the local file system to cluster storage:

hdfs dfs -put /usr/hdp/current/giraph/giraph-examples.jar /example/jars/

In questo esempio, il comando hdfs usa in modo trasparente la risorsa di archiviazione del cluster predefinita.In this example, the hdfs command transparently uses the default cluster storage. Per alcune operazioni, è necessario specificare l'URI,For some operations, you may need to specify the URI. ad esempio adl:///example/jars per Data Lake Store o wasb:///example/jars per l'archiviazione di Azure.For example, adl:///example/jars for Data Lake Store or wasb:///example/jars for Azure Storage.

Scrivere informazioni in STDOUT e STDERRWrite information to STDOUT and STDERR

HDInsight registra l'output dello script scritto in STDOUT e STDERR.HDInsight logs script output that is written to STDOUT and STDERR. È possibile visualizzare queste informazioni tramite l'interfaccia utente Web di Ambari.You can view this information using the Ambari web UI.

Nota

Ambari è disponibile solo se il cluster viene creato correttamente.Ambari is only available if the cluster is successfully created. Se si usa un'azione script durante la creazione del cluster e la creazione ha esito negativo, vedere la sezione relativa alla risoluzione dei problemi nell'articolo Personalizzare cluster HDInsight basati su Linux tramite Azione script che illustra altri modi per accedere alle informazioni registrate.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.

Sebbene la maggior parte delle utilità e dei pacchetti di installazione scriva già le informazioni in STDOUT e STDERR, è possibile aggiungere altre opzioni di registrazione.Most utilities and installation packages already write information to STDOUT and STDERR, however you may want to add additional logging. Per inviare testo a STDOUT, usare echo.To send text to STDOUT, use echo. Ad esempio:For example:

echo "Getting ready to install Foo"

Per impostazione predefinita, echo invia la stringa a STDOUT.By default, echo sends the string to STDOUT. Per indirizzarla a STDERR, aggiungere >&2 prima di echo.To direct it to STDERR, add >&2 before echo. Ad esempio:For example:

>&2 echo "An error occurred installing Foo"

Questo codice reindirizza a STDERR (2) le informazioni scritte in STDOUT.This redirects information written to STDOUT to STDERR (2) instead. Per altre informazioni sul reindirizzamento I/O, vedere http://www.tldp.org/LDP/abs/html/io-redirection.html.For more information on IO redirection, see http://www.tldp.org/LDP/abs/html/io-redirection.html.

Per altre informazioni sulla visualizzazione delle informazioni registrate tramite azioni script, vedere Personalizzare cluster HDInsight basati su Linux tramite Azione scriptFor more information on viewing information logged by script actions, see Customize HDInsight clusters using script action

Salvare i file in formato ASCII con terminazioni di riga LFSave files as ASCII with LF line endings

Gli script Bash devono essere archiviati nel formato ASCII con righe terminate da LF.Bash scripts should be stored as ASCII format, with lines terminated by LF. Se i file vengono archiviati in formato UTF-8 o usano CRLF come terminazione di riga, è possibile che abbiano esito negativo con l'errore seguente: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

Usare la logica di ripetizione dei tentativi per il ripristino da errori temporaneiUse retry logic to recover from transient errors

Quando si scaricano file, l'installazione di pacchetti tramite apt-get o altre azioni che trasmettono dati su Internet, l'azione potrebbe non riuscire a causa di errori di rete temporanei.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. Ad esempio, è possibile che sia in corso il failover a un nodo di backup della risorsa remota con la quale si sta comunicando.For example, the remote resource you are communicating with may be in the process of failing over to a backup node.

Per rendere lo script resiliente agli errori temporanei, è possibile implementare la logica di ripetizione dei tentativi.To make your script resilient to transient errors, you can implement retry logic. La funzione seguente illustra come implementare la logica di ripetizione dei tentativi:The following function demonstrates how to implement retry logic. prima che venga generato l'errore, ripete per tre volte il tentativo di eseguire l'operazione.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
}

Gli esempi seguenti illustrano come usare questa funzione.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

Metodi helper per gli script personalizzatiHelper methods for custom scripts

I metodi helper dell'azione script sono utilità che è possibile usare durante la scrittura di script personalizzati.Script action helper methods are utilities that you can use while writing custom scripts. Questi metodi sono contenuti nello script https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh.These methods are contained in thehttps://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh script. Usare il codice seguente per scaricarli e usarli nell'ambito dello script: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

In uno script personalizzato possono essere usati gli helper seguenti:The following helpers available for use in your script:

Utilizzo dell'helperHelper usage DescrizioneDescription
download_file SOURCEURL DESTFILEPATH [OVERWRITE] Scarica un file dall'URI di origine al percorso file specificato.Downloads a file from the source URI to the specified file path. Per impostazione predefinita, non sovrascrive un file esistente.By default, it does not overwrite an existing file.
untar_file TARFILE DESTDIR Estrae un file TAR (usando -xf) nella directory di destinazione.Extracts a tar file (using -xf) to the destination directory.
test_is_headnode Se viene eseguito su un nodo head del cluster restituisce 1; in caso contrario, 0.If ran on a cluster head node, return 1; otherwise, 0.
test_is_datanode Se il nodo corrente è un nodo dati (di lavoro) restituisce 1; in caso contrario, 0.If the current node is a data (worker) node, return a 1; otherwise, 0.
test_is_first_datanode Se il nodo corrente è il primo nodo dati (di lavoro), denominato workernode0, restituisce 1; in caso contrario, 0.If the current node is the first data (worker) node (named workernode0) return a 1; otherwise, 0.
get_headnodes Restituisce il nome di dominio completo dei nodi head nel cluster.Return the fully qualified domain name of the headnodes in the cluster. I nomi sono delimitati da virgole.Names are comma delimited. In caso di errore, viene restituita una stringa vuota.An empty string is returned on error.
get_primary_headnode Ottiene il nome di dominio completo del nodo head primario.Gets the fully qualified domain name of the primary headnode. In caso di errore, viene restituita una stringa vuota.An empty string is returned on error.
get_secondary_headnode Ottiene il nome di dominio completo del nodo head secondario.Gets the fully qualified domain name of the secondary headnode. In caso di errore, viene restituita una stringa vuota.An empty string is returned on error.
get_primary_headnode_number Ottiene il suffisso numerico del nodo head primario.Gets the numeric suffix of the primary headnode. In caso di errore, viene restituita una stringa vuota.An empty string is returned on error.
get_secondary_headnode_number Ottiene il suffisso numerico del nodo head secondario.Gets the numeric suffix of the secondary headnode. In caso di errore, viene restituita una stringa vuota.An empty string is returned on error.

Modelli di utilizzo comuniCommon usage patterns

Questa sezione fornisce indicazioni sull'implementazione di alcuni dei modelli di utilizzo comuni che si potrebbero riscontrare durante la scrittura dello script personalizzato.This section provides guidance on implementing some of the common usage patterns that you might run into while writing your own custom script.

Passaggio di parametri a uno scriptPassing parameters to a script

In alcuni casi, lo script potrebbe richiedere l'uso di parametri.In some cases, your script may require parameters. Quando si usa l'API REST di Ambari, ad esempio, è possibile che sia necessaria la password amministratore per il cluster.For example, you may need the admin password for the cluster when using the Ambari REST API.

I parametri passati allo script sono noti come parametri posizionali e vengono assegnati a $1 per il primo parametro, a $2 per il secondo e così via.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 contiene il nome dello script stesso.$0 contains the name of the script itself.

I valori passati allo script come parametri devono essere racchiusi tra virgolette singole ('),Values passed to the script as parameters should be enclosed by single quotes ('). in modo che vengano considerati come valori letterali.Doing so ensures that the passed value is treated as a literal.

Impostazioni delle variabili di ambienteSetting environment variables

L'impostazione di una variabile di ambiente viene eseguita con l'istruzione seguente:Setting an environment variable is performed by the following statement:

VARIABLENAME=value

Dove VARIABLENAME è il nome della variabile.Where VARIABLENAME is the name of the variable. Per accedere alla variabile, usare $VARIABLENAME.To access the variable, use $VARIABLENAME. Per assegnare un valore fornito da un parametro posizionale come variabile di ambiente denominata PASSWORD, ad esempio, usare l'istruzione seguente: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

Per il successivo accesso alle informazioni, si potrà quindi usare $PASSWORD.Subsequent access to the information could then use $PASSWORD.

Le variabili di ambiente impostate all'interno dello script sono disponibili solo nell'ambito dello script.Environment variables set within the script only exist within the scope of the script. In alcuni casi può essere necessario aggiungere variabili di ambiente a livello di sistema, che rimarranno persistenti dopo il completamento dello script.In some cases, you may need to add system-wide environment variables that will persist after the script has finished. Per aggiungere variabili di ambiente a livello di sistema, aggiungere la variabile a /etc/environment.To add system-wide environment variables, add the variable to /etc/environment. L'istruzione seguente, ad esempio, aggiunge HADOOP_CONF_DIR:For example, the following statement adds HADOOP_CONF_DIR:

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

Accedere alle posizioni in cui sono archiviati gli script personalizzatiAccess to locations where the custom scripts are stored

Gli script usati per la personalizzazione di un cluster devono essere archiviati in una delle posizioni seguenti:Scripts used to customize a cluster needs to be stored in one of the following locations:

  • Account di archiviazione di Azure associato al cluster.An Azure Storage account that is associated with the cluster.

  • Account di archiviazione aggiuntivo associato al cluster.An additional storage account associated with the cluster.

  • URI leggibile pubblicamente,A publicly readable URI. ad esempio un URL per accedere ai dati archiviati in OneDrive, Dropbox o altri servizi di hosting di file.For example, a URL to data stored on OneDrive, Dropbox, or other file hosting service.

  • Account Azure Data Lake Store associato al cluster HDInsight.An Azure Data Lake Store account that is associated with the HDInsight cluster. Per altre informazioni sull'uso di Azure Data Lake Store con HDInsight, vedere Creare un cluster HDInsight con Data Lake Store.For more information on using Azure Data Lake Store with HDInsight, see Create an HDInsight cluster with Data Lake Store.

    Nota

    L'entità servizio usata da HDInsight per accedere a Data Lake Store deve avere accesso in lettura allo script.The service principal HDInsight uses to access Data Lake Store must have read access to the script.

Anche le risorse usate dallo script devono essere disponibili pubblicamente.Resources used by the script must also be publicly available.

L'archiviazione dei file in un account di archiviazione di Azure o in Azure Data Lake Store ne consentirà l'accesso in tempi rapidi, poiché si trovano entrambi nella rete di Azure.Storing the files in an Azure Storage account or Azure Data Lake Store provides fast access, as both within the Azure network.

Nota

Il formato URI usato per fare riferimento allo script varia a seconda del servizio in uso.The URI format used to reference the script differs depending on the service being used. Per gli account di archiviazione associati al cluster HDInsight, usare wasb:// o wasbs://.For storage accounts associated with the HDInsight cluster, use wasb:// or wasbs://. Per gli URI leggibili pubblicamente, usare http:// o https://.For publicly readable URIs, use http:// or https://. Per Data Lake Store, usare adl://.For Data Lake Store, use adl://.

Verifica della versione del sistema operativoChecking the operating system version

Le diverse versioni di HDInsight si basano su versioni specifiche di Ubuntu.Different versions of HDInsight rely on specific versions of Ubuntu. Ci possono essere differenze tra le versioni del sistema operativo che è necessario verificare nello script.There may be differences between OS versions that you must check for in your script. Può essere ad esempio necessario installare un file binario associato alla versione di Ubuntu.For example, you may need to install a binary that is tied to the version of Ubuntu.

Per verificare la versione del sistema operativo usare lsb_release.To check the OS version, use lsb_release. Lo script seguente, ad esempio, illustra come fare riferimento a uno specifico file tar, in base alla versione del sistema operativo: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 verion is $OS_VERSION. Using hue-binaries-14-04."
    HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
    echo "OS verion is $OS_VERSION. Using hue-binaries-16-04."
    HUE_TARFILE=hue-binaries-16-04.tgz
fi

Elenco di controllo per la distribuzione di un'azione scriptChecklist for deploying a script action

Di seguito sono indicati i passaggi effettuati durante la preparazione della distribuzione degli script:Here are the steps we took when preparing to deploy these scripts:

  • Inserire i file che contengono gli script personalizzati in un percorso accessibile per i nodi del cluster durante la distribuzione,Put the files that contain the custom scripts in a place that is accessible by the cluster nodes during deployment. ad esempio la risorsa di archiviazione predefinita per il cluster.For example, the default storage for the cluster. I file possono essere archiviati anche in servizi di hosting leggibili pubblicamente.Files can also be stored in publicly readable hosting services.
  • Verificare che lo script sia idempotente,Verify that the script is impotent. in modo che possa essere eseguito più volte nello stesso nodo.Doing so allows the script to be executed multiple times on the same node.
  • Usare una directory di file temporanei /tmp per conservare i file scaricati usati dagli script e quindi eliminarli dopo aver eseguito gli script.Use a temporary file directory /tmp to keep the downloaded files used by the scripts and then clean them up after scripts have executed.
  • Nel caso in cui vengano modificate le impostazioni a livello di sistema operativo o i file di configurazione del servizio Hadoop, può essere opportuno riavviare i servizi HDInsight.If OS-level settings or Hadoop service configuration files are changed, you may want to restart HDInsight services.

Come eseguire un'azione scriptHow to run a script action

È possibile usare azioni script per personalizzare i cluster HDInsight adottando uno dei metodi seguenti:You can use script actions to customize HDInsight clusters using the following methods:

  • Portale di AzureAzure portal
  • Azure PowerShellAzure PowerShell
  • Modelli di Gestione risorse di AzureAzure Resource Manager templates
  • HDInsight .NET SDKThe HDInsight .NET SDK.

Per altre informazioni sull'utilizzo di ogni metodo, vedere Come usare azioni script.For more information on using each method, see How to use script action.

Esempi di script personalizzatiCustom script samples

Microsoft fornisce script di esempio per installare i componenti in un cluster HDInsight.Microsoft provides sample scripts to install components on an HDInsight cluster. Vedere i collegamenti seguenti per altre azioni di script di esempio.See the following links for more example script actions.

Risoluzione dei problemiTroubleshooting

Di seguito sono elencati gli errori che potrebbero essere visualizzati quando si usano script personalizzati:The following are errors you may encounter when using scripts you have developed:

Errore: $'\r': command not found.Error: $'\r': command not found. A volte seguito da syntax error: unexpected end of file.Sometimes followed by syntax error: unexpected end of file.

Causa: questo errore si verifica quando le righe di uno script terminano con CRLF.Cause: This error is caused when the lines in a script end with CRLF. I sistemi Unix prevedono unicamente LF come terminazione di riga.Unix systems expect only LF as the line ending.

Questo problema si verifica più spesso quando lo script viene creato in un ambiente Windows, perché CRLF è una terminazione di riga comune per molti editor di testo in Windows.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.

Risoluzione: se nell'editor di testo è disponibile come opzione, selezionare il formato Unix o LF come terminazione di riga.Resolution: If it is an option in your text editor, select Unix format or LF for the line ending. È anche possibile usare i comandi seguenti in un sistema Unix per cambiare CRLF in LF:You may also use the following commands on a Unix system to change the CRLF to an LF:

Nota

I comandi seguenti sono all'incirca equivalenti nel senso che cambiano le terminazioni di riga CRLF in LF.The following commands are roughly equivalent in that they should change the CRLF line endings to LF. Selezionarne uno in base alle utilità disponibili nel proprio sistema.Select one based on the utilities available on your system.

ComandoCommand NoteNotes
unix2dos -b INFILE Viene creata una copia di backup del file originale con estensione BAKThe original file is backed up with a .BAK extension
tr -d '\r' < INFILE > OUTFILE OUTFILE contiene una versione solo con le terminazioni LFOUTFILE contains a version with only LF endings
perl -pi -e 's/\r\n/\n/g' INFILE Modifica direttamente il fileModifies the file directly
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE OUTFILE contiene una versione solo con le terminazioni LF.OUTFILE contains a version with only LF endings.

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

Causa: questo errore si verifica quando lo script è stato salvato in formato UTF-8 con un byte order mark (BOM).Cause: This error occurs when the script was saved as UTF-8 with a Byte Order Mark (BOM).

Risoluzione: salvare il file in formato ASCII o UTF-8 senza un carattere BOM.Resolution: Save the file either as ASCII, or as UTF-8 without a BOM. È anche possibile usare il comando seguente in un sistema Linux o Unix per creare un file senza il carattere BOM: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

Sostituire INFILE con il file contenente il carattere BOM.Replace INFILE with the file containing the BOM. OUTFILE deve essere un nuovo nome di file, contenente lo script senza il carattere BOM.OUTFILE should be a new file name, which contains the script without the BOM.

Passaggi successiviNext steps