Desarrollo de la acción de script con HDInsightScript action development with HDInsight

Obtenga información sobre cómo personalizar su clúster de HDInsight mediante scripts de Bash.Learn how to customize your HDInsight cluster using Bash scripts. Las acciones de script son una forma de personalizar HDInsight durante la creación del clúster o después de crearlo.Script actions are a way to customize HDInsight during or after cluster creation.

¿Qué son las acciones de script?What are script actions

Las acciones de script son scripts de Bash que Azure ejecuta en los nodos del clúster para realizar cambios de configuración o instalar software.Script actions are Bash scripts that Azure runs on the cluster nodes to make configuration changes or install software. Una acción de script se ejecuta como raíz y proporciona derechos de acceso completo a los nodos del clúster.A script action is executed as root, and provides full access rights to the cluster nodes.

Se puede aplicar una acción de script a través de los métodos siguientes:Script actions can be applied through the following methods:

Use este método para aplicar un script...Use this method to apply a script... Durante la creación del clúster...During cluster creation... En un clúster en ejecución...On a running cluster...
Azure PortalAzure portal
Azure PowerShellAzure PowerShell
CLI de Azure clásicaAzure Classic CLI  
SDK .NET de HDInsightHDInsight .NET SDK
Plantilla de Azure Resource ManagerAzure Resource Manager Template  

Para más información sobre el uso de estos métodos para aplicar acciones de script, consulte Personalización de clústeres de HDInsight mediante la acción de scripts (Linux).For more information on using these methods to apply script actions, see Customize HDInsight clusters using script actions.

Prácticas recomendadas para el desarrollo de scriptsBest practices for script development

Al desarrollar un script personalizado para un clúster de HDInsight, hay varios procedimientos recomendados que hay que tener en cuenta:When you develop a custom script for an HDInsight cluster, there are several best practices to keep in mind:

Importante

Las acciones de script se tienen que completar dentro de un período de sesenta minutos o se producirá un error en el proceso.Script actions must complete within 60 minutes or the process fails. Durante el aprovisionamiento del nodo, el script se ejecuta simultáneamente con otros procesos de instalación y configuración.During node provisioning, the script runs concurrently with other setup and configuration processes. La competición por los recursos, como el ancho de banda de red o el tiempo de CPU puede ocasionar que el script tarde más en terminar que en el entorno de desarrollo.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.

Concentrarse en la versión de Apache HadoopTarget the Apache Hadoop version

Las distintas versiones de HDInsight tienen distintas versiones de componentes y servicios de Hadoop instalados.Different versions of HDInsight have different versions of Hadoop services and components installed. Si su script espera una versión específica de un servicio o componente, debe usar solamente el script con la versión de HDInsight que incluye los componentes necesarios.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. Puede encontrar información sobre las versiones de los componentes incluidos con HDInsight mediante el documento Versiones de HDInsight y componentes .You can find information on component versions included with HDInsight using the HDInsight component versioning document.

Comprobación de la versión del sistema operativoChecking the operating system version

Las distintas versiones de HDInsight se basan en versiones específicas de Ubuntu.Different versions of HDInsight rely on specific versions of Ubuntu. Puede haber diferencias entre las versiones del sistema operativo que debe comprobar en el script.There may be differences between OS versions that you must check for in your script. Por ejemplo, debe instalar un archivo binario que esté asociado a la versión de Ubuntu.For example, you may need to install a binary that is tied to the version of Ubuntu.

Para comprobar la versión del sistema operativo, use lsb_release.To check the OS version, use lsb_release. Por ejemplo, el script siguiente muestra cómo hacer referencia a un archivo tar específico en función de la versión 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 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

Seleccionar la versión del sistema operativoTarget the operating system version

HDInsight basado en Linux utiliza como cimientos la distribución de Ubuntu Linux.Linux-based HDInsight is based on the Ubuntu Linux distribution. Las distintas versiones de HDInsight se basan en diferentes versiones de Ubuntu, que podrían cambiar el funcionamiento del script.Different versions of HDInsight rely on different versions of Ubuntu, which may change how your script behaves. Por ejemplo, HDInsight 3.4 y versiones anteriores se basan en versiones de Ubuntu que emplean Upstart.For example, HDInsight 3.4 and earlier are based on Ubuntu versions that use Upstart. La versión 3.5 y superiores se basan en Ubuntu 16.04, que utiliza Systemd.Versions 3.5 and greater are based on Ubuntu 16.04, which uses Systemd. Systemd y Upstart se basan en comandos diferentes, por lo que debe escribirse el script para usar los dos.Systemd and Upstart rely on different commands, so your script should be written to work with both.

