Iniziare
This guide covers deploying Ilum on Kubernetes and submitting your first Spark job.
Installation Architecture
Ilum follows a modular architecture where core platform services are separated from optional engines, catalogs, and integrations. The base installation provides:
ilum-core: Main backend (REST API, jobs, multi-engine SQL, lineage, security)ilum-ui: Web frontend (SQL Editor, Table Explorer, Lineage, Workloads)ilum-api: Module-management microservice that installs, upgrades, and disables optional modules at runtime via Helm- Apache Spark 4.x job orchestration on Kubernetes
- DuckDB for local-first SQL analytics, with the DuckLake catalog enabled by default
- Hive Metastore for centralized table metadata
- PostgreSQL as the primary metadata store (MongoDB remains supported for legacy deployments)
- MinIO (default) or RustFS (opt-in; planned default in 6.8.0) S3-compatible object storage. See Object Storage in Ilum.
- Apache Kyuubi SQL gateway for multi-engine query routing
- Marquez for OpenLineage-based data lineage (default-on)
- Giove notebook integration
- REST API for programmatic access
Optional modules enable additional engines, catalogs, and integrations:
- Engines: Trino, Apache Flink
- Cataloghi: Project Nessie, Unity Catalog
- Notebook: JupyterHub (Enterprise), Apache Zeppelin
- Orchestrazione: Apache Airflow, Kestra, Mage, n8n, Apache NiFi
- BI and visualization: Apache Superset, Streamlit
- AI and ML: MLflow, LangFuse
- Osservabilità: Kube Prometheus stack, Loki, Promtail
- Identity: Ory Hydra (Ilum as IdP), OpenLDAP
Resource Planning:
- Base deployment: 8-12 GB RAM, 6 CPU cores
- With Hive Metastore, Marquez lineage, Kyuubi, and PostgreSQL: 18 GB RAM, 12 CPU cores
- Production workloads: Size based on concurrent executor requirements across all enabled engines
Module selection impacts pod count, storage IOPS, and network traffic. Each module runs in dedicated pods with configurable resource limits.
Prerequisiti
Per eseguire Ilum sul tuo computer, avrai bisogno di quanto segue:
Kubernetes Cluster
Ilum deploys exclusively on Kubernetes using Helm charts. Any CNCF-compliant Kubernetes distribution works:
Supported Platforms:
- Local development: Minikube, Microk8s, K3s, Docker Desktop
- Cloud-managed: GKE, EKS, AKS, DigitalOcean Kubernetes
- Self-hosted: K8s on bare metal, OpenShift, Rancher
Architecture Support:
- Multi-arch container images (amd64, arm64)
- Tested on Linux, macOS (M1/M2), Windows WSL2
Quick Local Setup: For development/testing without an existing cluster, use Minikube (Guida all'installazione) or Microk8s (Guida all'installazione).
This guide uses Minikube for examples. Verify installation with:
minikube version
Problemi con Minikube su sistema operativo Windows
Se utilizzi Windows, potresti riscontrare problemi con Minikube relativi al driver.
Su Windows, Minikube può scegliere tra una varietà di driver (host per il cluster Kubernetes), tuttavia, in generale si desidera utilizzare uno dei due Hyper-V o Scaricatore. Se hai installato Docker, è consigliabile utilizzare Minikube con il driver Docker o abilitare il supporto Kubernetes integrato in Docker Desktop.
Se Docker non è disponibile, è consigliabile usare il driver Hyper-V. Per fare ciò, puoi consultare questo guida. Tieni presente che dovrai concedere a Minikube i privilegi di amministratore per interfacciarti con Hyper-V.
kubectl (Logs & Troubleshooting)
Install kubectl to inspect Ilum resources and stream logs.
Install
-
macOS:
brew install kubectl -
Windows:
winget install -e --id Kubernetes.kubectl(or)choco install kubernetes-cli -
Linux:
ricciolo -LO "https://dl.k8s.io/release/$(ricciolo -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -m 0755 kubectl /usr/local/bin/kubectl
Quick use
kubectl get pods -n <ns>
kubectl logs -n <ns> <pod> --all-containers -f
kubectl describe pod -n <ns> <pod>
kubectl get events -n <ns> --sort-by=.lastTimestamp
Timone
Helm è un gestore di pacchetti per Kubernetes che consente di definire, installare e aggiornare le applicazioni Kubernetes. Se non hai ancora installato Helm, puoi trovare le istruzioni qui.
Cluster Resource Allocation
Minikube resource allocation determines available capacity for Spark executors and Ilum services.
Configuration Options:
For full module testing (metadata, lineage, SQL):
Inizio Minikube --cpus 12 --memory 18192 --addons metrics-server
For minimal Spark workloads:
Inizio Minikube --cpus 6 --memory 12288 --addons metrics-server
Le metrics-server addon exposes pod-level CPU/memory metrics to the Ilum UI dashboard.
Minikube Limitations:
- Single-node cluster (no distributed executor scheduling)
- Suitable for functional testing, not performance benchmarks
For production deployments, see Production Setup.
For a streamlined installation experience, you can use the Ilum CLI instead of manual Helm commands. The CLI wraps Helm and kubectl, providing guided setup, module management, and one-command deployment with ilum quickstart. See the CLI Getting Started guide.
Distribuzione Helm
Add the Ilum chart repository:
helm repo Aggiungere ilum https://charts.ilum.cloud
Aggiornamento del repo Helm
Option 1: Data Platform (Recommended)
Includes Hive Metastore for table metadata, the multi-engine SQL gateway (Kyuubi), and OpenLineage data tracking.
helm install ilum ilum/ilum \
--mettere ilum-hive-metastore.enabled=vero \
--mettere ilum-core.metastore.enabled=vero \
--mettere ilum-core.metastore.type=alveare \
--mettere ilum-sql.enabled=vero \
--mettere ilum-core.sql.enabled=vero \
--mettere globale.lineage.enabled=vero
Capabilities enabled:
- Centralized Hive Metastore (compatible with Spark, Trino, DuckDB, Flink)
- Multi-engine SQL execution via Kyuubi (Spark and Trino out of the box; DuckDB available locally)
- Automatic lineage capture via OpenLineage, visualized in Marquez
- Table and column-level lineage in the Ilum UI
Resource overhead: ~8 GB RAM, 6 CPU cores for metadata, lineage, and SQL gateway services.
Option 2: Minimal Deployment
Minimal deployment for development and testing. Includes ilum-core, ilum-ui, ilum-api, Spark 4.x execution, DuckDB, and the DuckLake catalog. No external Hive Metastore or lineage tracking.
helm install ilum ilum/ilum
Use case: Development, testing, ephemeral workloads where table schemas are managed externally.
Option 3: Custom Module Selection
Use the module selector to generate Helm commands with specific integrations (Trino, Nessie, Unity Catalog, Airflow, Superset, MLflow, LangFuse, etc.). Optional modules can also be enabled and disabled at runtime through the in-product Modules registry, which is backed by the ilum-api microservice.
Deployment time: Services typically reach ready state within 2-6 minutes. Monitor with:
kubectl get pods -w
For advanced configuration options, see Helm chart documentation.
Problemi di installazione
In caso di problemi relativi all'installazione di Ilum, sezione di risoluzione dei problemi di visione qui or write us an email ([email protected]).
UI Access
The Ilum web interface provides job management, resource monitoring, and SQL query capabilities.
Default credentials: Admin / Admin
Minikube Service Exposure
minikube servizio ilum-ui
Returns cluster-accessible URL (e.g., http://192.168.49.2:31777).
NodePort (Default)
The UI service is exposed via NodePort on 31777 by default. Find your node IP:
kubectl get nodes -o wide
Access at http://<NODE_IP>:31777.
Port Forwarding (Development)
kubectl port-forward svc/ilum-ui 9777:9777
Access at http://localhost:9777.
Ingress Controller (Production)
For production deployments, configure an Ingress resource with TLS termination. See Ingress configuration guide for details.
Autenticazione:
- Default admin account:
Admin/Admin - Change credentials via Helm values or UI user management
- LDAP/OAuth2 integration available (see Security docs)
Invio di un'applicazione Spark sull'interfaccia utente
New to Ilum? Learn the fastest path from install → first job. Take the official Ilum Course.
Ora che il cluster Kubernetes è configurato per gestire i processi Spark tramite Ilum, è possibile inviare un'applicazione Spark. Per questo esempio, si userà l'esempio "SparkPi" di Spark documentazione. You can download the required JAR file from one of these links:
- Spark 4 (default)
- Spark 3
Spark 4 / Scala 2.13: spark-examples_2.13-4.1.1.jar
Spark 3 / Scala 2.12: spark-examples_2.12-3.5.8.jar
Ilum will create a Spark driver pod using the Spark 4.x docker image. The number of Spark executor pods can be scaled to multiple nodes as per your requirements.

E questo è tutto! Hai configurato correttamente Ilum ed eseguito il tuo primo processo Spark. Sentiti libero di esplorare l'interfaccia utente e l'API di Ilum per l'invio e la gestione delle applicazioni Spark. Per gli approcci tradizionali, è possibile utilizzare anche il familiare scintilla-invio comando.
Processo Spark interattivo con Scala/Java
I processi interattivi in Ilum sono sessioni a esecuzione prolungata in grado di eseguire immediatamente i dati dell'istanza del processo. Ciò è particolarmente utile in quanto non è necessario attendere l'inizializzazione del contesto Spark ogni volta. Se più utenti puntano allo stesso ID processo, interagiranno con lo stesso contesto Spark.
Per abilitare le funzionalità interattive nei processi Spark esistenti, è necessario implementare un'interfaccia semplice per la parte del codice che deve essere interattiva. Ecco come puoi farlo:
Innanzitutto, aggiungi la dipendenza API del processo Ilum al tuo progetto:
Gradle
Implementazione 'cloud.ilum:ilum-job-api:6.3.0'
Intenditore
<dipendenza>
<groupId>cloud.ilumgroupId>
<artifactId>ilum-job-apiartifactId>
<Versione>6.3.0Versione>
dipendenza>
sbt
libraryDependencies += "cloud.ilum" % "ilum-job-api" % "6.3.0"
Quindi, implementa il Lavoro tratto/interfaccia nel processo Spark. Ecco un esempio:
Scala
pacco interattivo.job.example
importazione nuvola.ilum.job.Lavoro
importazione org.apache.scintilla.SQL.Sessione scintilla
classe InteractiveJobExample extends Lavoro {
override def Correre(sparkSession: Sessione scintilla, configurazione: Map[String, Qualunque]): Option[String] = {
val userParam = configurazione.getOrElse("userParam", "Nessuno").toString
Some(s"Hello ${userParam}")
}
}
Giava
pacco interattivo.job.example;
importazione nuvola.ilum.job.Lavoro;
importazione org.apache.scintilla.SQL.Sessione scintilla;
importazione Scala.Option;
importazione Scala.Some;
importazione Scala.collection.immutable.Map;
pubblico classe InteractiveJobExample implements Lavoro {
@Override
pubblico Option<String> Correre(Sessione scintilla sparkSession, Map<String, Object> configurazione) {
String userParam = configurazione.getOrElse("userParam", () -> "Nessuno");
ritorno Some.apply("Hello " + userParam);
}
}
In questo esempio, il metodo Correre viene sovrascritto per accettare un metodo Sessione scintilla e una mappa di configurazione. Recupera un parametro utente dalla mappa di configurazione e restituisce un messaggio di saluto.
Puoi trovare un esempio simile su GitHub.
Seguendo questo modello, è possibile trasformare i processi Spark in processi interattivi in grado di eseguire calcoli immediatamente, migliorando l'interattività dell'utente e riducendo i tempi di attesa.
Processo Spark interattivo con Python
Di seguito è riportato un esempio di come configurare un processo Spark interattivo in Python utilizzando il ilum biblioteca:
-
Configurazione dell'immagine Spark
a) Usare un'immagine Docker da DockerHub
Ogni immagine Spark che forniamo su DockerHub ha già i componenti necessari integrati.b) Installare il
ilumpacco
Se, per qualsiasi motivo, l'immagine Docker non include l'opzioneilumo se si crea un'immagine personalizzata, è possibile installarla (all'interno del contenitore o in locale) eseguendo:pip install ilum-job-api -
Struttura delle mansioni in
ilum\La logica del processo Spark è incapsulata in una classe che estende IlumJob, in particolare all'interno del metodo run
Da ilum.API importazione IlumJob
classe Esempio di PythonSpark(IlumJob):
def Correre(stesso, scintilla, configurazione):
# Logica del lavoro qui
Semplice esempio interattivo di spark pi:
Da aleatorio importazione aleatorio
Da operatore importazione Aggiungere
Da ilum.API importazione IlumJob
classe SparkPiInteractiveExample(IlumJob):
def Correre(stesso, scintilla, configurazione):
Partizioni = Int(configurazione.Ottieni('Partizioni', '5'))
n = 100000 * Partizioni
def is_inside_unit_circle(_: Int) -> galleggiare:
x = aleatorio() * 2 - 1
y = aleatorio() * 2 - 1
ritorno 1.0 se x ** 2 + y ** 2 <= 1 altro 0.0
contare = (
scintilla.sparkContext.parallelizzare(gamma(1, n + 1), Partizioni)
.mappa(is_inside_unit_circle)
.ridurre(Aggiungere)
)
pi_approx = 4.0 * contare / n
ritorno f"Pi è approssimativamente {pi_approx}"
Puoi trovare un esempio simile su GitHub.
Invio di un processo Spark interattivo nell'interfaccia utente
Dopo aver creato un file che contiene il tuo codice Spark, dovrai inviarlo a Ilum. Ecco come puoi farlo:
Apri l'interfaccia utente di Ilum nel tuo browser e crea un nuovo servizio:

