Gestione delle dipendenze di Spark in Ilum
Ilum provides three methods to handle dependencies for Spark su Kubernetes, each suited for different use cases ranging from rapid prototyping to stable production environments.
Comparison of Dependency Management Methods
| Method | Ideale per | Persistenza | Startup Speed |
|---|---|---|---|
| Custom Docker Image | Produzione, Large dependencies, Security | High (Immutable) | Fast (Pre-built) |
| Runtime Injection | Testing, PoCs, Small/Transient libs | Medium (Cached) | Slower (Downloads at startup) |
Taccuino pip install | Ad-hoc Experiments, Exploration | None (Session only) | Slowest (Repeated installs) |
1. Dedicated Docker Image (Production Best Practice)
Questo metodo prevede la creazione di un'immagine Docker personalizzata che include tutte le dipendenze necessarie. Garantisce la coerenza tra gli ambienti ed è l'approccio migliore per i carichi di lavoro di produzione.
Passaggi per creare un'immagine Spark personalizzata
- Inizia con l'immagine di base ufficiale di Ilum Spark.
- Aggiungere i file JAR necessari per tutte le dipendenze basate su Java.
- Installa i pacchetti Python richiesti.
- Creare ed eseguire il push dell'immagine in un registro privato o pubblico.
- Configurare Ilum per l'utilizzo di questa nuova immagine.
Esempio: aggiunta del supporto Apache Iceberg
Di seguito è riportato un esempio di Dockerfile che si basa sull'immagine di base di Ilum Spark e aggiunge il supporto per Apache Iceberg:
DA ilum/spark:3.5.8
UTENTE root
# Aggiungi JAR per il supporto Iceberg
AGGIUNGERE 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
# Installa le dipendenze Python
RUN python3 -m pip install pandas pyiceberg[hive,s3fs,pandas,snappy,gcsfs,adlfs]
UTENTE ${spark_uid}
Costruisci e invia l'immagine
Dopo aver scritto il Dockerfile (ad esempio, salvato come Dockerfile nella directory corrente), compilare e inviare l'immagine:
docker build -t myPrivateRepo/spark:3.5.8-iceberg .
docker push myPrivateRepo/spark:3.5.8-iceberg
Configurazione di Ilum per l'utilizzo dell'immagine personalizzata
Quando l'immagine è disponibile in un registro contenitori, aggiornare Ilum per usare questa immagine Spark personalizzata:
- 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/spark:3.5.8-iceberg
During the installation process: Aggiungere questo flag al comando helm install:
--mettere ilum-core.kubernetes.defaultCluster.config.spark\\.kubernetes\\.container\\.image="myPrivateRepo/spark:3.5.8-iceberg"
When submitting a job programmatically, verify the immagine parameter:
ricciolo -X INSERISCI "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)
Passare alla pagina Generale tab of your cluster settings. Locate the Spark Version field and enter your custom image tag (e.g., myPrivateRepo/spark:3.5.8-iceberg).

Option B: Configuration Tab
Passare alla pagina Configurazione tab. Add a new parameter spark.kubernetes.container.image and set its value to your custom image.

Migliori pratiche
- Mantenere tutte le versioni delle dipendenze allineate con la versione di Spark usata.
- Aggiornare regolarmente l'immagine personalizzata per includere le patch di sicurezza e le versioni più recenti delle dipendenze.
- Archiviare le immagini in un registro contenitori affidabile e accessibile.
- Utilizza uno schema di controllo delle versioni per le tue immagini (ad esempio, includi Spark e le versioni delle funzionalità nel tag).
Risoluzione dei problemi
Common Image Issues
| Questione | Soluzione |
|---|---|
| Mancata corrispondenza delle dipendenze | Assicurarsi che tutti i pacchetti JAR e Python siano compatibili con la versione di Spark in uso. |
| Immagine non trovata | Verificare che il nome dell'immagine sia stato inserito nel registro corretto (e che Ilum abbia accesso a tale registro). |
| Il processo non riesce a causa di dipendenze mancanti | Verificare che il processo Spark utilizzi l'immagine personalizzata desiderata (controllare la configurazione dell'immagine in Ilum o il comando 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.
Aggiunta di file Java JAR
Specificare le coordinate Maven per le dipendenze Java utilizzando il pulsante 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 Risorse scheda.

