Я пытаюсь создать простое приложение Quarkus с помощью Apache Spark, чтобы затем развернуть его в кластере Kubernetes. Приложение запускается без ошибок (режим разработки Quarkus), но по какой-то причине оно не может создать SparkSession (здесь также нет ошибок, приложение просто зависает, когда я вызываю конечную точку отдыха, которая использует SparkSession).
В приведенном ниже коде, когда я пишу «return sparkSessionBean.toString();» в методе "hello" exampleResource он работает правильно, но когда я пытаюсь "вернуть sparkSessionBean.getSpark().toString();" запрос зависает навсегда, никаких ошибок.
Когда я запускаю тот же код в автономном приложении с основным методом (без Quarkus), он работает правильно (создает SparkSession и выполняет какое-то задание).
Я тестировал это на Quarkus 3.5.3 и 3.8.1 + Spark 3.5.0 + Java 17.
Есть ли проблемы с использованием Spark? с Quarkus?
Ресурс:
package com.example;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/hello")
public class ExampleResource {
@Inject
SparkSessionBean sparkSessionBean;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return sparkSessionBean.getSpark().toString();
}
}
SparkSessionBean:
package com.example;
import jakarta.enterprise.context.ApplicationScoped;
import org.apache.spark.sql.SparkSession;
@ApplicationScoped
public class SparkSessionBean {
private static final String WAREHOUSE_PATH = "s3a://iceberg";
private SparkSession spark;
public SparkSession getSpark() {
if (spark == null) {
spark = SparkSession.builder()
.appName("Java Spark Iceberg Example")
.master("local")
.config("spark.ui.enabled", "false")
//Filesystem (MinIO) config
.config("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
.config("fs.s3a.endpoint", "http://localhost:9000")
.config("fs.s3a.access.key", "key123")
.config("fs.s3a.secret.key", "secret123")
.config("fs.s3a.path.style.access", "true")
.config("spark.sql.warehouse.dir", WAREHOUSE_PATH)
//Nessie catalog config
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.5_2.13:1.3.0,org.projectnessie.nessie-integrations:nessie-spark-extensions-3.5_2.13:0.77.1")
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,org.projectnessie.spark.extensions.NessieSparkSessionExtensions")
.config("spark.sql.catalog.nessie", "org.apache.iceberg.spark.SparkCatalog")
.config("spark.sql.catalog.nessie.catalog-impl", "org.apache.iceberg.nessie.NessieCatalog")
.config("spark.sql.catalog.nessie.authentication.type", "NONE")
.config("spark.sql.catalog.nessie.uri", "http://localhost:19120/api/v1")
.config("spark.sql.catalog.nessie.ref", "main")
.config("spark.sql.defaultCatalog", "nessie")
.config("spark.sql.catalog.nessie.warehouse", WAREHOUSE_PATH)
.getOrCreate();
}
return spark;
}
}
pom.xml
4.0.0
com.example
quarkus-spark
1.0-SNAPSHOT
3.12.1
17
UTF-8
UTF-8
quarkus-bom
io.quarkus.platform
3.8.1
true
3.2.5
3.5.0
1.4.3
3.3.4
${quarkus.platform.group-id}
${quarkus.platform.artifact-id}
${quarkus.platform.version}
pom
import
io.quarkus
quarkus-arc
io.quarkus
quarkus-resteasy-reactive
io.quarkus
quarkus-junit5
test
io.rest-assured
rest-assured
test
org.apache.spark
spark-core_2.13
${spark.version}
org.apache.spark
spark-sql_2.13
${spark.version}
org.apache.iceberg
iceberg-spark-runtime-3.5_2.13
${iceberg.version}
org.apache.hadoop
hadoop-aws
${hadoop.version}
org.antlr
antlr4-runtime
4.9.3
org.apache.kafka
connect-api
3.2.3
${quarkus.platform.group-id}
quarkus-maven-plugin
${quarkus.platform.version}
true
build
generate-code
generate-code-tests
maven-compiler-plugin
${compiler-plugin.version}
-parameters
maven-surefire-plugin
${surefire-plugin.version}
org.jboss.logmanager.LogManager
${maven.home}
maven-failsafe-plugin
${surefire-plugin.version}
integration-test
verify
${project.build.directory}/${project.build.finalName}-runner
org.jboss.logmanager.LogManager
${maven.home}
native
native
false
native
Подробнее здесь: https://stackoverflow.com/questions/781 ... uarkus-app