Vous pouvez spécifier une image de conteneur personnalisée à utiliser avec Managed Service pour Apache Spark sur GKE . Votre image de conteneur personnalisée doit utiliser l'une des images Spark de base de Managed Service pour Apache Spark sur GKE .
Utiliser une image de conteneur personnalisée
Pour utiliser une image de conteneur personnalisée Managed Service pour Apache Spark sur GKE, définissez le
spark.kubernetes.container.image property lorsque vous
créez un cluster virtuel Managed Service pour Apache Spark sur GKE
ou envoyez un job Spark au cluster.
- Exemple de création de cluster avec gcloud CLI :
gcloud dataproc clusters gke create "${DP_CLUSTER}" \ --properties=spark:spark.kubernetes.container.image=custom-image \ ... other args ... - Exemple d'envoi de job avec gcloud CLI :
gcloud dataproc jobs submit spark \ --properties=spark.kubernetes.container.image=custom-image \ ... other args ...
Exigences et paramètres des images de conteneurs personnalisées
Images de base
Vous pouvez utiliser les outils docker pour créer des conteneurs Docker personnalisés basés sur l'une des
images Spark de base publiées de Managed Service pour Apache Spark sur GKE .
Utilisateur du conteneur
Managed Service pour Apache Spark sur GKE exécute les conteneurs Spark en tant qu'utilisateur Linux spark avec un
1099 UID et un 1099 GID. 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.
Composants
Java : la variable d'environnement
JAVA_HOMEpointe vers l'emplacement de l'installation Java. La valeur par défaut actuelle est/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64, qui peut être modifiée (pour obtenir des informations à jour, consultez les notes de version de Managed Service pour Apache Spark).- Si vous personnalisez l'environnement Java, assurez-vous que
JAVA_HOMEest défini sur l'emplacement correct et quePATHinclut le chemin d'accès aux binaires.
- Si vous personnalisez l'environnement Java, assurez-vous que
Python : les images Spark de base de Managed Service pour Apache Spark sur GKE sont installées avec Miniconda3 dans
/opt/conda.CONDA_HOMEpointe vers cet emplacement,${CONDA_HOME}/binest inclus dansPATHetPYSPARK_PYTHONest défini sur${CONDA_HOME}/python.Si vous personnalisez Conda, assurez-vous que
CONDA_HOMEpointe vers le répertoire d'accueil de Conda ,${CONDA_HOME}/binest inclus dansPATH, etPYSPARK_PYTHONest défini sur${CONDA_HOME}/python.Vous pouvez installer, supprimer et mettre à jour des packages dans l'environnement de base par défaut, ou créer un environnement, mais il est fortement recommandé que l'environnement inclue tous les packages installés dans l'environnement de base de l'image de conteneur de base.
Si vous ajoutez des modules Python, tels qu'un script Python avec des fonctions utilitaires, à l'image de conteneur, incluez les répertoires de modules dans
PYTHONPATH.
Spark : Spark est installé dans
/usr/lib/spark, etSPARK_HOMEpointe vers cet emplacement. Spark ne peut pas être personnalisé. Si vous le modifiez, l'image de conteneur sera rejetée ou ne fonctionnera pas correctement.Jobs : vous pouvez personnaliser les dépendances des jobs Spark.
SPARK_EXTRA_CLASSPATHdéfinit le classpath supplémentaire pour les processus JVM Spark. Recommandation : placez les fichiers JAR sous/opt/spark/jars, et définissezSPARK_EXTRA_CLASSPATHsur/opt/spark/jars/*.Si vous intégrez le fichier JAR du job dans l'image, le répertoire recommandé est
/opt/spark/job. Lorsque vous envoyez le job, vous pouvez y faire référence avec un chemin d'accès local, par exemplefile:///opt/spark/job/my-spark-job.jar.Connecteur Cloud Storage : le connecteur Cloud Storage est installé dans
/usr/lib/spark/jars.Utilitaires : les packages d'utilitaires
procpsettinisont nécessaires pour exécuter Spark. Ces utilitaires sont inclus dans les images Spark de base. Les images personnalisées n'ont donc pas besoin de les réinstaller.Point d'entrée : Managed Service pour Apache Spark sur GKE ignore toutes les modifications apportées aux primitives
ENTRYPOINTetCMDdans l' image de conteneur.Scripts d'initialisation : vous pouvez ajouter un script d'initialisation facultatif dans
/opt/init-script.sh. Un script d'initialisation peut télécharger des fichiers depuis Cloud Storage, démarrer un proxy dans le conteneur, appeler d'autres scripts et effectuer d'autres tâches de démarrage.Le script de point d'entrée appelle le script d'initialisation avec tous les arguments de ligne de commande (
$@) avant de démarrer le pilote Spark, l'exécuteur Spark et d'autres processus. Le script d'initialisation peut sélectionner le type de processus Spark en fonction du premier argument ($1) : les valeurs possibles incluentspark-submitpour les conteneurs de pilote etexecutorpour les conteneurs d'exécuteur.
Configurations : les configurations Spark se trouvent sous
/etc/spark/conf. La variable d'environnementSPARK_CONF_DIRpointe vers cet emplacement.Ne personnalisez pas les configurations Spark dans l'image de conteneur. Envoyez plutôt toutes les propriétés via l'API Managed Service pour Apache Spark sur GKE pour les raisons suivantes :
- Certaines propriétés, telles que la taille de la mémoire de l'exécuteur, sont déterminées au moment de l'exécution, et non au moment de la création de l'image de conteneur. Elles doivent être injectées par Managed Service pour Apache Spark sur GKE.
- Managed Service pour Apache Spark sur GKE impose des restrictions sur les propriétés fournies par les utilisateurs.
Managed Service pour Apache Spark sur GKE monte les configurations de
configMapdans/etc/spark/confdans le conteneur, en remplaçant les paramètres intégrés dans l'image.
Images Spark de base
Managed Service pour Apache Spark est compatible avec les images de conteneurs Spark de base suivantes :
- Spark 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2
Exemple de création d'image de conteneur personnalisée
Exemple de fichier Dockerfile
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
Créer l'image de conteneur
Exécutez les commandes suivantes dans le répertoire Dockerfile.
- Définissez l'image (par exemple,
us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest) et accédez au répertoire de compilation.IMAGE=custom container image \ BUILD_DIR=$(mktemp -d) \ cd "${BUILD_DIR}" Téléchargez le connecteur BigQuery.
gcloud storage cp \ gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
Créez un exemple de fichier 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() EOFCréez un exemple de script d'initialisation.
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
Créez et transférez l'image.
docker build -t "${IMAGE}" . && docker push "${IMAGE}"