使用Spark-Nebula-Connector时遭遇Guava版本冲突求解决方案
解决Spark与NebulaGraph Connector的Guava版本冲突问题
针对Spark(依赖Guava 27.0-jre)和nebula-java客户端(依赖Guava 14)的版本冲突问题,以下是几种可行的解决方法:
1. 使用Shade/Shadow插件重命名nebula依赖的Guava包
这是最可靠的解决方案,通过构建工具将nebula-java依赖的Guava包重命名为独立命名空间,彻底避免与Spark的Guava版本冲突。
Maven配置示例
修改项目的pom.xml,添加Maven Shade插件并配置包重定向规则:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <!-- 将nebula依赖的Guava包重命名到独立路径 --> <relocation> <pattern>com.google.common</pattern> <shadedPattern>com.google.common.nebula</shadedPattern> </relocation> </relocations> <!-- 配置主类(如果打包为可执行JAR) --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>your.main.class.path</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
Gradle配置示例
使用Gradle Shadow插件,在build.gradle中添加:
plugins { id 'com.github.johnrengelman.shadow' version '7.1.2' } shadowJar { // 重命名Guava包至独立命名空间 relocate 'com.google.common', 'com.google.common.nebula' // 指定主类(若需生成可执行JAR) manifest { attributes 'Main-Class': 'your.main.class.path' } }
执行gradle shadowJar生成包含重命名依赖的JAR包,提交Spark任务时使用该JAR即可。
2. 调整Spark任务提交时的依赖隔离策略(临时方案)
若无法修改项目构建配置,可尝试在提交Spark任务时通过参数控制依赖加载顺序,但此方法稳定性较低:
spark-submit \ --class your.main.class \ --jars path/to/shaded-nebula-connector.jar \ --driver-class-path path/to/shaded-nebula-connector.jar:path/to/guava-27.0-jre.jar \ your-application.jar
注意:不建议直接排除Spark默认的Guava依赖,可能引发其他组件的兼容性问题。
3. 升级NebulaGraph及Connector版本(若业务允许)
检查nebula-java的后续版本(如v3.5+),部分新版本已将Guava依赖升级至21.0及以上,与Spark 2.4的Guava 27兼容性更好。如果业务允许升级NebulaGraph集群至对应版本,可直接使用新版本的connector解决冲突。
内容的提问来源于stack exchange,提问作者Lisa Liu
相关产品推荐
相关产品推荐