Nel Generale tab inserire un nome di un servizio

Nel Memoria Scegli un cluster e configura le impostazioni di memoria

Nel Risorsa Scheda Carica la tua scintilla file

Passeggiata Invia per applicare le modifiche e Ilum creerà automaticamente un pod driver Spark. È possibile regolare il numero di pod dell'executor Spark ridimensionandoli in base alle esigenze.
Quindi, vai alla sezione Carichi per individuare il tuo lavoro. Cliccando sul suo nome, è possibile accedere alla sua visualizzazione dettagliata. Una volta che il contenitore Spark è pronto, è possibile eseguire il processo specificando il nomefile.nomeclasse e definendo eventuali parametri facoltativi in formato JSON.

Ora dobbiamo mettere nomefile.nomeclasse nella Classe archiviata:
Ilum_interactive_spark_pi. SparkPiInteractiveExample
e definisci il parametro slices in formato JSON:
{
"Partizioni": 5
}
Le prime richieste potrebbero richiedere alcuni secondi a causa della fase di inizializzazione, l'una con l'altra sarà immediata.

Seguendo questi passaggi, è possibile inviare ed eseguire processi Spark interattivi utilizzando Ilum. Questa funzionalità fornisce l'elaborazione dei dati in tempo reale, migliora l'interattività dell'utente e riduce il tempo di attesa dei risultati.