На моем локальном сервере у меня есть искровой кластер, работающий в автономном режиме, и у меня есть задание Spring Boot Spark, которое я отправляю с помощью следующей команды:
spark-submit --conf "spark.driver.userClassPathFirst=true" --conf "spark.executor.userClassPathFirst=true" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:///log4j2.xml -XX:ReservedCodeCacheSize=100M -XX:MaxMetaspaceSize=256m -XX:CompressedClassSpaceSize=256m --add-opens=java.base/sun.nio.ch=ALL-UNNAMED -Dlog4j.debug" --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:///log4j2.xml --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED -XX:ReservedCodeCacheSize=100M -XX:MaxMetaspaceSize=256m -XX:CompressedClassSpaceSize=256m -Dlog4j.debug" --driver-java-options "-Xms4096m -XX:+UseG1GC -XX:G1HeapRegionSize=32M --add-opens=java.base/sun.nio.ch=ALL-UNNAMED" --master spark://localhost:7077 --deploy-mode cluster --num-executors 1 --executor-cores 4 --executor-memory 4096m --driver-memory 4096m --conf "spark.driver.memory=4096m" --conf "spark.dynamicAllocation.enabled=true" operatordc1-0.0.1-SNAPSHOT.jar
Он хорошо работает и успешно выполняет свою работу. Затем я создал оператор Spark в своем кластере Kubernetes, используя этот образ: ghcr.io/kubeflow/spark-operator:v1beta2-1.4.3-3.5.0. Оператор был успешно создан, и теперь я хотел запустить то же задание, которое я запускал в своем автономном кластере Spark в Kubernetes, с помощью оператора Spark. Для этой цели я создал этот файл YAML:
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: operatordc1
namespace: spark-operator
spec:
type: Java
mode: cluster
image: "focode/spark-custom:release-1.0"
imagePullPolicy: Always
mainApplicationFile: "local:///opt/spark/examples/jars/operatordc1-0.0.1-SNAPSHOT.jar"
sparkVersion: "3.4.2"
restartPolicy:
type: Never
driver:
cores: 1
coreLimit: "1000m"
memory: "1024m"
javaOptions: >-
-Dlog4j.configuration=file:///log4j2.xml
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED
--add-opens=java.base/java.nio=ALL-UNNAMED
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.lang.invoke=ALL-UNNAMED
--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:ReservedCodeCacheSize=100M
-XX:MaxMetaspaceSize=256m
-XX:CompressedClassSpaceSize=256m
-Xms1024m
-Dlog4j.debug
labels:
version: "3.4.2"
serviceAccount: default
executor:
cores: 4
instances: 1
memory: "1024m"
javaOptions: >-
-Dlog4j.configuration=file:///log4j2.xml
-XX:ReservedCodeCacheSize=100M
-XX:MaxMetaspaceSize=256m
-XX:CompressedClassSpaceSize=256m
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED
-Dlog4j.debug
labels:
version: "3.4.2"
serviceAccount: default
sparkConf:
"spark.driver.userClassPathFirst": "true"
"spark.executor.userClassPathFirst": "true"
"spark.driver.memory": "1024m"
"spark.executor.memory": "1024m"
"spark.dynamicAllocation.enabled": "true"
Я запускаю его с помощью этой команды:
kubectl apply -f spark-job-poc-1.yaml -n spark-operator
К сожалению, это дает мне следующую ошибку:
failed to submit SparkApplication operatordc1: failed to run spark-submit for SparkApplication spark-operator/operatordc1: 24/04/27 10:19:58 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Exception in thread "main" org.apache.spark.SparkException: Failed to get main class in JAR with error 'No FileSystem for scheme "local"'. Please specify one with --class. at org.apache.spark.deploy.SparkSubmit.error(SparkSubmit.scala:1047) at org.apache.spark.deploy.SparkSubmit.prepareSubmitEnvironment(SparkSubmit.scala:528) at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:964) at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:194) at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:217) at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:91) at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1120) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1129) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Это означает, что он не может найти основной класс моего задания Spring Boot.
Я загрузил исходный код своего задания Spring Boot по этому адресу: https://github.com/focode/operatordc1
Я пробовал передать основной класс, используя этот ключ: mainClass: "com.dcpoc1.operator.operatordc1.Operatordc1Application"
вместе с mainApplicationFile
, но у меня это не сработало, за тем же исключением. Меня также беспокоит то, что когда я отправляю задание в свой автономный кластер Spark с помощью команды spark submit
, я не указываю параметр класса, но оператор Kubernetes заставляет меня добавить параметр класса для моего задания Spring Boot.
Мне нужно было устранить ошибку, в которой говорится, что основной класс задания не найден.
Я получил разрешение, я использовал его как основной класс: mainClass: "org.springframework.boot.loader.JarLauncher"