Gestion des dépendances Spark dans Ilum
Ilum provides three methods to handle dependencies for Spark sur Kubernetes , each suited for different use cases ranging from rapid prototyping to stable production environments.
Comparison of Dependency Management Methods
| Method | Best For | Persistence | Startup Speed |
|---|---|---|---|
| Custom Docker Image | Production , Large dependencies, Security | High (Immutable) | Fast (Pre-built) |
| Runtime Injection | Testing, PoCs, Small/Transient libs | Medium (Cached) | Slower (Downloads at startup) |
Carnet de notes pip install | Ad-hoc Experiments, Exploration | None (Session only) | Slowest (Repeated installs) |
1. Dedicated Docker Image (Production Best Practice)
Cette méthode implique la création d’une image Docker personnalisée qui inclut toutes les dépendances requises. Il garantit la cohérence entre les environnements et constitue la meilleure approche pour les charges de travail de production.
Étapes de création d’une image Spark personnalisée
- Commencez par l’image de base officielle d’Ilum Spark.
- Ajoutez les JAR nécessaires pour les dépendances basées sur Java.
- Installez les packages Python requis.
- Créez et transmettez l’image dans un registre privé ou public.
- Configurez Ilum pour utiliser cette nouvelle image.
Exemple : Ajout de la prise en charge d’Apache Iceberg
Vous trouverez ci-dessous un exemple de fichier Dockerfile qui s’appuie sur l’image de base d’Ilum Spark et ajoute la prise en charge d’Apache Iceberg :
DE ilum/spark:3.5.7
UTILISATEUR root
# Ajouter des JAR pour le support d’Iceberg
AJOUTER https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.8.0/iceberg-spark-runtime-3.5_2.12-1.8.0.jar $SPARK_HOME/jars
# Installer les dépendances Python
RUN python3 -m pip install pandas pyiceberg[hive,s3fs,pandas,snappy,gcsfs,adlfs]
UTILISATEUR ${spark_uid}
Construire et pousser l’image
Après avoir écrit le fichier Dockerfile (par exemple, enregistré en tant que Fichier Dockerfile dans le répertoire courant), construisez et poussez l’image :
docker build -t myPrivateRepo/spark:3.5.7-iceberg .
docker push myPrivateRepo/spark:3.5.7-iceberg
Configuration d’ilum pour l’utilisation de l’image personnalisée
Une fois l’image disponible dans un registre de conteneurs, mettez à jour Ilum pour utiliser cette image Spark personnalisée :
- UI (Job & Service)
- Helm (Install Time)
- REST API
- Global Default (Cluster Config)
Per-Job/Service Setting: When submitting a Spark job or Service, specify the image by setting this param:
spark.kubernetes.container.image : myPrivateRepo/étincelle : 3.5.7- iceberg
During the installation process:Ajoutez cet indicateur à votre commande helm install :
--set ilum-core.kubernetes.defaultCluster.config.spark\\.kubernetes\\.container\\.image="myPrivateRepo/spark:3.5.7-iceberg"
When submitting a job programmatically, verify the image parameter:
curl -X POST "http://ilum-core/api/v1/job/submit" \
-F "name=my-custom-job" \
-F "image=registry.example.com/my-team/spark-custom:v1" \
...
You can set the default image for the entire cluster via the UI using one of two methods.
Option A: General Tab (Spark Version)
Accédez à l’icône Généralités tab of your cluster settings. Locate the Spark Version field and enter your custom image tag (e.g., myPrivateRepo/spark:3.5.7-iceberg).

Option B: Configuration Tab
Accédez à l’icône Configuration tab. Add a new parameter spark.kubernetes.container.image and set its value to your custom image.

Bonnes pratiques
- Veillez à ce que toutes les versions de dépendances soient alignées sur la version de Spark utilisée.
- Mettez régulièrement à jour l’image personnalisée pour inclure les correctifs de sécurité et les dernières versions de dépendance.
- Stockez les images dans un registre de conteneurs fiable et accessible.
- Utilisez un schéma de gestion des versions pour vos images (par exemple, incluez les versions Spark et Feature dans la balise).
Dépannage
Common Image Issues
| Émettre | Solution |
|---|---|
| Incompatibilité de dépendance | Assurez-vous que tous les JAR et packages Python sont compatibles avec la version Spark utilisée. |
| Image introuvable | Vérifiez le nom de l’image et qu’elle a été envoyée au bon registre (et qu’Ilum a accès à ce registre). |
| Échec du travail en raison de dépendances manquantes | Vérifiez que le travail Spark utilise l’image personnalisée prévue (vérifiez la configuration de l’image dans Ilum ou la commande spark-submit). |
2. Runtime Injection (Spark Packages & PyPI)
For rapid development and testing, you can add dependencies dynamically using Spark’s configuration. This approach fetches JARs and installs Python packages at startup time.
Ajout de JAR Java
Spécifiez les coordonnées Maven pour les dépendances Java à l’aide de la commande spark.jars.packages configuration.
- UI (Job & Service)
- Helm (Install Time)
- Global Default (Cluster Config)
For individual Jobs or Services, you can add packages directly in the Ressources onglet.

