Run Spark Submit (spark-submit) on Kubernetes
Un semplice lavoro Spark in Ilum funziona esattamente come uno inviato tramite lo standard scintilla-invio , ma con ulteriori miglioramenti per facilità d'uso, configurazione e integrazione con strumenti esterni.
È possibile utilizzare il file JAR con esempi di Spark dall'installazione locale di Spark o da qualsiasi file JAR personalizzato.
Di seguito è riportata una guida passo passo per configurare ed eseguire un semplice processo Spark utilizzando scintilla-invio on Ilum. This guide demonstrates the core configuration needed and shows how to monitor your job’s progress within the Ilum platform. For a complete overview of Ilum's architecture, check the Architecture Overview.
How do I run a Spark job on Kubernetes with scintilla-invio?
To run a Spark job on Ilum (Kubernetes), ensure Java 17 and Spark are installed, upload your JAR, and run:
- Spark 4 (default)
- Spark 3
./bin/spark-submit \
--padrone k8s://http://<ilum-core-address>:<ilum-core-port> \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.driver.memory=4g \
--conf spark.ilum.cluster=default \
--conf spark.kubernetes.container.image=ilum/spark:4.1.2 \
--conf spark.kubernetes.submission.waitAppCompletion=vero \
s3a://ilum-files/ilum/default/spark-examples_2.13-4.1.2.jar
./bin/spark-submit \
--padrone k8s://http://<ilum-core-address>:<ilum-core-port> \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.driver.memory=4g \
--conf spark.ilum.cluster=default \
--conf spark.kubernetes.container.image=ilum/spark:3.5.8 \
--conf spark.kubernetes.submission.waitAppCompletion=vero \
s3a://ilum-files/ilum/default/spark-examples_2.12-3.5.8.jar
Note: Replace with your actual Ilum Core endpoint.
Step-by-Step Guide
1. Prerequisites
- Assicurati che Java 17 sia installato e impostato correttamente nel tuo
JAVA_HOME. - Download and extract the appropriate version of Apache Spark:
- Spark 4 (default)
- Spark 3
wget https://archive.apache.org/dist/spark/spark-4.1.2/spark-4.1.2-bin-hadoop3.tgz
tar -xzf spark-4.1.2-bin-hadoop3.tgz
cd spark-4.1.2-bin-hadoop3
wget https://dlcdn.apache.org/spark/spark-3.5.8/spark-3.5.8-bin-hadoop3.tgz
tar -xzf spark-3.5.8-bin-hadoop3.tgz
cd spark-3.5.8-bin-hadoop3
2. Connect to Ilum
If Ilum is deployed on Kubernetes, forward the service port to your local machine to make Ilum accessible at ospite locale:9888.
kubectl port-forward svc/ilum-core 9888:9888
Se stai comunicando dall'interno dello stesso cluster Kubernetes, puoi utilizzare gli indirizzi di servizio basati su DNS Kubernetes (ad esempio, http://ilum-core.namespace.svc.cluster.local) or expose services using Ingress.
3. Submit Your Spark Job
Choose the submission method that best fits your workflow:
- REST (Local Testing)
- Kubernetes (Production)
- Auto-Upload (Local JAR)
This method is suitable for quick local testing.
1. Upload your JAR File
For demonstration, we assume the JAR is uploaded manually to MinIO.
- Spark 4 (default)
- Spark 3
Locate the example JAR: examples/jars/spark-examples_2.13-4.1.2.jar
Upload it to MinIO (bucket ilum-files, path ilum/default/): s3a://ilum-files/ilum/default/spark-examples_2.13-4.1.2.jar
Locate the example JAR: examples/jars/spark-examples_2.12-3.5.8.jar
Upload it to MinIO (bucket ilum-files, path ilum/default/): s3a://ilum-files/ilum/default/spark-examples_2.12-3.5.8.jar
2. Submit via REST
spark.ilum.pyRequisiti is not supported in this mode, as REST does not support PySpark submissions.
Run the following command:
- Spark 4 (default)
- Spark 3
./bin/spark-submit \
--padrone spark://localhost:9888 \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.master.rest.enabled=vero \
--conf spark.ilum.cluster=default \
--conf spark.app.name=my-spark-job \
s3a://ilum-files/ilum/default/spark-examples_2.13-4.1.2.jar
./bin/spark-submit \
--padrone spark://localhost:9888 \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.master.rest.enabled=vero \
--conf spark.ilum.cluster=default \
--conf spark.app.name=my-spark-job \
s3a://ilum-files/ilum/default/spark-examples_2.12-3.5.8.jar
Parameters:
| Parameter | Descrizione |
|---|---|
--padrone | Ilum Core address via REST (e.g. spark://localhost:9888). |
--conf spark.master.rest.enabled=vero | Enables REST submission. |
s3a://... | JAR file path in MinIO. |
Expected Output
Esecuzione di Spark utilizzando il protocollo di invio dell'applicazione REST.
25/03/12 12:58:01 INFO RestSubmissionClient: Invio di una richiesta per lanciare un'applicazione in spark://localhost:9888.
25/03/12 12:58:03 INFO RestSubmissionClient: Invio creato correttamente come 20250312-1158-qdnioef2rny. Stato di invio del polling...
25/03/12 12:58:03 INFO RestSubmissionClient: Invio di una richiesta per lo stato di presentazione 20250312-1158-qdnioef2rny in spark://localhost:9888.
25/03/12 12:58:03 INFO RestSubmissionClient: Stato del driver 20250312-1158-qdnioef2rny è ora INVIATO.
25/03/12 12:58:03 INFO RestSubmissionClient: Il driver è in esecuzione sul worker ILUM all'indirizzo ILUM_UI_ADDRESS/workloads/details/job/20250312-1158-qdnioef2rny.
25/03/12 12:58:03 INFO RestSubmissionClient: Il server ha risposto con CreateSubmissionResponse:
{
"action" : "CreateSubmissionResponse",
"serverSparkVersion" : "4.1.2",
"submissionId" : "20250312-1158-qdnioef2rny",
"successo" : vero
}
25/03/12 12:58:03 INFO ShutdownHookManager: Hook di spegnimento chiamato
25/03/12 12:58:03 INFO ShutdownHookManager: Eliminazione della directory /tmp/spark-fa2603be-488a-4e2a-9b7f-5e49825d379b
This method is recommended for production and supports advanced features like Python dependencies.
1. Upload your JAR File
For demonstration, we assume the JAR is uploaded manually to MinIO.
In production environments, this process should be automated and executed programmatically (e.g., using AWS SDK, Hadoop's S3A connector) before triggering scintilla-invio.
- Spark 4 (default)
- Spark 3
Locate the example JAR: examples/jars/spark-examples_2.13-4.1.2.jar
Upload it to MinIO (bucket ilum-files, path ilum/default/): s3a://ilum-files/ilum/default/spark-examples_2.13-4.1.2.jar
Locate the example JAR: examples/jars/spark-examples_2.12-3.5.8.jar
Upload it to MinIO (bucket ilum-files, path ilum/default/): s3a://ilum-files/ilum/default/spark-examples_2.12-3.5.8.jar
2. Submit via Kubernetes Mode
Include Ilum-specific configurations for better management:
--conf spark.ilum.cluster=predefinito--conf spark.app.name=la-mia-scintilla-lavoro--conf spark.ilum.tags=analisi,calcolo pi greco--conf spark.ilum.pyRequirements="numpy==1.24.1,pandas==2.0.3"(if using Python)
These configurations allow you to better categorize, identify, and manage jobs within the Ilum UI. Run this command:
- Spark 4 (default)
- Spark 3
./bin/spark-submit \
--padrone k8s://http://localhost:9888 \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.driver.memory=4g \
--conf spark.ilum.cluster=default \
--conf spark.kubernetes.container.image=ilum/spark:4.1.2 \
--conf spark.kubernetes.submission.waitAppCompletion=vero \
s3a://ilum-files/ilum/default/spark-examples_2.13-4.1.2.jar
./bin/spark-submit \
--padrone k8s://http://localhost:9888 \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.driver.memory=4g \
--conf spark.ilum.cluster=default \
--conf spark.kubernetes.container.image=ilum/spark:3.5.8 \
--conf spark.kubernetes.submission.waitAppCompletion=vero \
s3a://ilum-files/ilum/default/spark-examples_2.12-3.5.8.jar
Parameters:
| Parameter | Descrizione |
|---|---|
--padrone | Address of your Kubernetes API (or Ilum Core for REST mode). |
--deploy-mode cluster | Submits the job to the Spark cluster. |
--classe | Entry point class of your Spark application (use format nomefile.nomeclasse per Python). |
--conf spark.driver.memory | Specifies memory allocation for the driver. |
--conf spark.ilum.cluster | Logical cluster name defined in Ilum. |
--conf spark.kubernetes.container.image | Docker image containing Spark. |
--conf spark.kubernetes.submission.waitAppCompletion=true | Keeps the CLI process attached until the job completes. |
s3a://... | JAR path in S3-compatible storage like MinIO. |
Expected Output
25/04/02 15:42:30 INFO SparkKubernetesClientFactory: Configurazione automatica del client K8S utilizzando il contesto corrente dal file di configurazione K8S degli utenti
25/04/02 15:42:38 INFO LoggingPodStatusWatcherImpl: Stato modificato, nuovo stato:
Nome del pod: org-apache-spark-examples-sparkpi-30ae6d95f6bd37fd-driver
namespace: predefinito
etichette: ilum.jobId -> 20250402-1342-s55afwq7gax, ilum.clusterName -> predefinito
UID del pod: 20250402-1342-S55AFWQ7gax
tempo di creazione: 2025-04-02T13:42:37.145Z
Nome dell'account di servizio: ilum-test-ilum-core-spark
volumi: N/A
Nome nodo: ILUM
tempo di inizio: 2025-04-02T13:42:37.145Z
fase: Corsa
Stato del contenitore:
Nome del contenitore: spark-driver
container image: ilum/spark:4.1.2
Stato del contenitore: in esecuzione
contenitore iniziato alle: 2025-04-02T13:42:37.145Z
25/04/02 15:42:38 INFO LoggingPodStatusWatcherImpl: In attesa dell'applicazione org.apache.spark.examples.SparkPi con l'ID dell'applicazione spark-a4f8f1eb4ed344f38d799d79817c45dc e l'ID di invio default:org-apache-spark-spark-examples-sparkpi-30ae6d95f6bd37fd-driver per finire...
25/04/02 15:42:39 INFO LoggingPodStatusWatcherImpl: Stato dell'applicazione per spark-a4f8f1eb4ed344f38d799d79817c45dc (fase: In esecuzione)
...
25/04/02 15:43:03 INFO LoggingPodStatusWatcherImpl: Stato dell'applicazione per spark-a4f8f1eb4ed344f38d799d79817c45dc (fase: In esecuzione)
25/04/02 15:43:03 INFO LoggingPodStatusWatcherImpl: Stati finali del contenitore:
Nome del contenitore: spark-driver
container image: ilum/spark:4.1.2
container state: terminated
contenitore iniziato alle: 2025-04-02T13:42:37.145Z
container finished at: 2025-04-02T13:43:03.145Z
exit code: 0
termination reason: Spark job completed
25/04/02 15:43:03 INFO LoggingPodStatusWatcherImpl: Applicazione org.apache.spark.examples.SparkPi con ID applicazione spark-a4f8f1eb4ed344f38d799d79817c45dc e ID invio default:org-apache-spark-spark-examples-sparkpi-30ae6d95f6bd37fd-driver terminato
25/04/02 15:43:03 INFO ShutdownHookManager: Hook di spegnimento chiamato
25/04/02 15:43:03 INFO ShutdownHookManager: Eliminazione della directory /tmp/spark-61e63485-79a3-491d-9bac-c71a8c1d96aa
Ilum can automatically upload your local JARs to MinIO during submission.
1. Additional Prerequisites Forward the MinIO port so the local Spark client can upload files:
kubectl port-forward svc/ilum-minio 9000:9000
2. Download S3 Dependencies
Download the required Hadoop/AWS JARs to your local Vasi folder:
Spark 4.x bundles hadoop-client-3.4.x which uses time-suffixed config values (e.g., "60s"). Using hadoop-aws-3.3.4 with Spark 4.x will fail with java.lang.NumberFormatException: For input string: "60s". Make sure to use the matching hadoop-aws version for your Spark version.
- Spark 4 (default)
- Spark 3
wget -P Vasi \
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.4.1/hadoop-aws-3.4.1.jar \
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.12.367/aws-java-sdk-bundle-1.12.367.jar \
https://repo1.maven.org/maven2/software/amazon/awssdk/bundle/2.24.6/bundle-2.24.6.jar
wget -P Vasi \
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.3.4/hadoop-aws-3.3.4.jar \
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk/1.12.262/aws-java-sdk-1.12.262.jar \
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.12.262/aws-java-sdk-core-1.12.262.jar \
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-dynamodb/1.12.262/aws-java-sdk-dynamodb-1.12.262.jar \
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.12.262/aws-java-sdk-s3-1.12.262.jar
3. Submit with Auto-Upload
This command includes configuration to connect to the local MinIO port and upload files. (replace image/tag or S3 credentials as needed)
- Spark 4 (default)
- Spark 3
./bin/spark-submit \
--padrone k8s://http://localhost:9888 \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.ilum.cluster=default \
--conf spark.app.name=my-sparkpi-job \
--conf spark.kubernetes.container.image=ilum/spark:4.1.2 \
--conf spark.kubernetes.submission.waitAppCompletion=vero \
--conf spark.kubernetes.file.upload.path=s3a://ilum-files/spark-jobs \
--conf spark.hadoop.fs.s3a.endpoint=http://localhost:9000 \
--conf spark.hadoop.fs.s3a.access.key=minioadmin \
--conf spark.hadoop.fs.s3a.secret.key=minioadmin \
--conf spark.hadoop.fs.s3a.path.style.access=vero \
--conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
--conf spark.hadoop.fs.s3a.fast.upload=vero \
--conf spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider \
./examples/jars/spark-examples_2.13-4.1.2.jar
./bin/spark-submit \
--padrone k8s://http://localhost:9888 \
--deploy-mode cluster \
--classe org.apache.spark.examples.SparkPi \
--conf spark.ilum.cluster=default \
--conf spark.app.name=my-sparkpi-job \
--conf spark.kubernetes.container.image=ilum/spark:3.5.8 \
--conf spark.kubernetes.submission.waitAppCompletion=vero \
--conf spark.kubernetes.file.upload.path=s3a://ilum-files/spark-jobs \
--conf spark.hadoop.fs.s3a.endpoint=http://localhost:9000 \
--conf spark.hadoop.fs.s3a.access.key=minioadmin \
--conf spark.hadoop.fs.s3a.secret.key=minioadmin \
--conf spark.hadoop.fs.s3a.path.style.access=vero \
--conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
--conf spark.hadoop.fs.s3a.fast.upload=vero \
--conf spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider \
./examples/jars/spark-examples_2.12-3.5.8.jar
Cosa succede dietro le quinte?
- Il client Spark carica automaticamente il file JAR locale nel bucket MinIO specificato (
ilum-files/lavori-scintilla). - Il pod driver Kubernetes viene creato nel cluster Kubernetes gestito da Ilum.
- L'esecuzione del processo viene monitorata direttamente tramite l'interfaccia utente di Ilum.
4. Monitor and Troubleshoot
Using the Ilum UI:
- Monitoraggio dell'avanzamento del processo: Track executors, memory usage, and job stages.
- Review Results: Access logs and the integrated Spark History Server.
- Troubleshoot: Diagnose failures by checking detailed executor logs.
For more details on monitoring metrics, see the Monitoring Guide.
Comparison: Classic spark-submit vs Ilum Approach
Running Spark directly on Kubernetes requires significant administrative effort. Ilum simplifies this by automating infrastructure management.
Traditional Approach (Native Spark on K8s) vs Ilum
| Caratteristica | Native Spark on K8s | Ilum (Managed Spark) |
|---|---|---|
| Setup | Manual Docker image build & complex scintilla-invio args. | Automated. Use existing JARs; Ilum handles images. |
| Configurazione | Verbose (Service Accounts, Volumes, Secrets). | Simplified. Minimal args; configs are injected automatically. |
| Immagazzinamento | Manual Hadoop/S3 configuration per job. | Integrated. Automatic credential injection for S3/GCS/Azure. |
| Monitoraggio | CLI-based (kubectl logs), ephemeral. | Centralized UI. Persistent logs, metrics, and history. |
| Osservabilità | Basic Spark UI (if exposed). | Avanzato. Derivazione dei dati, detailed resource metrics. |
Key Benefits of Ilum:
- Automatic Image Selection: Ilum selects a compatible Spark Docker image matching the cluster version.
- Advanced Observability: Ilum provides deep lineage observability and advanced monitoring capabilities.
- Simplified Configuration: Reduce
scintilla-invioparameters by 3x-4x. - Integrated Storage Access: Credentials for all configured storages are automatically injected.
- Instant Monitoring: Logs and metrics (CPU/RAM) appear in the Ilum UI immediately.
For a developer, this means less time fighting with infrastructure and error-prone configurations, and more time delivering business logic.
For advanced customization, refer to the official Spark documentation.