Dataproc sans serveur pour Spark exécute des charges de travail dans des conteneurs Docker. Le conteneur fournit l'environnement d'exécution pour les processus de pilote et d'exécuteur de la charge de travail. Par défaut, Dataproc sans serveur pour Spark utilise une image de conteneur qui inclut les packages Spark, Java, Python et R par défaut associés à une version d'exécution. L'API Dataproc sans serveur pour les lots Spark vous permet d'utiliser une image de conteneur personnalisée au lieu de l'image par défaut. En règle générale, une image de conteneur personnalisée ajoute des dépendances Java ou Python de charge de travail Spark non fournies par l'image de conteneur par défaut. Important:N'incluez pas Spark dans votre image de conteneur personnalisée. Dataproc sans serveur pour Spark mettra Spark en place dans le conteneur au moment de l'exécution.
Envoyer une charge de travail par lot Spark à l'aide d'une image de conteneur personnalisée
gcloud
Utilisez la commande gcloud dataproc batches submit spark avec l'indicateur --container-image
pour spécifier votre image de conteneur personnalisée lorsque vous envoyez une charge de travail par lot Spark.
gcloud dataproc batches submit spark \ --container-image=custom-image, for example, "gcr.io/my-project-id/my-image:1.0.1" \ --region=region \ --jars=path to user workload jar located in Cloud Storage or included in the custom container \ --class=The fully qualified name of a class in the jar file, such as org.apache.spark.examples.SparkPi \ -- add any workload arguments here
Remarques :
- Custom-image:spécifiez l'image de conteneur personnalisée à l'aide du format d'attribution de nom d'image Container Registry suivant:
{hostname}/{project-id}/{image}:{tag}
, par exemple, "gcr.io/mon-ID-de-projet/mon-image:1.0.1". Remarque:Vous devez héberger votre image de conteneur personnalisée sur Container Registry ou Artifact Registry. (Dataproc sans serveur ne peut pas récupérer de conteneurs à partir d'autres registres). --jars
:spécifiez un chemin d'accès à une charge de travail utilisateur incluse dans votre image de conteneur personnalisée ou située dans Cloud Storage, par exemplefile:///opt/spark/jars/spark-examples.jar
ougs://my-bucket/spark/jars/spark-examples.jar
.- Autres options de commande de lot:vous pouvez ajouter d'autres options de commande de lot facultatives, par exemple pour utiliser un serveur d'historique persistant (PHS). Remarque: Le PHS doit se trouver dans la région dans laquelle vous exécutez des charges de travail par lot.
- Arguments de charge de travail : vous pouvez ajouter des arguments de charge de travail en ajoutant un "--" à la fin de la commande, suivi des arguments de charge de travail.
REST
L'image de conteneur personnalisée est fournie via le champ RuntimeConfig.containerImage dans le cadre d'une requête API batches.create.
L'exemple suivant montre comment utiliser un conteneur personnalisé pour envoyer une charge de travail par lot à l'aide de l'API batches.create de Dataproc sans serveur pour Spark.
Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
- project-id : ID de projet Google Cloud
- region: région
- custom-container-image: spécifiez l'image de conteneur personnalisée à l'aide du format de dénomination d'image Container Registry suivant:
{hostname}/{project-id}/{image}:{tag}
, par exemple, "gcr.io/mon-ID-de-projet/mon-image:1.0.1". Remarque: Vous devez héberger votre conteneur personnalisé sur Container Registry ou Artifact Registry . (Dataproc sans serveur ne peut pas récupérer de conteneurs à partir d'autres registres). jar-uri
: Spécifiez un chemin d'accès à un fichier JAR de charge de travail inclus dans votre image de conteneur personnalisée ou situé dans Cloud Storage, par exemple "/opt/spark/jars/spark-examples.jar" ou "gs:///spark/jars/spark-examples.jar".class
:nom complet d'une classe dans le fichier JAR, par exemple "org.apache.spark.examples.SparkPi".- Autres options:vous pouvez utiliser d'autres champs de ressources de charge de travail par lot. Par exemple, utilisez le champ
sparkBatch.args
pour transmettre des arguments à votre charge de travail (pour en savoir plus, consultez la documentation sur la ressourceBatch
). Pour utiliser un serveur d'historique persistant (PHS), consultez Configurer un serveur d'historique persistant. Remarque: Le PHS doit se trouver dans la région dans laquelle vous exécutez des charges de travail par lot.
Méthode HTTP et URL :
POST https://dataproc.googleapis.com/v1/projects/project-id/locations/region/batches
Corps JSON de la requête :
{ "runtimeConfig":{ "containerImage":"custom-container-image }, "sparkBatch":{ "jarFileUris":[ "jar-uri" ], "mainClass":"class" } }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
{ "name":"projects/project-id/locations/region/batches/batch-id", "uuid":",uuid", "createTime":"2021-07-22T17:03:46.393957Z", "runtimeConfig":{ "containerImage":"gcr.io/my-project/my-image:1.0.1" }, "sparkBatch":{ "mainClass":"org.apache.spark.examples.SparkPi", "jarFileUris":[ "/opt/spark/jars/spark-examples.jar" ] }, "runtimeInfo":{ "outputUri":"gs://dataproc-.../driveroutput" }, "state":"SUCCEEDED", "stateTime":"2021-07-22T17:06:30.301789Z", "creator":"account-email-address", "runtimeConfig":{ "properties":{ "spark:spark.executor.instances":"2", "spark:spark.driver.cores":"2", "spark:spark.executor.cores":"2", "spark:spark.app.name":"projects/project-id/locations/region/batches/batch-id" } }, "environmentConfig":{ "peripheralsConfig":{ "sparkHistoryServerConfig":{ } } }, "operation":"projects/project-id/regions/region/operation-id" }
Créer une image de conteneur personnalisée
Les images de conteneur personnalisées Dataproc sans serveur pour Spark sont des images Docker. Vous pouvez utiliser les outils de compilation d'images Docker pour créer des images de conteneur personnalisées, mais les images doivent respecter certaines conditions pour être compatibles avec Dataproc Serverless for Spark. Les sections suivantes expliquent ces conditions.
Système d'exploitation
Vous pouvez choisir n'importe quelle image de base de système d'exploitation pour votre image de conteneur personnalisée.
Recommandation: Utilisez les images Debian 12 par défaut, par exemple debian:12-slim
, car elles ont été testées pour éviter les problèmes de compatibilité.
Utilitaires
Vous devez inclure les packages d'utilitaires suivants, qui sont nécessaires pour exécuter Spark, dans votre image de conteneur personnalisée:
procps
tini
Pour exécuter XGBoost à partir de Spark (Java ou Scala), vous devez inclure :
libgomp1
Utilisateur du conteneur
Dataproc sans serveur pour Spark exécute les conteneurs en tant qu'utilisateur Linux spark
avec un UID 1099
et un GID 1099
. Les directives USER
définies dans les fichiers Dockerfile d'images de conteneur personnalisées sont ignorées au moment de l'exécution. Utilisez l'UID et le GID pour les autorisations du système de fichiers.
Par exemple, si vous ajoutez un fichier JAR à /opt/spark/jars/my-lib.jar
dans l'image en tant que dépendance de charge de travail, vous devez accorder à l'utilisateur spark
l'autorisation de lecture du fichier.
Streaming d'images
Dataproc sans serveur pour Spark lance normalement une charge de travail nécessitant une image de conteneur personnalisée en téléchargeant l'image entière sur le disque. Cela peut entraîner un retard dans le temps d'initialisation, en particulier pour les clients disposant d'images volumineuses.
Vous pouvez plutôt utiliser le streaming d'images, qui est une méthode permettant d'extraire les données d'image selon les besoins. Cela permet au workload de démarrer sans attendre le téléchargement de l'image entière, ce qui peut améliorer le temps d'initialisation. Pour activer le streaming d'images, vous devez activer l'API Container File System. Vous devez également stocker vos images de conteneur dans Artifact Registry. Le dépôt Artifact Registry doit se trouver dans la même région que votre charge de travail Dataproc ou dans un emplacement multirégional correspondant à la région dans laquelle votre charge de travail est exécutée. Si Dataproc n'est pas compatible avec l'image ou si le service de streaming d'images n'est pas disponible, notre implémentation de streaming télécharge l'image entière.
Notez que les éléments suivants ne sont pas acceptés pour le streaming d'images:
- Images avec des couches vides ou en doubles
- Images qui utilisent le fichier manifeste d'image V2, schéma version 1
Dans ce cas, Dataproc extrait l'image entière avant de démarrer la charge de travail.
Spark
N'incluez pas Spark dans votre image de conteneur personnalisée. Au moment de l'exécution, Dataproc sans serveur pour Spark monte les binaires et les configurations Spark de l'hôte dans le conteneur : les binaires sont montés dans le répertoire /usr/lib/spark
et les configurations sont montées dans le répertoire /etc/spark/conf
. Les fichiers existants de ces répertoires sont remplacés par Dataproc sans serveur pour Spark au moment de l'exécution.
Environnement d'exécution Java
N'incluez pas votre propre environnement d'exécution Java (JRE) dans votre image de conteneur personnalisée. Au moment de l'exécution, Dataproc sans serveur pour Spark monte OpenJDK
de l'hôte dans le conteneur. Si vous incluez un JRE dans votre image de conteneur personnalisée, il sera ignoré.
Packages Java
Vous pouvez inclure des fichiers JAR en tant que dépendances de charge de travail Spark dans votre image de conteneur personnalisée, et vous pouvez définir la variable d'environnement SPARK_EXTRA_CLASSPATH
pour inclure les fichiers JAR. Dataproc sans serveur pour Spark ajoutera la valeur de la variable d'environnement dans le chemin d'accès des processus JVM Spark. Recommandation : placez les fichiers JAR sous le répertoire /opt/spark/jars
et définissez SPARK_EXTRA_CLASSPATH
sur /opt/spark/jars/*
.
Vous pouvez inclure le fichier JAR de la charge de travail dans votre image de conteneur personnalisée, puis la référencer avec un chemin d'accès local lorsque vous envoyez la charge de travail, par exemple file:///opt/spark/jars/my-spark-job.jar
(voir Envoyer une charge de travail par lot Spark à l'aide d'une image de conteneur personnalisée pour obtenir un exemple).
Packages Python
Par défaut, Dataproc sans serveur pour Spark installe Conda à partir de l'hôte dans le répertoire /opt/dataproc/conda
du conteneur au moment de l'exécution.
PYSPARK_PYTHON
est défini sur /opt/dataproc/conda/bin/python
. Son répertoire de base, /opt/dataproc/conda/bin
, est inclus dans PATH
.
Vous pouvez inclure votre environnement Python avec des packages dans un autre répertoire dans votre image de conteneur personnalisée, par exemple dans /opt/conda
, et définir la variable d'environnement PYSPARK_PYTHON
sur /opt/conda/bin/python
.
Votre image de conteneur personnalisée peut inclure d'autres modules Python qui ne font pas partie de l'environnement Python, par exemple des scripts Python avec des fonctions utilitaires.
Définissez la variable d'environnement PYTHONPATH
pour inclure les répertoires où se trouvent les modules.
Environnement R
Vous pouvez personnaliser l'environnement R dans votre image de conteneur personnalisée à l'aide de l'une des options suivantes:
- Utilisez Conda pour gérer et installer les packages R à partir du canal
conda-forge
. - Ajoutez un dépôt R pour le système d'exploitation Linux de votre image de conteneur, puis installez les packages R à l'aide du gestionnaire de paquets du système d'exploitation Linux (voir l'index des paquets du logiciel R).
Lorsque vous utilisez l'une de ces options, vous devez définir la variable d'environnement R_HOME
pour qu'elle pointe vers votre environnement R personnalisé. Exception: Si vous utilisez Conda pour gérer votre environnement R et personnaliser votre environnement Python, vous n'avez pas besoin de définir la variable d'environnement R_HOME
. Elle est automatiquement définie en fonction de la variable d'environnement PYSPARK_PYTHON
.
Exemple de création d'une image de conteneur personnalisée
Cette section inclut des exemples de création d'images de conteneur personnalisées, qui incluent des exemples de Dockerfiles, suivis d'une commande de compilation. Un exemple inclut la configuration minimale requise pour créer une image. L'autre exemple inclut des exemples de configuration supplémentaire, y compris des bibliothèques Python et R.
Configuration minimale
# Recommendation: Use Debian 12. FROM debian:12-slim # Suppress interactive prompts ENV DEBIAN_FRONTEND=noninteractive # Install utilities required by Spark scripts. RUN apt update && apt install -y procps tini libjemalloc2 # Enable jemalloc2 as default memory allocator ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 # Create the 'spark' group/user. # The GID and UID must be 1099. Home directory is required. RUN groupadd -g 1099 spark RUN useradd -u 1099 -g 1099 -d /home/spark -m spark USER spark
Configuration supplémentaire
# Recommendation: Use Debian 12. FROM debian:12-slim # Suppress interactive prompts ENV DEBIAN_FRONTEND=noninteractive # Install utilities required by Spark scripts. RUN apt update && apt install -y procps tini libjemalloc2 # Enable jemalloc2 as default memory allocator ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 # Install utilities required by XGBoost for Spark. RUN apt install -y procps libgomp1 # Install and configure Miniconda3. ENV CONDA_HOME=/opt/miniforge3 ENV PYSPARK_PYTHON=${CONDA_HOME}/bin/python ENV PATH=${CONDA_HOME}/bin:${PATH} ADD https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh . RUN bash Miniforge3-Linux-x86_64.sh -b -p /opt/miniforge3 \ && ${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 --set channel_priority strict # Packages ipython and ipykernel are required if using custom conda and want to # use this container for running notebooks. RUN ${CONDA_HOME}/bin/mamba install ipython ipykernel # Install Conda packages. # # The following packages are installed in the default image. # Recommendation: include all packages. # # Use mamba to quickly install packages. RUN ${CONDA_HOME}/bin/mamba install -n base \ accelerate \ bigframes \ cython \ deepspeed \ evaluate \ fastavro \ fastparquet \ gcsfs \ google-cloud-aiplatform \ 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 \ langchain \ lightgbm \ koalas \ matplotlib \ mlflow \ nltk \ numba \ numpy \ openblas \ orc \ pandas \ pyarrow \ pynvml \ pysal \ pytables \ python \ pytorch-cpu \ regex \ requests \ rtree \ scikit-image \ scikit-learn \ scipy \ seaborn \ sentence-transformers \ sqlalchemy \ sympy \ tokenizers \ transformers \ virtualenv \ xgboost # Install pip packages. RUN ${PYSPARK_PYTHON} -m pip install \ spark-tensorflow-distributor \ torcheval # Install R and R libraries. RUN ${CONDA_HOME}/bin/mamba install -n base \ r-askpass \ r-assertthat \ r-backports \ r-bit \ r-bit64 \ r-blob \ r-boot \ r-brew \ r-broom \ r-callr \ r-caret \ r-cellranger \ r-chron \ r-class \ r-cli \ r-clipr \ r-cluster \ r-codetools \ r-colorspace \ r-commonmark \ r-cpp11 \ r-crayon \ r-curl \ r-data.table \ r-dbi \ r-dbplyr \ r-desc \ r-devtools \ r-digest \ r-dplyr \ r-ellipsis \ r-evaluate \ r-fansi \ r-fastmap \ r-forcats \ r-foreach \ r-foreign \ r-fs \ r-future \ r-generics \ r-ggplot2 \ r-gh \ r-glmnet \ r-globals \ r-glue \ r-gower \ r-gtable \ r-haven \ r-highr \ r-hms \ r-htmltools \ r-htmlwidgets \ r-httpuv \ r-httr \ r-hwriter \ r-ini \ r-ipred \ r-isoband \ r-iterators \ r-jsonlite \ r-kernsmooth \ r-knitr \ r-labeling \ r-later \ r-lattice \ r-lava \ r-lifecycle \ r-listenv \ r-lubridate \ r-magrittr \ r-markdown \ r-mass \ r-matrix \ r-memoise \ r-mgcv \ r-mime \ r-modelmetrics \ r-modelr \ r-munsell \ r-nlme \ r-nnet \ r-numderiv \ r-openssl \ r-pillar \ r-pkgbuild \ r-pkgconfig \ r-pkgload \ r-plogr \ r-plyr \ r-praise \ r-prettyunits \ r-processx \ r-prodlim \ r-progress \ r-promises \ r-proto \ r-ps \ r-purrr \ r-r6 \ r-randomforest \ r-rappdirs \ r-rcmdcheck \ r-rcolorbrewer \ r-rcpp \ r-rcurl \ r-readr \ r-readxl \ r-recipes \ r-recommended \ r-rematch \ r-remotes \ r-reprex \ r-reshape2 \ r-rlang \ r-rmarkdown \ r-rodbc \ r-roxygen2 \ r-rpart \ r-rprojroot \ r-rserve \ r-rsqlite \ r-rstudioapi \ r-rvest \ r-scales \ r-selectr \ r-sessioninfo \ r-shape \ r-shiny \ r-sourcetools \ r-spatial \ r-squarem \ r-stringi \ r-stringr \ r-survival \ r-sys \ r-teachingdemos \ r-testthat \ r-tibble \ r-tidyr \ r-tidyselect \ r-tidyverse \ r-timedate \ r-tinytex \ r-usethis \ r-utf8 \ r-uuid \ r-vctrs \ r-whisker \ r-withr \ r-xfun \ r-xml2 \ r-xopen \ r-xtable \ r-yaml \ r-zip ENV R_HOME=/usr/lib/R # Add extra Python modules. ENV PYTHONPATH=/opt/python/packages RUN mkdir -p "${PYTHONPATH}" # 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}" #Uncomment below and replace EXTRA_JAR_NAME with the jar file name. #COPY "EXTRA_JAR_NAME" "${SPARK_EXTRA_JARS_DIR}" # Create the 'spark' group/user. # The GID and UID must be 1099. Home directory is required. RUN groupadd -g 1099 spark RUN useradd -u 1099 -g 1099 -d /home/spark -m spark USER spark
Commande de compilation
Exécutez la commande suivante dans le répertoire Dockerfile pour créer et transférer l'image personnalisée dans Artifact Registry.
# Build and push the image. gcloud builds submit --region=REGION \ --tag REGION-docker.pkg.dev/PROJECT/REPOSITORY/IMAGE_NAME:IMAGE_VERSION