Spark Yarn任务对接InfluxDB时遭遇Okio版本冲突报错
解决Spark YARN上Okio版本冲突导致的
NoSuchMethodError问题 这个问题我之前帮不少开发者排查过,本质就是Spark YARN环境里的Okio版本冲突搞的鬼——你用的InfluxDB客户端依赖的Okio版本包含readUtf8LineStrict(J)这个方法,但Spark集群自带的旧版Okio根本没有这个方法,运行时自然就抛出NoSuchMethodError了。
下面给你几个靠谱的解决方案,按推荐程度排序:
1. 强制统一Okio版本(最推荐)
在你的项目构建文件里,直接强制指定和InfluxDB客户端兼容的Okio版本,覆盖Spark自带的旧版本,从根源上避免冲突。
Maven项目(修改pom.xml):
<dependencyManagement> <dependencies> <!-- 替换成你InfluxDB客户端依赖的Okio版本,比如2.x系列的2.10.0 --> <dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio-jvm</artifactId> <version>2.10.0</version> </dependency> </dependencies> </dependencyManagement>
Gradle项目(修改build.gradle):
configurations.all { resolutionStrategy.force 'com.squareup.okio:okio:2.10.0' resolutionStrategy.force 'com.squareup.okio:okio-jvm:2.10.0' }
2. 提交任务时显式指定依赖
如果不想修改项目构建文件,可以在spark-submit命令里通过--packages参数直接指定正确的Okio版本,让YARN拉取并使用这个版本:
spark-submit \ --class com.yourcompany.YourMainClass \ --master yarn \ --deploy-mode cluster \ --packages com.squareup.okio:okio:2.10.0,com.squareup.okio:okio-jvm:2.10.0 \ your-spark-application.jar
3. 排除Spark自带的旧Okio依赖
如果你的项目已经引入了InfluxDB客户端,可以在Spark相关依赖里排除掉旧版Okio,让项目使用InfluxDB依赖的版本:
Maven示例:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>你的Spark版本号</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> </exclusion> </exclusions> </dependency>
Gradle示例:
implementation('org.apache.spark:spark-core_2.12:你的Spark版本号') { exclude group: 'com.squareup.okio', module: 'okio' }
小提示:
不确定InfluxDB依赖的Okio版本?可以用以下命令查看项目依赖树:
- Maven:
mvn dependency:tree - Gradle:
./gradlew dependencies
找到InfluxDB相关依赖下的Okio版本,替换上面示例里的版本号就行。
内容的提问来源于stack exchange,提问作者alexP_Keaton
相关产品推荐
相关产品推荐

