Azure Databricks运行Spring Boot Java应用及类找不到报错解决
Azure Databricks 运行Spring Boot Java应用落地指南
原有本地Spark环境的验证可行方案
该方案最早适配OpenShift构建场景,经过本地Apache Spark环境的运行验证,可实现驱动端完整Spring Boot能力(含依赖注入)、集群端Spark计算逻辑正常运行的效果,核心步骤如下:
- 使用
copy-rename-maven-plugin对spring-boot-maven-plugin生成的原始jar包执行重命名操作,对应pom配置:
<plugin> <groupId>com.coderplus.maven.plugins</groupId> <artifactId>copy-rename-maven-plugin</artifactId> <version>1.0.1</version> <executions> <execution> <id>rename-file</id> <phase>package</phase> <goals> <goal>rename</goal> </goals> <configuration> <sourceFile>target/${project.name}-${project.version}.jar.original</sourceFile> <destinationFile>target/${project.name}-${project.version}-original.jar</destinationFile> </configuration> </execution> </executions> </plugin>
- 新增配置项记录原始jar包的名称与存储路径,配置值设置为原始jar包的实际部署位置
- 在Spark初始化流程中通过
-Doriginal.jar-file参数,将原始jar包的名称与路径传递给Spark会话,对应代码:
sparkConf.setJars(new String[]{props.getJarFile()});
- 执行spark-submit命令启动应用,示例命令:
spark-submit --master yarn --deploy-mode client --conf "spark.driver.extraJavaOptions=-Dspring.profiles.active=dev" SparkPiBoot-0.0.1.jar
方案运行效果说明:驱动应用可在本地Spark环境以完整Spring Boot应用形态运行,支持依赖注入等核心能力;在Spark集群端执行的Dataframe计算逻辑取自未修改的原始jar包,不具备Spring Boot相关特性。
Databricks场景下的现有运行情况
当前计划通过Azure Data Factory管道调度Databricks作业运行应用,已完成基础准备:
- 已将两个jar包上传至Azure Databricks文件系统
- 已创建关联DBFS中原始jar包路径的Azure Data Factory Databricks活动
运行时触发报错如下:
command--1:1: error: Class org.springframework.boot.CommandLineRunner not found - continuing with a stub. io.radanalytics.SparkPiBootApplication.main(Array()) ^
已完成的前置排查:主jar为Spring Boot生成的uber jar,已包含全部依赖,其中就包含承载org.springframework.boot.CommandLineRunner类的spring-boot-1.5.2.RELEASE.jar,问题并非依赖包缺失导致。
Databricks环境适配调整方案
核心报错根因:Databricks集群的类加载机制无法识别Spring Boot uber jar内部嵌套的BOOT-INF/classes、BOOT-INF/lib目录下的类,即便jar包物理包含对应类,也无法被类加载器扫描到,因此触发类找不到的报错。可通过以下调整完成适配:
- 调整打包逻辑,生成扁平结构的类路径jar
修改maven打包配置,不再生成带BOOT-INF嵌套结构的Spring Boot可执行jar,而是将所有依赖类直接解压到jar包根目录后重新打包,确保Databricks类加载器可直接扫描到类文件。 - 统一使用DBFS绝对路径注册依赖
所有需要加载的应用jar、依赖jar,在Databricks作业配置的“库引用”列表中,统一使用dbfs:/开头的绝对路径注册,不要依赖代码中SparkConf动态传递的jar路径配置。
同时在Spark配置项中,将两个jar的DBFS绝对路径追加到spark.driver.extraClassPath、spark.executor.extraClassPath参数中,绕过Databricks默认的类加载路径扫描规则。 - 明确指定作业主类
在Databricks作业配置中,直接填写应用主类的全路径名(如io.radanalytics.SparkPiBootApplication),不要依赖jar包内部MANIFEST.MF中配置的Spring Boot JarLauncher主类,绕开Spring Boot可执行jar的类加载隔离逻辑。 - 对齐原有运行参数
参照本地Spark的配置,在Databricks作业的JVM参数中追加spark.driver.extraJavaOptions=-Dspring.profiles.active=dev,确保Spring配置文件按预期加载。
内容的提问来源于stack exchange,提问作者stephen newman
相关产品推荐
相关产品推荐

