Cuando creas un clúster de Managed Service para Apache Spark, puedes especificar acciones de inicialización en ejecutables o secuencias de comandos que Managed Service para Apache Spark ejecutará en todos los nodos de tu clúster de Managed Service para Apache Spark inmediatamente después de que se configure el clúster. A menudo, las acciones de inicialización configuran dependencias de trabajo, como la instalación de paquetes de Python, para que los trabajos puedan enviarse al clúster sin tener que instalar dependencias cuando se ejecutan los trabajos.
Puedes encontrar secuencias de comandos de acciones de inicialización de muestra en las siguientes ubicaciones: Nota: Google no admite estas muestras.
- Repositorio de GitHub
- Cloud Storage: en los buckets públicos
regionales de
gs://goog-dataproc-initialization-actions-REGION
Consideraciones y lineamientos importantes
No crees clústeres de producción que hagan referencia a acciones de inicialización ubicadas en los buckets públicos de
gs://goog-dataproc-initialization-actions-REGION. Estas secuencias de comandos se proporcionan como implementaciones de referencia. Se sincronizan con los cambios en curso del repositorio de GitHub, y las actualizaciones de estos secuencias de comandos pueden interrumpir la creación del clúster. En su lugar, copia la acción de inicialización del bucket público en una carpeta de bucket de Cloud Storage con control de versiones, como se muestra en el siguiente ejemplo: Luego, crea el clúster haciendo referencia a la copia en Cloud Storage:REGION=COMPUTE_REGIONgcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \ gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.shgcloud dataproc clusters create CLUSTER_NAME \ --region=${REGION} \ --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \ ...other flags...Las acciones de inicialización se ejecutan en cada nodo en serie durante la creación del clúster. También se ejecutan en cada nodo agregado cuando se escala o se ajusta la escala automáticamente de los clústeres.
Cuando actualices las acciones de inicialización, por ejemplo, cuando sincronices tus acciones de inicialización de Cloud Storage con los cambios realizados en las acciones de inicialización del bucket público o del repositorio de GitHub, crea una carpeta nueva (preferiblemente con el nombre de la versión) para recibir las acciones de inicialización actualizadas. Si, en cambio, actualizas la acción de inicialización in situ, los nodos nuevos, como los que agrega el escalador automático, ejecutarán la acción de inicialización actualizada in situ, no la acción de inicialización de la versión anterior que se ejecutó en los nodos existentes. Estas diferencias en las acciones de inicialización pueden generar nodos de clúster incoherentes o dañados.
Las acciones de inicialización se ejecutan como el usuario
root. No es necesario que usessudo.Usa rutas de acceso absolutas en las acciones de inicialización.
Usa una línea shebang en las acciones de inicialización para indicar cómo se debe interpretar la secuencia de comandos (como
#!/bin/basho#!/usr/bin/python).Usa finales de línea de estilo Unix (LF) en las acciones de inicialización. Si creas acciones de inicialización en Windows, es posible que contengan finales de línea al estilo de Windows (CRLF), lo que puede causar fallas en la ejecución de la secuencia de comandos.
Si una acción de inicialización termina con un código de salida que no es cero, la operación de creación del clúster presentará un estado de "ERROR". Para depurar la acción de inicialización, usa SSH para conectarte a las instancias de VM del clúster y, luego, examina los registros. Luego de solucionar el problema de la acción de inicialización, puedes borrar y, luego, volver a crear el clúster.
Si creas un clúster de Managed Service para Apache Spark con solo direcciones IP internas, los intentos de acceder a
github.coma través de Internet en una acción de inicialización fallarán, a menos que hayas configurado rutas para dirigir el tráfico a través de Cloud NAT o una Cloud VPN. Sin acceso a Internet, puedes habilitar el Acceso privado a Google y colocar las dependencias de los trabajos en Cloud Storage. Los nodos del clúster pueden descargar las dependencias de Cloud Storage desde las IP internas.Puedes usar imágenes personalizadas de Managed Service para Apache Spark en lugar de acciones de inicialización para configurar las dependencias de los trabajos.
Procesamiento de inicialización:
- Clústeres de imágenes anteriores a la versión 2.0:
- Principal: Para permitir que las acciones de inicialización que se ejecutan en los nodos principales escriban archivos en HDFS, las acciones de inicialización de los nodos principales no se inician hasta que se pueda escribir en HDFS (hasta que HDFS haya salido del modo seguro y se hayan unido al menos dos DataNodes de HDFS).
- Trabajador: Si configuras la
propiedad del clúster
dataproc:dataproc.worker.custom.init.actions.modecomoRUN_BEFORE_SERVICES, cada trabajador ejecuta sus acciones de inicialización antes de iniciar sus daemons de datanode de HDFS y nodemanager de YARN. Dado que Managed Service para Apache Spark no ejecuta acciones de inicialización del nodo principal hasta que se pueda escribir en HDFS, lo que requiere que se ejecuten 2 daemons de nodo de datos de HDFS, configurar esta propiedad puede aumentar el tiempo de creación del clúster.
Clústeres de imágenes posteriores a la versión 2.0:
- Instancia principal: Las acciones de inicialización del nodo principal pueden ejecutarse antes de que se pueda escribir en HDFS. Si ejecutas acciones de inicialización que habilitan por etapas archivos en HDFS o que dependen de la disponibilidad de los servicios dependientes de HDFS, como Ranger, configura la propiedad del clúster
dataproc.master.custom.init.actions.modeenRUN_AFTER_SERVICES. Nota: Dado que este parámetro de configuración de la propiedad puede aumentar el tiempo de creación del clúster, consulta la explicación del retraso en la creación del clúster para los trabajadores del clúster de imágenes anteriores a la versión 2.0, úsalo solo cuando sea necesario (como práctica general, confía en la configuración predeterminada deRUN_BEFORE_SERVICESpara esta propiedad). - Trabajador: La propiedad del clúster
dataproc:dataproc.worker.custom.init.actions.modese establece enRUN_BEFORE_SERVICESy no se puede pasar al clúster cuando se crea (no puedes cambiar la configuración de la propiedad). Cada trabajador ejecuta sus acciones de inicialización antes de iniciar su datanode HDFS y daemons de nodemanager de YARN. Como Managed Service para Apache Spark no espera a que se pueda escribir en HDFS antes de ejecutar las acciones de inicialización del nodo principal, las acciones de inicialización del nodo principal y del trabajador se ejecutan en paralelo.
- Instancia principal: Las acciones de inicialización del nodo principal pueden ejecutarse antes de que se pueda escribir en HDFS. Si ejecutas acciones de inicialización que habilitan por etapas archivos en HDFS o que dependen de la disponibilidad de los servicios dependientes de HDFS, como Ranger, configura la propiedad del clúster
Recomendaciones:
- Usa metadatos para determinar la función de un nodo a fin de ejecutar forma condicional una acción de inicialización en ellos (consulta Usa metadatos del clúster).
- Bifurca una copia de una acción de inicialización en un bucket de Cloud Storage a fin de lograr estabilidad (consulta Cómo se usan las acciones de inicialización).
- Agrega reintentos cuando descargues contenido de Internet para ayudar a estabilizar la acción de inicialización.
- Clústeres de imágenes anteriores a la versión 2.0:
Usa acciones de inicialización
Las acciones de inicialización del clúster se pueden especificar independientemente de cómo creas el clúster:
- A través de la consola de Google Cloud
- Usa la gcloud CLI
- De manera programática con la API clusters.create de Dataproc (consulta NodeInitializationAction)
Consola deGoogle Cloud
gcloud CLI
Cuando crees un clúster con el comando
gcloud dataproc clusters create,
especifica una o más ubicaciones de Cloud Storage (URI) separadas por comas
de los ejecutables o las secuencias de comandos de inicialización con la
marca --initialization-actions. Nota: Varios "/" consecutivos en un URI de ubicación de Cloud Storage después del "gs://" inicial, como "gs://bucket/my//object//name", no son compatibles. Ejecuta
gcloud dataproc clusters create --help para obtener información sobre el comando.
gcloud dataproc clusters create cluster-name \
--region=${REGION} \
--initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
--initialization-action-timeout=timeout-value (default=10m) \
... other flags ...
- Usa la marca
--initialization-action-timeouta fin de especificar un tiempo de espera para la acción de inicialización. El tiempo de espera predeterminado es de 10 minutos. Si el ejecutable o la secuencia de comandos de inicialización no se completaron antes de que finalice el período de tiempo de espera, Managed Service para Apache Spark cancela la acción de inicialización. - Usa la propiedad de clúster
dataproc:dataproc.worker.custom.init.actions.modepara ejecutar la acción de inicialización en los trabajadores principales antes de que se inicien el administrador de nodos y los daemons de datanode.
API de REST
Especifica uno o más ejecutables o secuencias de comandos en un array ClusterConfig.initializationActions como parte de una solicitud a la API clusters.create.
Ejemplo
POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
"projectId": "my-project-id",
"clusterName": "example-cluster",
"config": {
"configBucket": "",
"gceClusterConfig": {
"subnetworkUri": "default",
"zoneUri": "us-central1-b"
},
"masterConfig": {
"numInstances": 1,
"machineTypeUri": "n1-standard-4",
"diskConfig": {
"bootDiskSizeGb": 500,
"numLocalSsds": 0
}
},
"workerConfig": {
"numInstances": 2,
"machineTypeUri": "n1-standard-4",
"diskConfig": {
"bootDiskSizeGb": 500,
"numLocalSsds": 0
}
},
"initializationActions": [
{
"executableFile": "gs://cloud-example-bucket/my-init-action.sh"
}
]
}
}
Pasa argumentos a las acciones de inicialización
Managed Service para Apache Spark establece valores de metadatos especiales para las instancias que se ejecutan en tus clústeres. Puedes configurar tus propios metadatos personalizados como una forma de aplicar argumentos a las acciones de inicialización.
gcloud dataproc clusters create cluster-name \
--region=${REGION} \
--initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
--metadata=name1=value1,name2=value2... \
... other flags ...
Los valores de metadatos se pueden leer dentro de las acciones de inicialización de la siguiente manera:
var1=$(/usr/share/google/get_metadata_value attributes/name1)
Selección de nodos
Si deseas limitar las acciones de inicialización a los nodos principales, de controlador o trabajadores, puedes agregar lógica de selección de nodos a tu ejecutable o secuencia de comandos.
ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
if [[ "${ROLE}" == 'Master' ]]; then
... master specific actions ...
else if [[ "${ROLE}" == 'Driver' ]]; then
... driver specific actions ...
else
... worker specific actions ...
fi
Prepara los objetos binarios
Una situación de inicialización del clúster común es la etapa de pruebas de los binarios de trabajo en un clúster para eliminar la necesidad de habilitar a etapa los binarios cada vez que se envía un trabajo. Por ejemplo, supongamos que la siguiente secuencia de comandos de inicialización se almacena en
gs://my-bucket/download-job-jar.sh, una ubicación de bucket de Cloud Storage:
#!/bin/bash
ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
if [[ "${ROLE}" == 'Master' ]]; then
gcloud storage cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username
fi
La ubicación de esta secuencia de comandos puede pasarse al comando gcloud dataproc clusters create:
gcloud dataproc clusters create my-dataproc-cluster \
--region=${REGION} \
--initialization-actions=gs://my-bucket/download-job-jar.sh
Managed Service para Apache Spark ejecutará esta secuencia de comandos en todos los nodos y, como consecuencia de la lógica de selección de nodos de la secuencia de comandos, descargará el archivo JAR en el nodo principal. Por lo tanto, los trabajos enviados pueden usar el jar previo a la etapa de pruebas:
gcloud dataproc jobs submit hadoop \
--cluster=my-dataproc-cluster \
--region=${REGION} \
--jar=file:///home/username/sessionalize-logs-1.0.jar
Muestras de acciones de inicialización
Las secuencias de comandos de acciones de inicialización de ejemplo de uso frecuente y otras se encuentran en
gs://goog-dataproc-initialization-actions-<REGION>, un buckets público regional de
Cloud Storage, y en un
repositorio de GitHub.
Para contribuir a una secuencia de comandos, revisa el documento CONTRIBUTING.md y, a continuación, presenta una solicitud de extracción.
Logging
El resultado de la ejecución de cada acción de inicialización se registra para cada instancia en /var/log/dataproc-initialization-script-X.log; X es el índice basado en cero de cada secuencia de comandos de acción de inicialización sucesiva. Por ejemplo, si tu clúster tiene dos acciones de inicialización, los resultados se registrarán en /var/log/dataproc-initialization-script-0.log y /var/log/dataproc-initialization-script-1.log.
¿Qué sigue?
Explora las acciones de inicialización de GitHub.