Personnaliser l'environnement d'exécution de votre tâche Spark avec Docker sur YARN

La fonctionnalité Docker sur YARN de Dataproc vous permet de créer et d'utiliser une image Docker pour personnaliser l'environnement d'exécution de votre job Spark. L'image peut inclure des personnalisations des dépendances Java, Python et R, ainsi que de votre fichier JAR de tâche.

Limites

La disponibilité ou la compatibilité de la fonctionnalité n'est pas disponible avec:

  • Versions d'image Dataproc antérieures à 2.0.49 (non disponibles dans les images 1.5)
  • Tâches MapReduce (compatibles uniquement avec les tâches Spark)
  • Mode client Spark (compatible uniquement avec le mode cluster Spark)
  • Clusters Kerberos : la création de cluster échoue si vous créez un cluster avec Docker sur YARN et que Kerberos est activé.
  • Personnalisations du JDK, de Hadoop et de Spark: le JDK hôte, Hadoop et Spark sont utilisés, et non vos personnalisations.

Créer une image Docker

La première étape pour personnaliser votre environnement Spark consiste à créer une image Docker.

Dockerfile

Vous pouvez utiliser le Dockerfile suivant comme exemple, en apportant des modifications et des ajouts en fonction de vos besoins.

FROM debian:10-slim

# Suppress interactive prompts.
ENV DEBIAN_FRONTEND=noninteractive

# Required: Install utilities required by Spark scripts.
RUN apt update && apt install -y procps tini

# Optional: Add extra jars.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}"
COPY *.jar "${SPARK_EXTRA_JARS_DIR}"

# Optional: Install and configure Miniconda3.
ENV CONDA_HOME=/opt/miniconda3
ENV PYSPARK_PYTHON=${CONDA_HOME}/bin/python
ENV PYSPARK_DRIVER_PYTHON=${CONDA_HOME}/bin/python

ENV PATH=${CONDA_HOME}/bin:${PATH}
COPY Miniconda3-py39_4.10.3-Linux-x86_64.sh .
RUN bash Miniconda3-py39_4.10.3-Linux-x86_64.sh -b -p /opt/miniconda3 \
  && ${CONDA_HOME}/bin/conda config --system --set always_yes True \
  && ${CONDA_HOME}/bin/conda config --system --set auto_update_conda False \
  && ${CONDA_HOME}/bin/conda config --system --prepend channels conda-forge \
  && ${CONDA_HOME}/bin/conda config --system --set channel_priority strict

# Optional: Install Conda packages.
#
# The following packages are installed in the default image. It is strongly
# recommended to include all of them.
#
# Use mamba to install packages quickly.
RUN ${CONDA_HOME}/bin/conda install mamba -n base -c conda-forge \
    && ${CONDA_HOME}/bin/mamba install \
      conda \
      cython \
      fastavro \
      fastparquet \
      gcsfs \
      google-cloud-bigquery-storage \
      google-cloud-bigquery[pandas] \
      google-cloud-bigtable \
      google-cloud-container \
      google-cloud-datacatalog \
      google-cloud-dataproc \
      google-cloud-datastore \
      google-cloud-language \
      google-cloud-logging \
      google-cloud-monitoring \
      google-cloud-pubsub \
      google-cloud-redis \
      google-cloud-spanner \
      google-cloud-speech \
      google-cloud-storage \
      google-cloud-texttospeech \
      google-cloud-translate \
      google-cloud-vision \
      koalas \
      matplotlib \
      nltk \
      numba \
      numpy \
      openblas \
      orc \
      pandas \
      pyarrow \
      pysal \
      pytables \
      python \
      regex \
      requests \
      rtree \
      scikit-image \
      scikit-learn \
      scipy \
      seaborn \
      sqlalchemy \
      sympy \
      virtualenv

# Optional: Add extra Python modules.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# Required: Create the 'yarn_docker_user' group/user.
# The GID and UID must be 1099. Home directory is required.
RUN groupadd -g 1099 yarn_docker_user
RUN useradd -u 1099 -g 1099 -d /home/yarn_docker_user -m yarn_docker_user
USER yarn_docker_user

Créer et transférer l'image

Vous trouverez ci-dessous les commandes permettant de créer et de transférer l'exemple d'image Docker. Vous pouvez apporter des modifications en fonction de vos personnalisations.

