You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交Spark应用至Amazon EMR时出现org.apache.spark.sql.catalyst.FileSourceOptions$类未找到异常

Spark应用在EMR集群提交时出现ClassNotFoundException问题解决

问题背景

应用配置(build.sbt)

name := "IngestFromS3ToKafka"
version := "1.0"
scalaVersion := "2.12.17"
resolvers += "confluent" at "https://packages.confluent.io/maven/"

val sparkVersion = "3.3.1"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion % "provided",
  "org.apache.spark" %% "spark-sql" % sparkVersion % "provided",
  "org.apache.hadoop" % "hadoop-common" % "3.3.5" % "provided",
  "org.apache.hadoop" % "hadoop-aws" % "3.3.5" % "provided",
  "com.amazonaws" % "aws-java-sdk-bundle" % "1.12.475" % "provided",

  "org.apache.spark" %% "spark-avro" % sparkVersion,
  "org.apache.spark" %% "spark-sql-kafka-0-10" % sparkVersion,
  "io.delta" %% "delta-core" % "2.4.0",
  "za.co.absa" %% "abris" % "6.3.0"
)

ThisBuild / assemblyMergeStrategy := {
  case PathList("module-info.class") => MergeStrategy.discard
  case x if x.endsWith("/module-info.class") => MergeStrategy.discard
  case PathList("org", "apache", "spark", "unused", "UnusedStubClass.class") => MergeStrategy.first
  case x =>
    val oldStrategy = (ThisBuild / assemblyMergeStrategy).value
    oldStrategy(x)
}

提交命令与错误信息

使用内置Spark 3.3.1的Amazon EMR集群,执行以下提交命令:

/bin/bash -c "/usr/bin/spark-submit --master yarn --deploy-mode client --class com.hongbomiao.IngestFromS3ToKafka --name ingest-from-s3-to-kafka /home/hadoop/IngestFromS3ToKafka-assembly-1.0.jar"

出现核心错误:

Exception in thread "main" com.google.common.util.concurrent.ExecutionError: java.lang.NoClassDefFoundError: org/apache/spark/sql/catalyst/FileSourceOptions$
...
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.catalyst.FileSourceOptions$

问题原因

Delta Lake版本与Spark版本不兼容。当前使用的Delta Lake 2.4.0对应Spark 3.4.x版本,而集群中的Spark是3.3.1,org.apache.spark.sql.catalyst.FileSourceOptions$类是Spark 3.4新增的,因此Delta代码在Spark 3.3.1环境下找不到该类。

解决方法

将Delta Lake版本降级到与Spark 3.3.1兼容的2.3.0版本,同时添加provided标记避免与EMR预装依赖冲突:

修改build.sbt中的Delta依赖:

"io.delta" %% "delta-core" % "2.3.0" % "provided"

重新打包应用后,再次执行spark-submit命令即可。


内容的提问来源于stack exchange,提问作者Hongbo Miao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:07:37