spark submit不使用protobuf依赖项

wnavrhmk  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(1240)

apachespark:3.0.0协议:3.5.1
例外情况: "main" java.lang.NoSuchMethodError: com.google.protobuf.Descriptors$Descriptor.getOneofs()Ljava/util/List; 问题:在本地kubernetes上提交spake scala应用程序时,我得到: "java.lang.NoSuchMethodError: com.google.protobuf.Descriptors$Descriptor.getOneofs()Ljava/util/List;" 似乎对protobuff的依赖存在冲突。
我试过一些事情,比如https://github.com/nats-io/stan.java/issues/20 但什么都没用。
我的版本.sbt:

name := "test"

version := "0.1"
scalaVersion := "2.12.8"

val sparkVersion = "3.0.0"
val protobufVersion = "3.5.1"

resolvers += "confluent" at "http://packages.confluent.io/maven/"
resolvers += Resolver.jcenterRepo
resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven"

assemblyMergeStrategy in assembly := {
  case "META-INF/services/org.apache.spark.sql.sources.DataSourceRegister" => MergeStrategy.concat
  case PathList("META-INF", xs@_*) => MergeStrategy.discard
  case "application.conf" => MergeStrategy.concat
  case x => MergeStrategy.first
}

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("com.google.protobuf.*" -> "shadedproto.@1").inProject
    .inLibrary("com.google.protobuf" % "protobuf-java" % protobufVersion)
)

coverageEnabled.in(ThisBuild, IntegrationTest, test) := true

//skipping test cases during package
test in assembly := {}

lazy val server = (project in file("."))
  .configs(IntegrationTest)
  .settings(Defaults.itSettings)

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-sql" % sparkVersion % Provided,
  "org.apache.spark" %% "spark-sql-kafka-0-10" % sparkVersion,
  "org.apache.kafka" % "kafka-clients" % "2.2.1",
  "org.postgresql" % "postgresql" % postgreSqlVersion,
  "com.google.protobuf" % "protobuf-java" % protobufVersion,
  "com.typesafe" % "config" % "1.4.0"
)
z0qdvdin

z0qdvdin1#

要解决这个问题,你需要做两件事。1) 删除重复的protobuf库,以便只有一个版本可用。2) 修复任何不使用spark使用的protobuff版本的代码。
我最喜欢的一个快速而肮脏的技巧就是在intellij中搜索冲突类,在这里是“描述符”。这将显示包含该类的所有jar。一旦确定了哪些jar引入了冲突类,就可以删除其中一个。很有可能它将是最简单的只是匹配spark版本的protobuf。

如果你仔细检查maven中的依赖项,它似乎应该使用v2.5.0,因此其他依赖项可能会引入它。
您可能需要检查代码以匹配此版本。你的错误的完整堆栈跟踪是什么?是您的代码调用protobuf函数还是另一个库?如果它是另一个库,您可能需要分叉该库以使其与sparks依赖项兼容。

相关问题