SparkSession初始化抛出ExceptionInInitializerError问题求助
解决SparkSession.getOrCreate()触发的ExceptionInInitializerError问题
看起来你遇到的这个错误根源是Apache Commons Lang3的版本兼容问题,再加上依赖配置的小失误导致的。让我一步步帮你解决:
核心原因分析
从堆栈信息看,NullPointerException出现在org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast方法里,这说明SystemUtils类无法正确读取Java版本信息,通常是因为项目中缺少正确版本的commons-lang3依赖,或者依赖版本和Spark 3.0.0所需的版本不匹配。另外,你用的是Structured Streaming,但引入了传统DStream的Spark Streaming依赖,这也可能引发类冲突。
具体修复步骤
1. 添加正确版本的commons-lang3依赖
Spark 3.0.0依赖的commons-lang3版本是3.8.1,直接在你的pom.xml中加入这个依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.8.1</version> </dependency>
2. 修正Structured Streaming的依赖配置
你当前引入的是传统Spark Streaming(DStream)的Kafka连接器,但你要运行的是Structured Streaming任务,需要替换为对应的SQL版Kafka依赖:
- 移除以下两个依赖:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.12</artifactId> <version>${spark.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>${spark.version}</version> </dependency>
- 添加Structured Streaming的Kafka依赖:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql-kafka-0-10_2.12</artifactId> <version>${spark.version}</version> </dependency>
3. 优化Maven Shade插件配置(可选但推荐)
为了避免依赖冲突,在shade插件中添加类重定位配置,确保commons-lang3的类不会和其他依赖冲突:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>${mvn-shade.version}</version> <executions> <execution> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <!-- 添加类重定位 --> <relocations> <relocation> <pattern>org.apache.commons.lang3</pattern> <shadedPattern>shaded.org.apache.commons.lang3</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
4. 验证Java环境
最后确认你的运行环境确实是Java 11,执行以下命令检查:
java -version
确保输出的版本号和你pom中配置的maven.compiler.source/target一致。
完成这些步骤后,重新打包运行你的任务,应该就能正常创建SparkSession了。
内容的提问来源于stack exchange,提问作者Matthias Seiler
相关产品推荐
相关产品推荐

