如何解决SBT构建Spark作业中SnakeYaml版本冲突导致的Yaml文件大小问题
解决Dataproc集群中SnakeYaml版本冲突的方案
方案一:通过sbt assembly强制锁定依赖版本
在build.sbt中明确排除moultingyaml自带的snakeyaml,手动引入1.26版本,并配置合并策略优先使用该版本:
// 排除moultingyaml自带的snakeyaml依赖 libraryDependencies += "net.jcazevedo" %% "moultingyaml" % "0.4.1" exclude("org.yaml", "snakeyaml") // 手动指定snakeyaml 1.26版本 libraryDependencies += "org.yaml" % "snakeyaml" % "1.26" // 配置assembly合并策略,优先保留指定版本的文件 assemblyMergeStrategy in assembly := { case PathList("org", "yaml", "snakeyaml", xs @ _*) => MergeStrategy.first case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) }
打包后的jar会包含snakeyaml 1.26,运行时优先加载该版本文件。
方案二:修改集群依赖或提交参数
替换集群中的snakeyaml jar:
- 先备份原有jar:
sudo cp /usr/lib/spark/jars/snakeyaml-2.0.jar /usr/lib/spark/jars/snakeyaml-2.0.jar.bak sudo cp /usr/lib/hadoop-yarn/lib/snakeyaml-2.0.jar /usr/lib/hadoop-yarn/lib/snakeyaml-2.0.jar.bak - 上传snakeyaml-1.26.jar到集群并替换:
# 本地jar上传到主节点tmp目录 scp snakeyaml-1.26.jar <主节点用户名>@<主节点IP>:/tmp/ # 复制到Spark和Hadoop依赖目录 sudo cp /tmp/snakeyaml-1.26.jar /usr/lib/spark/jars/ sudo cp /tmp/snakeyaml-1.26.jar /usr/lib/hadoop-yarn/lib/ - 重启相关服务:
sudo systemctl restart spark-master spark-worker sudo systemctl restart hadoop-yarn-resourcemanager hadoop-yarn-nodemanager
注意:所有工作节点都需要执行相同操作,适合固定集群环境。
- 先备份原有jar:
提交应用时指定依赖优先级:
通过Spark提交参数强制优先加载snakeyaml 1.26:spark-submit \ --class your.main.Class \ --jars /path/to/snakeyaml-1.26.jar \ --conf spark.driver.extraClassPath=/path/to/snakeyaml-1.26.jar \ --conf spark.executor.extraClassPath=/path/to/snakeyaml-1.26.jar \ your-assembly.jar无需修改集群环境,适合临时测试或动态集群场景。
方案三:用Shade插件重命名依赖包
通过sbt-shade插件将snakeyaml 1.26的包路径重命名,彻底隔离集群中的冲突版本:
- 在
project/plugins.sbt中添加插件:addSbtPlugin("com.eed3si9n" % "sbt-shade" % "1.7.1") - 在
build.sbt中配置重命名规则:
打包后应用会使用重命名后的包,完全避开集群中的版本冲突。shadeRules in assembly := Seq( ShadeRule.rename("org.yaml.snakeyaml.**" -> "your.project.shaded.org.yaml.snakeyaml.@1").inAll )
内容的提问来源于stack exchange,提问作者chanchal ahuja
相关产品推荐
相关产品推荐

