Azure Databricks Spark Submit作业传递Typesafe配置文件找不到db键问题求助
问题根因
- 配置加载时机错误:你当前代码中
val config: Config = ConfigFactory.load("application.conf")是作为Bootstrap对象的成员变量声明的,Scala中对象的成员变量会在类加载阶段就完成初始化,此时SparkContext还未完成初始化,--files指定的配置文件还没有被下载到Driver节点的工作目录,ConfigFactory只会从Jar包内的classpath查找配置,找不到外部的application.conf就会加载默认空配置,自然找不到db键。 - 路径配置冗余错误:你尝试的
extraClassPath配置路径不符合Databricks的文件分发逻辑,--files指定的文件会自动分发到Driver和Executor的当前工作目录,不需要额外添加到classpath。
解决方案
步骤1:修改Scala代码调整加载时机
将配置加载逻辑移到main方法内部,确保SparkSession初始化完成、配置文件已经分发到本地后再加载:
import org.slf4j.{Logger, LoggerFactory} import com.typesafe.config.{Config, ConfigFactory} import org.apache.spark.sql.SparkSession object Bootstrap extends MyLogging { val spark: SparkSession = SparkSession.builder.enableHiveSupport().getOrCreate() def main(args: Array[String]): Unit = { // Spark初始化完成后再加载配置,此时--files的文件已经下载到本地工作目录 val config: Config = ConfigFactory.load() val url: String = config.getString("db.url") val user: String = config.getString("db.user") println(url) println(user) } }
步骤2:使用正确的Spark Submit参数
不需要配置extraClassPath,仅保留文件分发和JVM系统属性配置即可,正确的spark_submit_task.parameters配置如下:
[ "--class", "Bootstrap", "--conf", "spark.driver.extraJavaOptions=-Dconfig.file=./application.conf", "--conf", "spark.executor.extraJavaOptions=-Dconfig.file=./application.conf", "--files", "dbfs:/tmp/application.conf", "dbfs:/tmp/code-assembly-0.1.0.jar" ]
补充说明
- 如果只有Driver需要读取配置,Executor不需要用到配置项,可以去掉
spark.executor.extraJavaOptions相关配置 - 若加载仍然失败,可以在加载配置前增加调试代码,确认文件是否已经分发到当前工作目录:
import java.io.File // 打印当前工作目录所有文件,确认application.conf存在 new File(".").listFiles().foreach(f => println(s"本地文件:${f.getAbsolutePath}"))
内容的提问来源于stack exchange,提问作者Praveen Kumar
相关产品推荐
相关产品推荐