Otra diferencia importante entre HDInsight 3.4 y 3.5 es que JAVA_HOME ahora apunta a Java 8.Another important difference between HDInsight 3.4 and 3.5 is that JAVA_HOME now points to Java 8. El código siguiente demuestra cómo determinar si el script se ejecuta en 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 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

Puede encontrar el script completo que contiene estos fragmentos de código en 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.

Para la versión de Ubuntu que usa HDInsight, lea el documento sobre la versión del componente de HDInsight.For the version of Ubuntu that is used by HDInsight, see the HDInsight component version document.

Para entender las diferencias entre Systemd y Upstart, consulte el artículo sobre Systemd para usuarios de Upstart.To understand the differences between Systemd and Upstart, see Systemd for Upstart users.

Proporcionar vínculos estables a los recursos de scriptProvide stable links to script resources

El script y los recursos asociados deben permanecer disponibles durante la vigencia del clúster.The script and associated resources must remain available throughout the lifetime of the cluster. Estos recursos son necesarios si se agregan nodos nuevos al clúster durante operaciones de escalado.These resources are required if new nodes are added to the cluster during scaling operations.

La práctica recomendada es descargar y archivar todo el contenido de una cuenta de Azure Storage en su suscripción.The best practice is to download and archive everything in an Azure Storage account on your subscription.

Importante

La cuenta de almacenamiento usada tiene que ser la cuenta de almacenamiento predeterminada del clúster o un contenedor público de solo lectura en cualquier otra cuenta de almacenamiento.The storage account used must be the default storage account for the cluster or a public, read-only container on any other storage account.

Por ejemplo, los ejemplos proporcionados por Microsoft se almacenan en la cuenta de almacenamiento 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. Esta ubicación es un contenedor público de solo lectura mantenido por el equipo de HDInsight.This location is a public, read-only container maintained by the HDInsight team.

Usar recursos compilados previamenteUse pre-compiled resources

Para minimizar el tiempo necesario para ejecutar el script, evite las operaciones que compilan recursos a partir del código fuente.To reduce the time it takes to run the script, avoid operations that compile resources from source code. Por ejemplo, compile previamente los recursos y almacénelos en un blob de cuenta de Azure Storage en el mismo centro de datos en que está HDInsight.For example, pre-compile resources and store them in an Azure Storage account blob in the same data center as HDInsight.

Asegurarse de que el script de personalización del clúster es idempotenteEnsure that the cluster customization script is idempotent

Los scripts deben ser idempotentes.Scripts must be idempotent. Si el script se ejecuta varias veces, debe devolver el clúster al mismo estado cada vez.If the script runs multiple times, it should return the cluster to the same state every time.

Por ejemplo, un script que modifique los archivos de configuración no debería agregar entradas duplicadas si se ejecuta varias veces.For example, a script that modifies configuration files should not add duplicate entries if ran multiple times.

Asegurar una alta disponibilidad de la arquitectura de clústerEnsure high availability of the cluster architecture

Los clústeres de HDInsight basados en Linux proporcionan dos nodos principales que están activos dentro del clúster, y las acciones de script se ejecutan en ambos nodos.Linux-based HDInsight clusters provide two head nodes that are active within the cluster, and script actions run on both nodes. Si los componentes instalados esperan únicamente un nodo principal, no instale los componentes en ambos nodos principales.If the components you install expect only one head node, do not install the components on both head nodes.

Importante

Los servicios proporcionados como parte de HDInsight están diseñados para conmutar por error entre los dos nodos principales según sea necesario.Services provided as part of HDInsight are designed to fail over between the two head nodes as needed. Esta funcionalidad no se extiende a componentes personalizados instalados mediante acciones de script.This functionality is not extended to custom components installed through script actions. Si necesita una disponibilidad elevada en componentes personalizados, deberá implementar su propio mecanismo de conmutación por error.If you need high availability for custom components, you must implement your own failover mechanism.

