You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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,运行时优先加载该版本文件。

方案二:修改集群依赖或提交参数

  1. 替换集群中的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
      

    注意:所有工作节点都需要执行相同操作,适合固定集群环境。

  2. 提交应用时指定依赖优先级:
    通过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的包路径重命名,彻底隔离集群中的冲突版本:

  1. 在project/plugins.sbt中添加插件:
    addSbtPlugin("com.eed3si9n" % "sbt-shade" % "1.7.1")
    
  2. 在build.sbt中配置重命名规则:
    shadeRules in assembly := Seq(
      ShadeRule.rename("org.yaml.snakeyaml.**" -> "your.project.shaded.org.yaml.snakeyaml.@1").inAll
    )
    
    打包后应用会使用重命名后的包,完全避开集群中的版本冲突。

内容的提问来源于stack exchange,提问作者chanchal ahuja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:42:53