Vous pouvez spécifier une image de conteneur personnalisé à utiliser avec Dataproc sur GKE . Votre image de conteneur personnalisé doit utiliser l'un des packages Dataproc sur GKE images Spark de base.
Utiliser une image de conteneur personnalisée
Pour utiliser une image de conteneur personnalisé Dataproc sur GKE, définissez le
spark.kubernetes.container.image property
lorsque vous
Créer un cluster virtuel Dataproc sur GKE
ou envoyer un job Spark au cluster.
- Exemple de création de cluster gcloud CLI:
gcloud dataproc clusters gke create "${DP_CLUSTER}" \ --properties=spark:spark.kubernetes.container.image=custom-image \ ... other args ...
- Exemple d'envoi de tâche de la 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 un Docker personnalisé basé sur l'un des
les images Spark de base Dataproc sur GKE publiées ;
Utilisateur du conteneur
Dataproc sur GKE exécute les conteneurs Spark en tant qu'utilisateur Linux spark
avec un
UID 1099
et GID 1099
. 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 sur le fichier.
Composants
Java:la variable d'environnement
JAVA_HOME
pointe vers l'emplacement Installation de Java. La valeur par défaut actuelle est/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64
, susceptible d'être modifié (consultez les Notes de version de Dataproc pour les mises à jour informations).- Si vous personnalisez l'environnement Java, assurez-vous que
JAVA_HOME
est défini sur l'emplacement approprié etPATH
inclut le chemin d'accès aux binaires.
- Si vous personnalisez l'environnement Java, assurez-vous que
Python:Dataproc sur GKE Images Spark de base Miniconda3 doit être installé à l'adresse
/opt/conda
.CONDA_HOME
pointe vers ce résultat zone géographique,${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 ,${CONDA_HOME}/bin
est inclus dansPATH
, etPYSPARK_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 nous vous recommandons vivement inclure 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 du module dans
PYTHONPATH
.
Spark:Spark est installé dans
/usr/lib/spark
, etSPARK_HOME
pointe vers pour cet établissement. Impossible de personnaliser Spark. En cas de modification, le conteneur sera rejetée ou ne fonctionnera pas correctement.Jobs: vous pouvez personnaliser les dépendances de jobs Spark.
SPARK_EXTRA_CLASSPATH
définit classpath supplémentaire pour les processus JVM Spark. Recommandation: placez les bocaux sous/opt/spark/jars
, puis définissezSPARK_EXTRA_CLASSPATH
sur/opt/spark/jars/*
.Si vous intégrez le fichier JAR du job à l'image, le répertoire recommandé est le suivant :
/opt/spark/job
Lorsque vous envoyez le job, vous pouvez le référencer avec une balise chemin d'accès local, par exemple,file:///opt/spark/job/my-spark-job.jar
.Connecteur Cloud Storage:connecteur Cloud Storage est installé dans
/usr/lib/spark/jars
.Utilitaires: les packages utilitaires
procps
ettini
sont nécessaires pour exécuter Spark. Ces utilitaires sont inclus dans des images Spark de base, de sorte que les images personnalisées n'ont pas besoin réinstallez-les.Point d'entrée:Dataproc sur GKE ignore les les modifications apportées aux primitives
ENTRYPOINT
etCMD
dans le à l'aide d'une image de conteneur.Scripts d'initialisation:vous pouvez ajouter un script d'initialisation facultatif sous
/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 opérations tâches.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. Script d'initialisation Possibilité de sélectionner le type de processus Spark basé sur le premier argument ($1
): les valeurs possibles incluentspark-submit
pour les conteneurs de pilotes etexecutor
pour les conteneurs d'exécuteur.
Configurations: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 de conteneur. À la place, envoyer des propriétés via l'API Dataproc sur GKE pour 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 Dataproc sur GKE .
- Dataproc sur GKE impose des restrictions sur les propriétés fournies par les utilisateurs.
Dataproc sur GKE installe les configurations de
configMap
dans/etc/spark/conf
dans le conteneur, remplaçant ainsi les paramètres intégrés dans l'image.
Images Spark de base
Dataproc est compatible avec les images de conteneur Spark de base 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 compilation d'image de conteneur personnalisé
Exemple de 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éfinir l'image (exemple:
us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest
) et passer 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 fichier d'exemple 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 init.
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
Compilez et transférez l'image.
docker build -t "${IMAGE}" . && docker push "${IMAGE}"