Azure Databricks简单Scala作业执行失败,求排查方案
问题:Azure Databricks运行Scala JAR作业失败
我尝试在Azure Databricks上运行一个基础Scala类作为作业,代码如下:
import org.apache.spark.sql.SparkSession object Main { def main(args: Array[String]): Unit = { println("Hello, Databricks!") val spark = SparkSession.builder .appName("Hello DAtabricks") .getOrCreate() try {} finally { spark.stop } } }
build.sbt配置:
scalaVersion := "2.12.18" libraryDependencies ++= Seq( "org.apache.spark" %% "spark-sql" % "3.4.0" % Provided )
操作步骤:使用sbt assembly生成uberjar,在Databricks创建JAR任务并上传该JAR执行,作业失败。作业输出包含Log4j日志及标准错误日志。
请问我可能哪里操作出错了?
排查方向及解决方法
1. 主类未正确指定
Databricks作业必须明确指定主类的完整路径:
- 如果
Main对象在默认包下,作业配置的Main class字段需填写Main;若在自定义包中(如com.demo),则需填写com.demo.Main。 - 检查作业配置页面的主类字段是否与代码中的类路径一致。
2. 打包时未设置主类
sbt assembly默认不会自动配置主类,需在build.sbt中显式声明:
mainClass := Some("Main") // 若有包名则替换为完整路径
执行sbt clean assembly重新打包,确保过程无报错。
3. Spark版本不兼容
Azure Databricks集群的Spark版本需与依赖版本(3.4.0)匹配:
- 查看集群运行时版本:Databricks Runtime 13.x对应Spark 3.4.x,若集群使用更低版本(如12.x对应Spark 3.3.x),会引发类冲突。
- 解决方案:要么调整
build.sbt中的Spark版本适配集群,要么升级集群到对应Spark版本的运行时。
4. UberJar打包了Provided依赖
即使标记了Spark依赖为Provided,sbt assembly仍可能将其打包进JAR,与集群自带Spark类库冲突。需添加合并策略排除冲突文件:
assemblyMergeStrategy in assembly := { case PathList("META-INF", _*) => MergeStrategy.discard case _ => MergeStrategy.first }
5. JAR文件上传或权限问题
- 确认JAR已成功上传至Databricks工作区,且作业使用的服务账号拥有该文件的读取权限。
- 尝试重新上传JAR后再次执行作业。
内容的提问来源于stack exchange,提问作者Dan Corneanu
相关产品推荐
相关产品推荐

