From ebb18a41a5a706798a74585f576c5d8551c9df8f Mon Sep 17 00:00:00 2001 From: wforget <643348094@qq.com> Date: Thu, 6 Aug 2026 18:50:43 +0800 Subject: [PATCH 1/2] [KYUUBI #7615] Move engine application manager info configuration to the start method --- .../scala/org/apache/kyuubi/engine/ProcBuilder.scala | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala index db083579253..39d48143970 100644 --- a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala +++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala @@ -169,11 +169,6 @@ trait ProcBuilder { @volatile private[kyuubi] var process: Process = _ @volatile private[kyuubi] var processLaunched: Boolean = false - // Set engine application manger info conf - conf.set( - KyuubiReservedKeys.KYUUBI_ENGINE_APP_MGR_INFO_KEY, - ApplicationManagerInfo.serialize(appMgrInfo())) - private[kyuubi] lazy val engineLog: File = ProcBuilder.synchronized { val engineLogTimeout = conf.get(KyuubiConf.ENGINE_LOG_TIMEOUT) val currentTime = System.currentTimeMillis() @@ -213,6 +208,12 @@ trait ProcBuilder { def validateConf(): Unit = {} final def start: Process = synchronized { + + // Set engine application manger info conf + conf.set( + KyuubiReservedKeys.KYUUBI_ENGINE_APP_MGR_INFO_KEY, + ApplicationManagerInfo.serialize(appMgrInfo())) + process = processBuilder.start() processLaunched = true val reader = Files.newBufferedReader(engineLog.toPath, StandardCharsets.UTF_8) From 201478d92bb3cb8b475bfa095c31d88b5836d4e5 Mon Sep 17 00:00:00 2001 From: wforget <643348094@qq.com> Date: Fri, 7 Aug 2026 20:49:00 +0800 Subject: [PATCH 2/2] add test --- .../engine/spark/SparkProcessBuilderSuite.scala | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala index be24c53c20c..7dd1b7fb638 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala @@ -18,6 +18,7 @@ package org.apache.kyuubi.engine.spark import java.io.File +import java.nio.charset.StandardCharsets import java.nio.file.{Files, Path, Paths, StandardOpenOption} import java.time.{Duration, LocalDate} import java.time.format.DateTimeFormatter @@ -422,6 +423,21 @@ class SparkProcessBuilderSuite extends KerberizedTestHelper with MockitoSugar { } } + test("load spark master from spark-defaults.conf after initialization") { + val sparkHome = Utils.createTempDir("spark-home-with-defaults") + val sparkConfDir = Files.createDirectory(sparkHome.resolve("conf")) + Files.write( + sparkConfDir.resolve("spark-defaults.conf"), + s"$MASTER_KEY yarn".getBytes(StandardCharsets.UTF_8)) + + val builderConf = KyuubiConf(false) + .set("kyuubi.engineEnv.SPARK_HOME", sparkHome.toString) + .set("kyuubi.engineEnv.SPARK_SCALA_VERSION", SCALA_COMPILE_VERSION) + val builder = new SparkProcessBuilder("kentyao", true, builderConf) + + assert(builder.clusterManager() === Some("yarn")) + } + test("Fix NullPointerException when SPARK_HOME is invalid") { val notFoundMsg = "Failed to extract Scala version" val listFailMsg = "Failed to list jars"