Configurar los componentes personalizados para usar el almacenamiento de blobs de AzureConfigure the custom components to use Azure Blob storage

Los componentes que instaló en el clúster podrían tener una configuración predeterminada que usa el almacenamiento Sistema de archivos distribuido de Apache Hadoop (HDFS).Components that you install on the cluster might have a default configuration that uses Apache Hadoop Distributed File System (HDFS) storage. HDInsight usa Azure Storage o Data Lake Storage como almacén predeterminado.HDInsight uses either Azure Storage or Data Lake Storage as the default storage. Ambas soluciones proporcionan un sistema de archivos compatible con HDFS que conserva los datos incluso si se elimina el clúster.Both provide an HDFS compatible file system that persists data even if the cluster is deleted. Podría tener que configurar los componentes instalados para que usen WASB o ADL en lugar de HDFS.You may need to configure components you install to use WASB or ADL instead of HDFS.

En la mayoría de las operaciones, no es necesario especificar el sistema de archivos.For most operations, you do not need to specify the file system. Por ejemplo, lo siguiente copia el archivo hadoop-common.jar del sistema de archivos local a un almacenamiento de clúster: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/

En este ejemplo, el comando hdfs usa de forma transparente el almacenamiento de clúster predeterminado.In this example, the hdfs command transparently uses the default cluster storage. En algunas operaciones debe especificar el URI.For some operations, you may need to specify the URI. Por ejemplo, adl:///example/jars para Azure Data Lake Storage Gen1, abfs:///example/jars para Data Lake Storage Gen2 o wasb:///example/jars para Azure Storage.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.

Escribir información en STDOUT y STDERRWrite information to STDOUT and STDERR

HDInsight registra el resultado del script que se escribe en STDOUT y STDERR.HDInsight logs script output that is written to STDOUT and STDERR. Puede ver esta información mediante la interfaz de usuario de Ambari web.You can view this information using the Ambari web UI.

Nota

Apache Ambari solo estará disponible si el clúster se ha creado correctamente.Apache Ambari is only available if the cluster is successfully created. Si usa una acción de script durante la creación del clúster y se produce un error, consulte la sección de solución de problemas Personalización de clústeres de HDInsight mediante la acción de scripts (Linux) para conocer otras formas de acceder a la información registrada.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.

La mayoría de las utilidades y paquetes de instalación escriben información en STDOUT y STDERR, pero puede que desee agregar un registro adicional.Most utilities and installation packages already write information to STDOUT and STDERR, however you may want to add additional logging. Para enviar texto a STDOUT, use echo.To send text to STDOUT, use echo. Por ejemplo:For example:

echo "Getting ready to install Foo"

De forma predeterminada, echo enviará la cadena a STDOUT.By default, echo sends the string to STDOUT. Para dirigirla a STDERR, agregue >&2 antes de echo.To direct it to STDERR, add >&2 before echo. Por ejemplo:For example:

>&2 echo "An error occurred installing Foo"

Esto redirige la información escrita en STDOUT a STDERR (2).This redirects information written to STDOUT to STDERR (2) instead. Para obtener más información sobre el redireccionamiento de E/S, consulte 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.

Para obtener más información sobre la visualización de información registrada por las acciones de script, consulte Personalización de clústeres de HDInsight mediante la acción de scripts (Linux)For more information on viewing information logged by script actions, see Customize HDInsight clusters using script action

Guardar los archivos como ASCII con el fin de línea LFSave files as ASCII with LF line endings

Los scripts de Bash deben almacenarse con formato ASCII, con líneas terminadas con LF.Bash scripts should be stored as ASCII format, with lines terminated by LF. Los archivos que se almacenan como UTF-8 o usan CRLF como el final de línea pueden generar el error siguiente: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

Utilizar la lógica de reintento para recuperarse de errores transitoriosUse retry logic to recover from transient errors

Al descargar archivos, instalar paquetes mediante apt-get o realizar otras acciones que transmiten datos por Internet, se puede producir un error en la acción debido a errores de red transitorios.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. Por ejemplo, puede suceder que el recurso remoto con el que se está comunicando esté a punto de conmutar por error a un nodo de copia de seguridad.For example, the remote resource you are communicating with may be in the process of failing over to a backup node.