# Increase the version number when there is a change to avoid referencing
# a cached older image. Avoid reusing the version number, including the default
# `latest` version.
IMAGE=gcr.io/my-project/my-image:1.0.1

# Download the BigQuery connector.
gcloud storage cp \
  gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .

# Download the Miniconda3 installer.
wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh

# Python module example:
cat >test_util.py <<EOF
def hello(name):
  print("hello {}".format(name))

def read_lines(path):
  with open(path) as f:
    return f.readlines()
EOF

# Build and push the image.
docker build -t "${IMAGE}" .
docker push "${IMAGE}"

Créer un cluster Dataproc

Après avoir créé une image Docker qui personnalise votre environnement Spark, créez un cluster Dataproc qui utilisera votre image Docker lors de l'exécution de jobs Spark.

gcloud

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --image-version=DP_IMAGE \
    --optional-components=DOCKER \
    --properties=dataproc:yarn.docker.enable=true,dataproc:yarn.docker.image=DOCKER_IMAGE \
    other flags

Remplacez les éléments suivants :

  • CLUSTER_NAME: nom du cluster.
  • REGION: région du cluster.
  • DP_IMAGE: la version de l'image Dataproc doit être 2.0.49 ou ultérieure (--image-version=2.0 utilisera une version mineure qualifiée ultérieure à 2.0.49).
  • --optional-components=DOCKER: active le composant Docker sur le cluster.
  • Option --properties :
    • dataproc:yarn.docker.enable=true: propriété requise pour activer la fonctionnalité Docker Dataproc sur YARN.
    • dataproc:yarn.docker.image: propriété facultative que vous pouvez ajouter pour spécifier votre DOCKER_IMAGE à l'aide du format de dénomination d'image Container Registry suivant : {hostname}/{project-id}/{image}:{tag}.

      Exemple :

      dataproc:yarn.docker.image=gcr.io/project-id/image:1.0.1
      

      Exigence:Vous devez héberger votre image Docker sur Container Registry ou Artifact Registry. (Dataproc ne peut pas récupérer de conteneurs à partir d'autres registres).

      Recommandation:Ajoutez cette propriété lorsque vous créez votre cluster pour mettre en cache votre image Docker et éviter les délais avant expiration YARN plus tard lorsque vous envoyez une tâche qui utilise l'image.

Lorsque dataproc:yarn.docker.enable est défini sur true, Dataproc met à jour les configurations Hadoop et Spark pour activer la fonctionnalité Docker sur YARN dans le cluster. Par exemple, spark.submit.deployMode est défini sur cluster, et spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS et spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS sont définis pour installer des répertoires de l'hôte dans le conteneur.

Envoyer une tâche Spark au cluster

Après avoir créé un cluster Dataproc, envoyez une tâche Spark au cluster qui utilise votre image Docker. L'exemple de cette section envoie une tâche PySpark au cluster.

Définissez les propriétés de la tâche:

# Set the Docker image URI.
IMAGE=(e.g., gcr.io/my-project/my-image:1.0.1)

# Required: Use `#` as the delimiter for properties to avoid conflicts.
JOB_PROPERTIES='^#^'

# Required: Set Spark properties with the Docker image.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=${IMAGE}"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=${IMAGE}"

# Optional: Add custom jars to Spark classpath. Don't set these properties if
# there are no customizations.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.driver.extraClassPath=/opt/spark/jars/*"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executor.extraClassPath=/opt/spark/jars/*"

# Optional: Set custom PySpark Python path only if there are customizations.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.pyspark.python=/opt/miniconda3/bin/python"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.pyspark.driver.python=/opt/miniconda3/bin/python"

# Optional: Set custom Python module path only if there are customizations.
# Since the `PYTHONPATH` environment variable defined in the Dockerfile is
# overridden by Spark, it must be set as a job property.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.yarn.appMasterEnv.PYTHONPATH=/opt/python/packages"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executorEnv.PYTHONPATH=/opt/python/packages"

Remarques :

gcloud

Envoyez la tâche au cluster.

gcloud dataproc jobs submit pyspark PYFILE \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=${JOB_PROPERTIES}

Remplacez les éléments suivants :

  • PYFILE: chemin d'accès au fichier de tâche PySpark. Il peut s'agir d'un chemin d'accès à un fichier local ou de l'URI du fichier dans Cloud Storage (gs://BUCKET_NAME/PySpark filename).
  • CLUSTER_NAME: nom du cluster.
  • REGION: région du cluster.