Vous pouvez spécifier une image de conteneur personnalisée à utiliser avec Dataproc sur GKE . Votre image de conteneur personnalisée doit utiliser l'une des images Spark de base de Dataproc sur GKE.
Utiliser une image de conteneur personnalisée
Pour utiliser une image de conteneur personnalisée Dataproc sur GKE, définissez spark.kubernetes.container.image property
lorsque vous créez un cluster virtuel Dataproc sur GKE ou envoyez une tâche Spark au cluster.
- Exemple de création de cluster avec la CLI gcloud:
gcloud dataproc clusters gke create "${DP_CLUSTER}" \ --properties=spark:spark.kubernetes.container.image=custom-image \ ... other args ...
- Exemple d'envoi d'une tâche avec gcloud CLI:
gcloud dataproc jobs submit spark \ --properties=spark.kubernetes.container.image=custom-image \ ... other args ...
Exigences et paramètres concernant les images de conteneurs personnalisés
Images de base
Vous pouvez utiliser les outils docker
pour créer un docker personnalisé basé sur l'une des images Spark de base publiées pour Dataproc sur GKE.
Utilisateur du conteneur
Dataproc sur GKE exécute les conteneurs Spark en tant qu'utilisateur Linux spark
avec un UID 1099
et un GID 1099
. Utilisez l'UID et le GID pour les autorisations de 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_HOME
pointe vers l'emplacement de l'installation Java. La valeur par défaut actuelle est/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64
, qui est susceptible d'être modifiée (consultez les notes de version de Dataproc pour en savoir plus).- Si vous personnalisez l'environnement Java, assurez-vous que
JAVA_HOME
est défini sur l'emplacement approprié et quePATH
inclut le chemin d'accès aux binaires.
- Si vous personnalisez l'environnement Java, assurez-vous que
Python:Miniconda3 est installé dans
/opt/conda
sur les images Spark de base de Dataproc sur GKE.CONDA_HOME
pointe vers cet emplacement,${CONDA_HOME}/bin
est inclus dansPATH
etPYSPARK_PYTHON
est défini sur${CONDA_HOME}/python
.Si vous personnalisez Conda, assurez-vous que
CONDA_HOME
pointe vers le répertoire d'accueil Conda, que${CONDA_HOME}/bin
est inclus dansPATH
et quePYSPARK_PYTHON
est 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 du conteneur, incluez les répertoires de modules dans
PYTHONPATH
.
Spark:Spark est installé dans
/usr/lib/spark
, etSPARK_HOME
pointe vers cet emplacement. Spark ne peut pas être personnalisé. Si elle est modifiée, l'image du conteneur sera rejetée ou ne fonctionnera pas correctement.Tâches: vous pouvez personnaliser les dépendances des tâches Spark.
SPARK_EXTRA_CLASSPATH
définit le chemin d'accès aux classes supplémentaire pour les processus JVM Spark. Recommandation: placez les pots sous/opt/spark/jars
et définissezSPARK_EXTRA_CLASSPATH
sur/opt/spark/jars/*
.Si vous intégrez le fichier JAR de la tâche dans l'image, le répertoire recommandé est
/opt/spark/job
. Lorsque vous envoyez la tâche, vous pouvez la référencer 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é à l'emplacement
/usr/lib/spark/jars
.Utilitaires: les packages d'utilitaires
procps
ettini
sont requis pour exécuter Spark. Ces utilitaires sont inclus dans les images de base Spark. Par conséquent, les images personnalisées n'ont pas besoin de les réinstaller.Point d'entrée:Dataproc sur GKE ignore toutes les modifications apportées aux primitives
ENTRYPOINT
etCMD
dans l'image du 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 à partir de Cloud Storage, démarrer un proxy dans le conteneur, appeler d'autres scripts et effectuer d'autres tâches de démarrage.Le script 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-submit
pour les conteneurs de pilotes etexecutor
pour les conteneurs d'exécuteurs.
Configs:les configurations Spark se trouvent sous
/etc/spark/conf
. La variable d'environnementSPARK_CONF_DIR
pointe vers cet emplacement.Ne personnalisez pas les configurations Spark dans l'image du conteneur. Envoyez plutôt les propriétés via l'API Dataproc sur GKE pour les raisons suivantes:
- Certaines propriétés, telles que la taille de mémoire de l'exécuteur, sont déterminées au moment de l'exécution, et non au moment de la compilation de l'image du conteneur. Elles doivent être injectées par Dataproc sur GKE.
- Dataproc sur GKE impose des restrictions aux propriétés fournies par les utilisateurs.
Dataproc sur GKE associe les configurations de
configMap
à/etc/spark/conf
dans le conteneur, en ignorant les paramètres intégrés à l'image.
Images de base Spark
Dataproc est compatible avec les images de base de conteneurs Spark suivantes:
- Spark 2.4: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_1.5
- Spark 3.1: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0
Exemple de création d'une 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 passez 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}"