Para que el script sea resistente a los errores transitorios, puede implementar la lógica de reintento.To make your script resilient to transient errors, you can implement retry logic. La siguiente función muestra cómo implementar la lógica de reintentos.The following function demonstrates how to implement retry logic. Vuelve a intentar la operación tres veces antes de desistir.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
}

En los ejemplos siguientes se muestra cómo utilizar esta función.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

Métodos auxiliares para scripts personalizadosHelper methods for custom scripts

Los métodos auxiliares de la acción de script son utilidades que puede usar al escribir scripts personalizados.Script action helper methods are utilities that you can use while writing custom scripts. Estos métodos se encuentran en el script https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh.These methods are contained in the https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh script. Para descargar y usarlos como parte de su 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

Los siguientes asistentes están disponibles para su uso en el script:The following helpers available for use in your script:

Uso del asistenteHelper usage DESCRIPCIÓNDescription
download_file SOURCEURL DESTFILEPATH [OVERWRITE] Descarga un archivo del URI de origen en la ruta de acceso de archivo especificada.Downloads a file from the source URI to the specified file path. De forma predeterminada, no sobrescribirá un archivo existente.By default, it does not overwrite an existing file.
untar_file TARFILE DESTDIR Extrae un archivo tar (mediante -xf) en el directorio de destino.Extracts a tar file (using -xf) to the destination directory.
test_is_headnode Si se ejecutaba en un nodo principal del clúster, devuelve 1. En caso contrario, devuelve 0.If ran on a cluster head node, return 1; otherwise, 0.
test_is_datanode Si el nodo actual es un nodo de datos (trabajo), devuelve 1. En caso contrario, devuelve 0.If the current node is a data (worker) node, return a 1; otherwise, 0.
test_is_first_datanode Si el nodo actual es el primer nodo (trabajo) de datos (llamado workernode0), devuelve 1. En caso contrario, devuelve 0.If the current node is the first data (worker) node (named workernode0) return a 1; otherwise, 0.
get_headnodes Devuelve el nombre de dominio completo de los nodos principales del clúster.Return the fully qualified domain name of the headnodes in the cluster. Los nombres están delimitados por comas.Names are comma delimited. En caso de error, se devuelve una cadena vacía.An empty string is returned on error.
get_primary_headnode Obtiene el nombre de dominio completo del nodo principal primario.Gets the fully qualified domain name of the primary headnode. En caso de error, se devuelve una cadena vacía.An empty string is returned on error.
get_secondary_headnode Obtiene el nombre de dominio completo del nodo principal secundario.Gets the fully qualified domain name of the secondary headnode. En caso de error, se devuelve una cadena vacía.An empty string is returned on error.
get_primary_headnode_number Obtiene el sufijo numérico del nodo principal primario.Gets the numeric suffix of the primary headnode. En caso de error, se devuelve una cadena vacía.An empty string is returned on error.
get_secondary_headnode_number Obtiene el sufijo numérico del nodo principal secundario.Gets the numeric suffix of the secondary headnode. En caso de error, se devuelve una cadena vacía.An empty string is returned on error.

Patrones de uso comúnCommon usage patterns

Esta sección proporciona instrucciones sobre cómo implementar algunos de los patrones de uso común que podría encontrar mientras escribe su propio script personalizado.This section provides guidance on implementing some of the common usage patterns that you might run into while writing your own custom script.

Paso de parámetros a un scriptPassing parameters to a script

En algunos casos, un script puede requerir parámetros.In some cases, your script may require parameters. Por ejemplo, puede que necesite la contraseña de administrador para el clúster si utiliza la API REST de Ambari.For example, you may need the admin password for the cluster when using the Ambari REST API.

Los parámetros que se pasan al script se conocen como parámetros posicionales, y se asignan a $1 para el primer parámetro, $2 para el segundo y así sucesivamente.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 el nombre del script.$0 contains the name of the script itself.

Los valores se pasan al script como parámetros deben estar rodeados de comillas simples (').Values passed to the script as parameters should be enclosed by single quotes ('). De este modo, se garantiza que el valor pasado se trate literalmente.Doing so ensures that the passed value is treated as a literal.

