Vai al contenuto principale

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

MethodIdeale perPersistenzaStartup Speed
Custom Docker ImageProduzione, Large dependencies, SecurityHigh (Immutable)Fast (Pre-built)
Runtime InjectionTesting, PoCs, Small/Transient libsMedium (Cached)Slower (Downloads at startup)
Taccuino pip installAd-hoc Experiments, ExplorationNone (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

  1. Inizia con l'immagine di base ufficiale di Ilum Spark.
  2. Aggiungere i file JAR necessari per tutte le dipendenze basate su Java.
  3. Installa i pacchetti Python richiesti.
  4. Creare ed eseguire il push dell'immagine in un registro privato o pubblico.
  5. 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:

Dockerfile
DA ilum/spark:3.5.8

UTENTE root

# Aggiungi JAR per il supporto Iceberg
AGGIUNGERE --chmod=644 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:

Build and Push Image
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:

Per-Job/Service Setting: When submitting a Spark job or Service, specify the image by setting this param:

Configurazione
spark.kubernetes.container.image: myPrivateRepo/spark:3.5.8-iceberg

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
QuestioneSoluzione
Mancata corrispondenza delle dipendenzeAssicurarsi che tutti i pacchetti JAR e Python siano compatibili con la versione di Spark in uso.
Immagine non trovataVerificare 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 mancantiVerificare 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.

For individual Jobs or Services, you can add packages directly in the Risorse scheda.

Adding Spark Packages in UI

  • 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).

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:

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.

Adding Python dependencies to Spark Job in Ilum UI

  • Navigate to Nuovo lavoro o New Service in the Ilum UI (see Running Spark Jobs).
  • Individua l'icona Fabbisogno campo sotto il Risorse scheda.
  • Immettere le dipendenze Python richieste.

Ilum will install these dependencies at runtime before executing the application.

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.packages per 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
QuestioneSoluzione
JAR non trovatoEnsure the Maven coordinates (groupId, artifactId, version) are correct.
Startup PerformanceIf 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:

notebook.ipynb
%%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.

  • 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.

Migliori pratiche

  • Utilizzare questo approccio solo per la prototipazione rapida e usa e getta.
  • Se ci si trova a fare affidamento su una libreria installata in pip, aggiungerla a un file dei requisiti o a un'immagine Docker per la permanenza.
  • Documentare tutti i pacchetti che è stato necessario installare nel notebook in modo da poter aggiornare correttamente l'ambiente in un secondo momento.

Risoluzione dei problemi

Pip Install Issues
QuestioneSoluzione
Pacchetto non trovatoCheck spelling and availability on PyPI.
Module not foundTry 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?

Per Produzione, 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:

  1. Add the JAR to your Docker image (e.g., in $SPARK_HOME/jars).
  2. Usare spark.jars.packages (Method 2) to fetch them from Maven Central at runtime (e.g., org.postgresql:postgresql:42.6.0).

Raccomandazioni finali

  • Carichi di lavoro di produzione: Utilizzare un immagine Docker personalizzata con tutte le dipendenze preinstallate. Ciò produce un ambiente stabile e riproducibile con tempi di avvio più rapidi.
  • Test o prototipazione: Usare spark.jars.packages e un pyrequirements.txt per la flessibilità. In questo modo è possibile sperimentare rapidamente senza creare una nuova immagine, anche se potrebbe comportare un sovraccarico di avvio.
  • Esperimenti interattivi: L'installazione tramite notebook Jupyter è comoda per esperimenti di breve durata, ma passa sempre a una soluzione più robusta (immagine Docker o file dei requisiti) per tutto ciò che deve essere salvato o eseguito di nuovo.

Seguendo queste procedure, è possibile gestire in modo efficiente le dipendenze di Spark in Ilum, riducendo al minimo i problemi di compatibilità e gli errori di runtime.