- Navigate to Nuovo lavoro o New Service.
- Vai alla pagina Risorse scheda.
- Scroll to Spark Packages.
- Clic Add Parameter and enter the Maven coordinate (e.g.,
org.apache.hadoop:hadoop-aws:3.3.4).
During the installation process: Aggiungere questo flag al comando helm install:
--mettere 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-scintilla-Runtime-3.5_2.12:1.8.0,org.apache.hadoop:hadoop-aws:3.3.4
Spark scaricherà automaticamente il pacchetto specificato (e le relative dipendenze) da Maven Central o dal repository configurato all'avvio del processo.
Installazione delle dipendenze Python in Ilum
Ilum offre diversi modi per installare le dipendenze Python per i processi Spark e le sessioni Jupyter. A seconda del tuo caso d'uso, puoi scegliere tra:
- 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 Nuovo lavoro o New Service in the Ilum UI (see Running Spark Jobs).
- Individua l'icona Fabbisogno campo sotto il
Risorsescheda. - Immettere le dipendenze Python richieste.
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 Crea sessione form (e.g., via the
%manage_sparkmagic command). - Individua l'icona Pacchetti Extra campo.
- Enter the required packages as a separato da punto e virgola lista:
Pacchetti Extra
Panda; intorpidito; 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:
--mettere ilum-jupyter.sparkmagic.config.sessionConfigs.conf='{"pyRequirements":"pandas;numpy;openai"}'
Post-Install (ConfigMap):
Modificare il ilum-jupyter-config configMap:
dati:
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 Giove o 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

Passi:
- Vai a Ammassi and edit your target cluster (or configured during creation).
- Passare alla pagina Configurazione scheda.
- Add the parameters:
Cluster Parameters
spark.executorEnv.PIP_MODULES=pyspark;pandas;openai
spark.kubernetes.driverEnv.PIP_MODULES=pyspark;pandas;openai
Ogni approccio garantisce che i processi Spark e le sessioni Jupyter dispongano delle dipendenze necessarie installate, in modo da poter Concentrati sull'ingegneria e l'analisi dei dati invece che sulla gestione degli ambienti.
Migliori pratiche
- Utilizzare questo metodo per Test o prova di concetto Lavori; Evitarlo per la produzione a causa del sovraccarico del download delle dipendenze a ogni esecuzione.
- Specify exact versions for packages to ensure reproducibility.
- Combina questo approccio con immagini Docker personalizzate per una migliore coerenza (ad esempio, utilizza Docker per le dipendenze principali e
spark.jars.packagesper alcuni transitori se necessario). - Fai attenzione all'accesso alla rete e alle prestazioni, poiché il download dei pacchetti può rallentare i tempi di avvio.
Risoluzione dei problemi
Common Dependency Issues
| Questione | Soluzione |
|---|---|
| JAR non trovato | 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. Installazione di librerie nei notebook Jupyter con pip install
Per esperimenti interattivi rapidi, è possibile installare librerie all'interno di un notebook Jupyter usando pip. Questo è un modo rapido per testare qualcosa in modo ad-hoc, ma non è raccomandato per nulla che vada oltre l'esplorazione temporanea.
Esempio
Se si esegue una sessione Spark in un notebook Ilum Jupyter e si ha bisogno di un nuovo pacchetto Python, è possibile installarlo in questo modo:
%%scintilla
importazione sottoprocesso
# Install package
risultato = sottoprocesso.check_output(["pip", "installare", "Geopanda"])
Stampare(risultato.decodificare())
# Verify installation
risultato = sottoprocesso.check_output(["pip", "elenco"])
Stampare(risultato.decodificare())
This will install the package in the notebook’s environment so you can use it immediately.
Why It’s Not Recommended
- I pacchetti installati in questo modo sono disponibili solo nella sessione spark corrente.
- L'ambiente non viene mantenuto durante il riavvio della sessione o le nuove sessioni.
- Può causare incoerenze tra l'ambiente di sviluppo e il runtime di produzione di Spark.