- Navigate to Nouvel emploi ou New Service.
- Rendez-vous dans le Ressources onglet.
- Scroll to Spark Packages.
- Cliquer Add Parameter and enter the Maven coordinate (e.g.,
org.apache.hadoop:hadoop-aws:3.3.4).
During the installation process:Ajoutez cet indicateur à votre commande helm install :
--set ilum-core.kubernetes.defaultCluster.config.spark\\.jars\\.packages="org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.8.0,org.apache.hadoop:hadoop-aws:3.3.4"
To define default packages for all jobs on a cluster, set the property in the Cluster Configuration.
Runtime: Set this in the Cluster Configuration form:
spark.jars.packages : org.apache.iceberg : iceberg - étincelle - Duree - 3.5_2.12 : 1.8.0 , org.apache.hadoop: hadoop- aws: 3.3.4
Spark téléchargera automatiquement le package spécifié (et ses dépendances) à partir de Maven Central ou du référentiel configuré au démarrage de la tâche.
Installation des dépendances Python dans Ilum
Ilum propose plusieurs façons d’installer des dépendances Python pour les travaux Spark et les sessions Jupyter. En fonction de votre cas d’utilisation, vous pouvez choisir entre :
- UI (Job & Service)
- Jupyter Session
- Global Default (Cluster Config)
Ilum makes it easy to add Python dependencies when creating Spark Jobs or Interactive Services directly from the UI. The process is identical for both.

- Navigate to Nouvel emploi ou New Service in the Ilum UI (see Running Spark Jobs).
- Localisez le Exigences sous le
Ressourcesonglet. - Entrez les dépendances Python requises.
Ilum will install these dependencies at runtime before executing the application.
There are two ways to configure dependencies for Jupyter: per-session or globally for all sessions.
Option A: Per-Session (Session Creation Form)
When creating a Jupyter Notebook session, you can specify required Python packages directly in the session creation form.

- Open the Create Session form (e.g., via the
%manage_sparkmagic command). - Localisez le Extra Packageschamp.
- Enter the required packages as a séparé par des points-virgules liste:
Extra Packages
Pandas; numpy ; openai - When the session starts, Ilum will automatically install these libraries.
Option B: Global Default for Jupyter (Helm/ConfigMap)
To define default packages for all Jupyter Spark sessions (but not standard Spark jobs):
Install Time:
--set ilum-jupyter.sparkmagic.config.sessionConfigs.conf='{"pyRequirements":"pandas;numpy;openai"}'
Post-Install (ConfigMap):Modifier le ilum-jupyter-config configMap:
données :
config.json : |
...
{
« session_configs » : {
"conf": { "pyRequirements": "pandas;numpy;openai", ... }
}
}
To define default python packages for ALL Spark applications running on a specific cluster (including Jobs and interactive sessions started by external modules like Jupyter ou Airflow), you need to add environment variables in the Cluster Configuration.
You need to add two properties with the same list of semicolon-separated packages:
spark.executorEnv.PIP_MODULESspark.kubernetes.driverEnv.PIP_MODULES