Establecimiento de variables de entornoSetting environment variables

La instrucción siguiente establece una variable de entorno:Setting an environment variable is performed by the following statement:

VARIABLENAME=value

Donde VARIABLENAME es el nombre de la variable.Where VARIABLENAME is the name of the variable. Para obtener acceso a la variable, use $VARIABLENAME.To access the variable, use $VARIABLENAME. Por ejemplo, para asignar un valor proporcionado por un parámetro posicional como una variable de entorno denominada PASSWORD, use esta instrucción: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

Para el acceso posterior a la información puede usar $PASSWORD.Subsequent access to the information could then use $PASSWORD.

Las variables de entorno establecidas dentro del script solo existen en el ámbito del script.Environment variables set within the script only exist within the scope of the script. En algunos casos, puede que necesite agregar variables de entorno de todo el sistema que se conserven una vez finalizado el script.In some cases, you may need to add system-wide environment variables that will persist after the script has finished. Para agregar variables de entorno de todo el sistema, agregue la variable a /etc/environment.To add system-wide environment variables, add the variable to /etc/environment. Por ejemplo, la instrucción siguiente agrega HADOOP_CONF_DIR:For example, the following statement adds HADOOP_CONF_DIR:

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

Acceso a ubicaciones donde se almacenan los scripts personalizadosAccess to locations where the custom scripts are stored

Los scripts usados para personalizar un clúster deben almacenarse en una de las siguientes ubicaciones:Scripts used to customize a cluster needs to be stored in one of the following locations:

  • Una cuenta de Azure Storage asociada con el clúster.An Azure Storage account that is associated with the cluster.

  • Una cuenta de almacenamiento adicional asociada con el clúster.An additional storage account associated with the cluster.

  • Un URI legible públicamente.A publicly readable URI. Por ejemplo, una dirección URL a los datos almacenados en OneDrive, Dropbox u otro servicio de hospedaje de archivo.For example, a URL to data stored on OneDrive, Dropbox, or other file hosting service.

  • Una cuenta de Azure Data Lake Storage que esté asociada con el clúster de HDInsight.An Azure Data Lake Storage account that is associated with the HDInsight cluster. Para más información sobre el uso de Azure Data Lake Storage con HDInsight, consulte Inicio rápido: Configuración de clústeres en HDInsight.For more information on using Azure Data Lake Storage with HDInsight, see Quickstart: Set up clusters in HDInsight.

    Nota

    La entidad de servicio que HDInsight usa para acceder a Data Lake Storage debe tener acceso de lectura al script.The service principal HDInsight uses to access Data Lake Storage must have read access to the script.

Los recursos utilizados por el script también deben estar disponibles públicamente.Resources used by the script must also be publicly available.

Almacenar los archivos en una cuenta de Azure Storage o Azure Data Lake Storage proporciona un acceso rápido, ya que ambas soluciones están dentro de la red de Azure.Storing the files in an Azure Storage account or Azure Data Lake Storage provides fast access, as both within the Azure network.

Nota

El formato de URI que se use para hacer referencia al script difiere en función del servicio que se utilice.The URI format used to reference the script differs depending on the service being used. Para las cuentas de almacenamiento asociadas con el clúster de HDInsight, use wasb:// o wasbs://.For storage accounts associated with the HDInsight cluster, use wasb:// or wasbs://. Para los URI legibles públicamente, use http:// o https://.For publicly readable URIs, use http:// or https://. Para Data Lake Storage, use adl://.For Data Lake Storage, use adl://.

Lista de comprobación para implementar una acción de scriptChecklist for deploying a script action

