Puedes especificar una imagen de contenedor personalizada para usarla con Dataproc en GKE . Tu imagen de contenedor personalizada debe usar una de las imágenes base de Spark de Dataproc en GKE.
Usar una imagen de contenedor personalizada
Para usar una imagen de contenedor personalizada de Dataproc en GKE, define spark.kubernetes.container.image property cuando crees un clúster virtual de Dataproc en GKE o envíes una tarea de Spark al clúster.
- Ejemplo de creación de clúster con la CLI de gcloud:
gcloud dataproc clusters gke create "${DP_CLUSTER}" \ --properties=spark:spark.kubernetes.container.image=custom-image \ ... other args ... - Ejemplo de envío de un trabajo con la CLI de gcloud:
gcloud dataproc jobs submit spark \ --properties=spark.kubernetes.container.image=custom-image \ ... other args ...
Requisitos y configuración de imágenes de contenedor personalizadas
Imágenes base
Puedes usar las herramientas de docker para crear un Docker personalizado basado en una de las imágenes base de Spark publicadas de Dataproc en GKE.
Usuario de contenedor
Dataproc en GKE ejecuta contenedores de Spark como el usuario de Linux spark con un UID 1099 y un GID 1099. Usa el UID y el GID para los permisos del sistema de archivos.
Por ejemplo, si añade un archivo JAR en /opt/spark/jars/my-lib.jar en la imagen
como dependencia de carga de trabajo, debe dar al usuario spark permiso de lectura para el archivo.
Componentes
Java: la variable de entorno
JAVA_HOMEapunta a la ubicación de la instalación de Java. El valor predeterminado actual es/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64, que puede cambiar (consulta las notas de las versiones de Dataproc para obtener información actualizada).- Si personalizas el entorno de Java, asegúrate de que
JAVA_HOMEesté configurado en la ubicación correcta y de quePATHincluya la ruta a los archivos binarios.
- Si personalizas el entorno de Java, asegúrate de que
Python: las imágenes base de Spark de Dataproc en GKE tienen instalado Miniconda3 en
/opt/conda.CONDA_HOMEapunta a esta ubicación,${CONDA_HOME}/binse incluye enPATHyPYSPARK_PYTHONse asigna a${CONDA_HOME}/python.Si personalizas Conda, asegúrate de que
CONDA_HOMEapunte al directorio principal de Conda,${CONDA_HOME}/binse incluya enPATHyPYSPARK_PYTHONse defina como${CONDA_HOME}/python..Puedes instalar, quitar y actualizar paquetes en el entorno base predeterminado o crear un entorno nuevo, pero es muy recomendable que el entorno incluya todos los paquetes instalados en el entorno base de la imagen de contenedor base.
Si añades módulos de Python, como una secuencia de comandos de Python con funciones de utilidad, a la imagen de contenedor, incluye los directorios de módulos en
PYTHONPATH.
Spark: Spark se instala en
/usr/lib/sparkySPARK_HOMEapunta a esta ubicación. Spark no se puede personalizar. Si se cambia, la imagen del contenedor se rechazará o no funcionará correctamente.Tareas: puedes personalizar las dependencias de las tareas de Spark.
SPARK_EXTRA_CLASSPATHdefine la classpath adicional para los procesos de JVM de Spark. Recomendación: coloca los frascos debajo de/opt/spark/jarsy defineSPARK_EXTRA_CLASSPATHcomo/opt/spark/jars/*.Si insertas el archivo JAR de trabajo en la imagen, el directorio recomendado es
/opt/spark/job. Cuando envíes el trabajo, podrás hacer referencia a él con una ruta local, por ejemplo,file:///opt/spark/job/my-spark-job.jar.Conector de Cloud Storage: el conector de Cloud Storage se instala en
/usr/lib/spark/jars.Utilidades: se necesitan los paquetes de utilidades
procpsytinipara ejecutar Spark. Estas utilidades se incluyen en las imágenes base de Spark, por lo que no es necesario volver a instalarlas en las imágenes personalizadas.Punto de entrada: Dataproc en GKE ignora los cambios que se hagan en las primitivas
ENTRYPOINTyCMDde la imagen de contenedor.Secuencias de comandos de inicialización: puedes añadir una secuencia de comandos de inicialización opcional en
/opt/init-script.sh. Una secuencia de comandos de inicialización puede descargar archivos de Cloud Storage, iniciar un proxy en el contenedor, llamar a otras secuencias de comandos y realizar otras tareas de inicio.La secuencia de comandos del punto de entrada llama a la secuencia de comandos de inicialización con todos los argumentos de la línea de comandos (
$@) antes de iniciar el controlador de Spark, el ejecutor de Spark y otros procesos. La secuencia de comandos de inicialización puede seleccionar el tipo de proceso de Spark en función del primer argumento ($1). Los valores posibles sonspark-submitpara los contenedores de controladores yexecutorpara los contenedores de ejecutores.
Configuraciones: las configuraciones de Spark se encuentran en
/etc/spark/conf. La variable de entornoSPARK_CONF_DIRapunta a esta ubicación.No personalices las configuraciones de Spark en la imagen del contenedor. En su lugar, envíe las propiedades a través de la API Dataproc en GKE por los siguientes motivos:
- Algunas propiedades, como el tamaño de la memoria del ejecutor, se determinan en el tiempo de ejecución, no en el tiempo de compilación de la imagen del contenedor. Dataproc en GKE debe insertarlas.
- Dataproc en GKE restringe las propiedades proporcionadas por los usuarios.
Dataproc en GKE monta configuraciones de
configMapen/etc/spark/confen el contenedor, lo que anula los ajustes insertados en la imagen.
Imágenes base de Spark
Dataproc admite las siguientes imágenes de contenedor base de Spark:
- Spark 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2
Compilación de imagen de contenedor personalizado de ejemplo
Dockerfile de ejemplo
FROM us-central1-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0:latest
# Change to root temporarily so that it has permissions to create dirs and copy
# files.
USER root
# Add a BigQuery connector jar.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}" \
&& chown spark:spark "${SPARK_EXTRA_JARS_DIR}"
COPY --chown=spark:spark \
spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"
# Install Cloud Storage client Conda package.
RUN "${CONDA_HOME}/bin/conda" install google-cloud-storage
# Add a custom Python file.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"
# Add an init script.
COPY --chown=spark:spark init-script.sh /opt/init-script.sh
# (Optional) Set user back to `spark`.
USER spark
Crear la imagen de contenedor
Ejecuta los siguientes comandos en el directorio Dockerfile
- Define la imagen (por ejemplo,
us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest) y cambia al directorio de compilación.IMAGE=custom container image \ BUILD_DIR=$(mktemp -d) \ cd "${BUILD_DIR}" Descarga el conector de BigQuery.
gcloud storage cp \ gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
Crea un archivo de ejemplo de Python.
cat >test_util.py <<'EOF' def hello(name): print("hello {}".format(name))
def read_lines(path): with open(path) as f: return f.readlines() EOFCrea un ejemplo de secuencia de comandos init.
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
Crea y envía la imagen.
docker build -t "${IMAGE}" . && docker push "${IMAGE}"