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"
)
1条答案
按热度按时间z0qdvdin1#
要解决这个问题,你需要做两件事。1) 删除重复的protobuf库,以便只有一个版本可用。2) 修复任何不使用spark使用的protobuff版本的代码。
我最喜欢的一个快速而肮脏的技巧就是在intellij中搜索冲突类,在这里是“描述符”。这将显示包含该类的所有jar。一旦确定了哪些jar引入了冲突类,就可以删除其中一个。很有可能它将是最简单的只是匹配spark版本的protobuf。
如果你仔细检查maven中的依赖项,它似乎应该使用v2.5.0,因此其他依赖项可能会引入它。
您可能需要检查代码以匹配此版本。你的错误的完整堆栈跟踪是什么?是您的代码调用protobuf函数还是另一个库?如果它是另一个库,您可能需要分叉该库以使其与sparks依赖项兼容。