Estos son los pasos que se llevan a cabo al prepararse para implementar un script:Here are the steps take when preparing to deploy a script:

  • Coloque los archivos que contengan los scripts personalizados en un lugar que sea accesible por los nodos del clúster durante la implementación.Put the files that contain the custom scripts in a place that is accessible by the cluster nodes during deployment. Por ejemplo, el almacenamiento predeterminado para el clúster.For example, the default storage for the cluster. Los archivos también se pueden almacenar en servicios de hospedaje visibles públicamente.Files can also be stored in publicly readable hosting services.
  • Compruebe que el script sea idempotente.Verify that the script is idempotent. De ese modo, se permite el script que se ejecute varias veces en el mismo nodo.Doing so allows the script to be executed multiple times on the same node.
  • Use un directorio de archivo temporal /tmp para conservar los archivos descargados que usan los scripts y, a continuación, y realice una limpieza una vez que se ejecuten los scripts.Use a temporary file directory /tmp to keep the downloaded files used by the scripts and then clean them up after scripts have executed.
  • Si se cambia la configuración del nivel de sistema operativo o los archivos de configuración de servicio de Hadoop, debería reiniciar los servicios de HDInsight.If OS-level settings or Hadoop service configuration files are changed, you may want to restart HDInsight services.

Ejecución de una acción de scriptHow to run a script action

Puede usar acciones de script para personalizar los clústeres de HDInsight con los métodos siguientes:You can use script actions to customize HDInsight clusters using the following methods:

  • Portal de AzureAzure portal
  • Azure PowerShellAzure PowerShell
  • Plantillas del Administrador de recursos de AzureAzure Resource Manager templates
  • El SDK de .NET para HDInsight.The HDInsight .NET SDK.

Para obtener más información sobre el uso de cada método, consulte Personalización de clústeres de HDInsight mediante la acción de scripts (Linux).For more information on using each method, see How to use script action.

Ejemplos de scripts personalizadosCustom script samples

Microsoft proporciona scripts de ejemplo para instalar los componentes en un clúster de HDInsight.Microsoft provides sample scripts to install components on an HDInsight cluster. Consulte los vínculos siguientes para ver más acciones de script de ejemplo.See the following links for more example script actions.

solución de problemasTroubleshooting

Estos son errores que pueden producirse al usar los scripts desarrollados:The following are errors you may encounter when using scripts you have developed:

Error: $'\r': command not found.Error: $'\r': command not found. A veces seguido de syntax error: unexpected end of file.Sometimes followed by syntax error: unexpected end of file.

Causa: este error se produce si las líneas en un script terminan con CRLF.Cause: This error is caused when the lines in a script end with CRLF. Los sistemas UNIX esperan solo LF como final de la línea.Unix systems expect only LF as the line ending.

Este problema suele producirse cuando se crea el script en un entorno Windows, ya que CRLF es una línea común final para muchos editores de texto en 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.

Resolución: si es una opción en el editor de texto, seleccione formato UNIX o LF para el final de la línea.Resolution: If it is an option in your text editor, select Unix format or LF for the line ending. También puede usar los siguientes comandos en un sistema UNIX para cambiar un CRLF por un LF:You may also use the following commands on a Unix system to change the CRLF to an LF:

Nota

Los siguientes comandos son aproximadamente equivalentes en que deben cambiar los finales de línea CRLF a LF.The following commands are roughly equivalent in that they should change the CRLF line endings to LF. Seleccione uno en función de las utilidades disponibles en el sistema.Select one based on the utilities available on your system.

Get-HelpCommand NotasNotes
unix2dos -b INFILE Se realizará una copia de seguridad del archivo original con una extensión .BAKThe original file is backed up with a .BAK extension
tr -d '\r' < INFILE > OUTFILE OUTFILE contendrá una versión con finales de línea solo LFOUTFILE contains a version with only LF endings
perl -pi -e 's/\r\n/\n/g' INFILE Modifica el archivo directamenteModifies the file directly
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE OUTFILE contendrá una versión con finales de línea solo LF.OUTFILE contains a version with only LF endings.

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

Causa: este error se produce cuando el script se guarda como UTF-8 con una marca BOM (Byte Order Mark).Cause: This error occurs when the script was saved as UTF-8 with a Byte Order Mark (BOM).

Resolución: guarde el archivo como ASCII o UTF-8 sin una marca BOM.Resolution: Save the file either as ASCII, or as UTF-8 without a BOM. También puede usar el siguiente comando en un sistema Linux o UNIX para crear un archivo sin marca 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

Reemplace INFILE con el archivo que contiene la marca BOM.Replace INFILE with the file containing the BOM. OUTFILE debe ser un nombre de archivo nuevo, que contendrá el script sin la marca BOM.OUTFILE should be a new file name, which contains the script without the BOM.

Pasos siguientesNext steps