diff --git a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala index 4ab7f6097c8..76e8c083055 100644 --- a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala +++ b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala @@ -20,7 +20,7 @@ package org.apache.kyuubi.engine.spark.session import org.apache.hive.service.rpc.thrift.TProtocolVersion import org.apache.spark.sql.SparkSession -import org.apache.kyuubi.KyuubiSQLException +import org.apache.kyuubi.{KyuubiSQLException, Utils} import org.apache.kyuubi.config.KyuubiConf import org.apache.kyuubi.config.KyuubiConf._ import org.apache.kyuubi.engine.ShareLevel @@ -42,7 +42,8 @@ class SparkSQLSessionManager private (name: String, spark: SparkSession) def this(spark: SparkSession) = this(classOf[SparkSQLSessionManager].getSimpleName, spark) override def initialize(conf: KyuubiConf): Unit = { - _operationLogRoot = Some(conf.get(ENGINE_OPERATION_LOG_DIR_ROOT)) + val absPath = Utils.getAbsolutePathFromWork(conf.get(ENGINE_OPERATION_LOG_DIR_ROOT)) + _operationLogRoot = Some(absPath.toAbsolutePath.toString) super.initialize(conf) } diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala index 611934b7bc8..36e13cf92e1 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala @@ -103,6 +103,19 @@ object Utils extends Logging { error) } + def getAbsolutePathFromWork(pathStr: String, env: Map[String, String] = sys.env): Path = { + val path = Paths.get(pathStr) + if (path.isAbsolute) { + path + } else { + val workDir = env.get("KYUUBI_WORK_DIR_ROOT") match { + case Some(dir) => dir + case _ => System.getProperty("user.dir") + } + Paths.get(workDir, pathStr) + } + } + /** * Delete a directory recursively. */ diff --git a/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala b/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala index 3f61e5a6cc2..3b9906d1c0d 100644 --- a/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala +++ b/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala @@ -19,7 +19,7 @@ package org.apache.kyuubi import java.io.{File, IOException} import java.net.InetAddress -import java.nio.file.Files +import java.nio.file.{Files, Paths} import java.security.PrivilegedExceptionAction import java.util.Properties @@ -130,4 +130,14 @@ class UtilsSuite extends KyuubiFunSuite { assert(Utils.findLocalInetAddress !== InetAddress.getLocalHost) } } + + test("getAbsolutePathFromWork") { + val workDir = System.getenv("KYUUBI_WORK_DIR_ROOT") + val path1 = "path1" + assert(Utils.getAbsolutePathFromWork(path1).toAbsolutePath.toString === + Paths.get(workDir, path1).toAbsolutePath.toString) + + val path2 = "/tmp/path2" + assert(Utils.getAbsolutePathFromWork(path2).toString === path2) + } } diff --git a/kyuubi-metrics/src/main/scala/org/apache/kyuubi/metrics/JsonReporterService.scala b/kyuubi-metrics/src/main/scala/org/apache/kyuubi/metrics/JsonReporterService.scala index 1ebbb3093ae..7f82a8e0e07 100644 --- a/kyuubi-metrics/src/main/scala/org/apache/kyuubi/metrics/JsonReporterService.scala +++ b/kyuubi-metrics/src/main/scala/org/apache/kyuubi/metrics/JsonReporterService.scala @@ -30,6 +30,7 @@ import com.codahale.metrics.MetricRegistry import com.codahale.metrics.json.MetricsModule import com.fasterxml.jackson.databind.ObjectMapper +import org.apache.kyuubi.Utils import org.apache.kyuubi.config.KyuubiConf import org.apache.kyuubi.metrics.MetricsConf._ import org.apache.kyuubi.service.AbstractService @@ -43,7 +44,7 @@ class JsonReporterService(registry: MetricRegistry) private var reportPath: Path = _ override def initialize(conf: KyuubiConf): Unit = synchronized { - reportDir = Paths.get(conf.get(METRICS_JSON_LOCATION)).toAbsolutePath + reportDir = Utils.getAbsolutePathFromWork(conf.get(METRICS_JSON_LOCATION)) Files.createDirectories(reportDir) reportPath = Paths.get(reportDir.toString, "report.json").toAbsolutePath super.initialize(conf) diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/session/KyuubiSessionManager.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/session/KyuubiSessionManager.scala index 83220ec562c..ca5521bff41 100644 --- a/kyuubi-server/src/main/scala/org/apache/kyuubi/session/KyuubiSessionManager.scala +++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/session/KyuubiSessionManager.scala @@ -20,7 +20,7 @@ package org.apache.kyuubi.session import com.codahale.metrics.MetricRegistry import org.apache.hive.service.rpc.thrift.TProtocolVersion -import org.apache.kyuubi.KyuubiSQLException +import org.apache.kyuubi.{KyuubiSQLException, Utils} import org.apache.kyuubi.config.KyuubiConf import org.apache.kyuubi.config.KyuubiConf._ import org.apache.kyuubi.credentials.HadoopCredentialsManager @@ -37,7 +37,8 @@ class KyuubiSessionManager private (name: String) extends SessionManager(name) { override def initialize(conf: KyuubiConf): Unit = { addService(credentialsManager) - _operationLogRoot = Some(conf.get(SERVER_OPERATION_LOG_DIR_ROOT)) + val absPath = Utils.getAbsolutePathFromWork(conf.get(SERVER_OPERATION_LOG_DIR_ROOT)) + _operationLogRoot = Some(absPath.toAbsolutePath.toString) super.initialize(conf) }