Escalier:
- Atteindre Clusters and edit your target cluster (or configured during creation).
- Accédez à l’icône Configuration onglet.
- Add the parameters:
Cluster Parameters
spark.executorEnv.PIP_MODULES= pyspark;pandas;openai
spark.kubernetes.driverEnv.PIP_MODULES= pyspark;pandas;openai
Chaque approche garantit que vos travaux Spark et vos sessions Jupyter ont les dépendances nécessaires installées, ce qui vous permet de Concentrez-vous sur l’ingénierie et l’analyse des données plutôt que sur la gestion des environnements.
Bonnes pratiques
- Utilisez cette méthode pour Tests ou preuve de concept Emplois; Évitez-le pour la production en raison de la surcharge des dépendances de téléchargement à chaque exécution.
- Specify exact versions for packages to ensure reproducibility.
- Combinez cette approche avec des images Docker personnalisées pour une meilleure cohérence (par exemple, utilisez Docker pour les dépendances principales et
spark.jars.packagespour quelques transitoires si nécessaire). - Soyez attentif à l’accès au réseau et aux performances, car le téléchargement de packages peut ralentir les temps de démarrage.
Dépannage
Common Dependency Issues
| Émettre | Solution |
|---|---|
| JAR introuvable | Ensure the Maven coordinates (groupId, artifactId, version) are correct. |
| Startup Performance | If startup is slow or OOMs occur, consider baking dependencies into a Docker image. |
3. Installation de bibliothèques dans Jupyter Notebooks avec pip install
Pour des expériences interactives rapides, vous pouvez installer des bibliothèques dans un bloc-notes Jupyter à l’aide de pip. Il s’agit d’un moyen rapide de tester quelque chose de manière ad hoc, mais il n’est pas recommandé pour autre chose qu’une exploration temporaire.
Exemple
Si vous exécutez une session Spark dans un notebook Ilum Jupyter et que vous avez besoin d’un nouveau package Python, vous pouvez l’installer comme suit :
% % étincelle
importation Sous-processus
# Install package
résultat = Sous-processus . check_output ( [ « Pip » , « installer » , « Géopandas » ] )
imprimer ( résultat . décoder ( ) )
# Verify installation
résultat = Sous-processus . check_output ( [ « Pip » , « liste » ] )
imprimer ( résultat . décoder ( ) )
This will install the package in the notebook’s environment so you can use it immediately.
Why It’s Not Recommended
- Les packages installés de cette manière ne sont disponibles que dans la session Spark en cours.
- L’environnement ne persiste pas entre les redémarrages de session ou les nouvelles sessions.
- Cela peut entraîner des incohérences entre votre environnement de développement et le runtime Spark de production.
Bonnes pratiques
- Utilisez cette approche uniquement pour un prototypage rapide et jetable.
- Si vous vous fiez à une bibliothèque installée par pip, ajoutez-la à un fichier d’exigences ou à une image Docker pour la permanence.
- Documentez tous les packages que vous avez dû installer dans le bloc-notes afin de pouvoir mettre à jour votre environnement correctement ultérieurement.
Dépannage
Pip Install Issues
| Émettre | Solution |
|---|---|
| Paquet introuvable | Check spelling and availability on PyPI. |
| Module not found | Try restarting the notebook kernel to reload the environment. |
Frequently Asked Questions (FAQ)
How do I install private Python packages in Spark?
You can install private packages by building a Custom Docker Image (Method 1). During the docker build process, you can pass credentials or use a pip configuration file to authenticate with your private PyPI repository. Alternatively, for runtime injection, you may need to configure a custom pip index URL in your environment, but Docker is more secure for handling credentials.
Should I use Docker or runtime requirements for Spark on Kubernetes?
Pour Production , always use a Docker image. It guarantees that every node (driver and executors) has the exact same environment without the latency and failure risk of installing packages at runtime. Use runtime requirements only for development, testing, or very small, non-critical libraries.
How to add JDBC drivers to Ilum Spark jobs?
JDBC drivers (like PostgreSQL, MySQL, or Snowflake) are best added as JARs. You can either:
- Add the JAR to your Docker image (e.g., in
$SPARK_HOME/jars). - Utiliser
spark.jars.packages(Method 2) to fetch them from Maven Central at runtime (e.g.,org.postgresql:postgresql:42.6.0).
Recommandations finales
- Charges de travail de production : Utilisez un image Docker personnalisée avec toutes les dépendances préinstallées. Cela permet d’obtenir un environnement stable et reproductible avec des temps de démarrage plus rapides.
- Essais ou prototypage : Utiliser
spark.jars.packageset unpyrequirements.txtpour plus de flexibilité. Cela vous permet d’expérimenter rapidement sans créer une nouvelle image, bien que cela puisse entraîner des frais de démarrage. - Expériences interactives : L’installation via les notebooks Jupyter est pratique pour les expériences de courte durée, mais passe toujours à une solution plus robuste (image Docker ou fichier d’exigences) pour tout ce qui doit être enregistré ou exécuté à nouveau.
En suivant ces pratiques, vous pouvez gérer efficacement les dépendances Spark dans Ilum tout en minimisant les problèmes de compatibilité et les erreurs d’exécution.