Scala Spark读取Zstd压缩Kafka数据报错的解决咨询
解决Spark读取Kafka Zstd压缩数据时的NoClassDefFoundError问题
针对你遇到的java.lang.NoClassDefFoundError: com/github/luben/zstd/ZstdOutputStreamNoFinalizer错误,结合Spark 3.3.2、Scala 2.12.14的环境,可通过以下步骤解决:
统一zstd-jni版本并修正依赖配置
你当前混用了1.5.2-1的pom依赖和1.5.2-3的jar包,版本不一致会导致类加载异常。请将pom依赖版本统一为1.5.2-3(Spark 3.3.2推荐兼容版本),并确保依赖范围为compile:<dependency> <groupId>com.github.luben</groupId> <artifactId>zstd-jni</artifactId> <version>1.5.2-3</version> <scope>compile</scope> </dependency>排除Spark自带的冲突依赖
Spark 3.3.2内部可能包含旧版本的zstd-jni依赖,与你引入的版本冲突。需在Spark Kafka依赖中排除自带的zstd-jni:<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql-kafka-0-10_2.12</artifactId> <version>3.3.2</version> <exclusions> <exclusion> <groupId>com.github.luben</groupId> <artifactId>zstd-jni</artifactId> </exclusion> </exclusions> </dependency>确保依赖被正确打包到应用
如果使用Maven打包,需确认zstd-jni被包含在最终的jar包中。可以使用Maven Shade插件将依赖打包成胖jar,避免运行时缺失类:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>运行时显式指定依赖
若通过spark-submit提交作业,可直接通过--packages参数指定zstd-jni依赖,确保运行时环境能加载到正确的类:spark-submit --packages com.github.luben:zstd-jni:1.5.2-3 --class your.main.ApplicationClass your-application.jar
内容的提问来源于stack exchange,提问作者Khilesh Chauhan
相关产品推荐
相关产品推荐

