NoClassDefFoundError: org/apache/spark/sql/internal/connector/SimpleTableProvider 在 Dataproc 中运行时
Posted
技术标签:
【中文标题】NoClassDefFoundError: org/apache/spark/sql/internal/connector/SimpleTableProvider 在 Dataproc 中运行时【英文标题】:NoClassDefFoundError: org/apache/spark/sql/internal/connector/SimpleTableProvider when running in Dataproc 【发布时间】:2020-11-05 08:02:54 【问题描述】:我可以在独立模式下运行我的程序。 但是当我尝试在集群模式下在 Dataproc 中运行时,出现以下错误。 PL帮助。 我的 build.sbt
name := "spark-kafka-streaming"
version := "0.1"
scalaVersion := "2.12.10"
val sparkVersion = "2.4.5"
libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion % "provided"
libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion % "provided"
libraryDependencies += "com.google.cloud.bigdataoss" % "gcs-connector" % "hadoop2-2.1.3"
libraryDependencies += "org.apache.spark" %% "spark-sql-kafka-0-10" % sparkVersion
assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false)
assemblyJarName in assembly := s"$name.value_$scalaBinaryVersion.value-$sparkVersion_$version.value.jar"
assemblyMergeStrategy in assembly :=
case PathList("org","aopalliance", xs @ _*) => MergeStrategy.last
case PathList("javax", "inject", xs @ _*) => MergeStrategy.last
case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last
case PathList("javax", "activation", xs @ _*) => MergeStrategy.last
case PathList("org", "apache", xs @ _*) => MergeStrategy.last
case PathList("com", "google", xs @ _*) => MergeStrategy.last
case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last
case PathList("com", "codahale", xs @ _*) => MergeStrategy.last
case PathList("com", "yammer", xs @ _*) => MergeStrategy.last
case "about.html" => MergeStrategy.rename
case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last
case "META-INF/mailcap" => MergeStrategy.last
case "META-INF/mimetypes.default" => MergeStrategy.last
case "plugin.properties" => MergeStrategy.last
case "log4j.properties" => MergeStrategy.last
case y: String if y.contains("UnusedStubClass") => MergeStrategy.first
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
引起:java.lang.ClassNotFoundException: org.apache.spark.sql.internal.connector.SimpleTableProvider 在 java.net.URLClassLoader.findClass(URLClassLoader.java:382) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:418) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:351)
使用的命令: spark-submit --class Main --master yarn --deploy-mode cluster --num-executors 1 --driver-memory 4g --executor-cores 4 --executor-memory 4g --files x.json y.jar
编辑:
集群配置:图片:1.5.4-debian10 spark-submit --version 版本 2.4.5 使用 Scala 版本 2.12.10,OpenJDK 64-Bit Server VM,1.8.0_252
Jar- 使用命令 sbt 程序集构建 Uber jar。
Gcloud 命令:gcloud dataproc 作业提交 spark --cluster=xyz --region=us-west1 --class=Main --files x.json --jars=spark-kafka-streaming_2.12-3.0.0_0.1.jar
日志:
错误 org.apache.spark.deploy.yarn.Client:应用程序诊断消息:用户类抛出异常:java.lang.NoClassDefFoundError: org/apache/spark/sql/internal/connector/SimpleTableProvider 在 java.lang.ClassLoader.defineClass1(本机方法)在 java.lang.ClassLoader.defineClass(ClassLoader.java:756) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:468) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:74) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:369) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:363) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:362) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:418) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:351) 在 java.lang.Class.forName0(本机方法)在 java.lang.Class.forName(Class.java:348) 在 java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:370) 在 java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404) 在 java.util.ServiceLoader$1.next(ServiceLoader.java:480) 在 scala.collection.convert.Wrappers$JIteratorWrapper.next(Wrappers.scala:44) 在 scala.collection.Iterator.foreach(Iterator.scala:941) 在 scala.collection.Iterator.foreach$(Iterator.scala:941) 在 scala.collection.AbstractIterator.foreach(Iterator.scala:1429) 在 scala.collection.IterableLike.foreach(IterableLike.scala:74) 在 scala.collection.IterableLike.foreach$(IterableLike.scala:73) 在 scala.collection.AbstractIterable.foreach(Iterable.scala:56) 在 scala.collection.TraversableLike.filterImpl(TraversableLike.scala:255) 在 scala.collection.TraversableLike.filterImpl$(TraversableLike.scala:249) 在 scala.collection.AbstractTraversable.filterImpl(Traversable.scala:108) 在 scala.collection.TraversableLike.filter(TraversableLike.scala:347) 在 scala.collection.TraversableLike.filter$(TraversableLike.scala:347) 在 scala.collection.AbstractTraversable.filter(Traversable.scala:108) 在 org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:630) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:194) 在 org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:645) 在 org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:629) 在 Lineage$.delayedEndpoint$Lineage$1(Lineage.scala:17) 在 Lineage$delayedInit$body.apply(Lineage.scala:3) 在 scala.Function0.apply$mcV$sp(Function0.scala:39) 在 scala.Function0.apply$mcV$sp$(Function0.scala:39) 在 scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17) 在 scala.App.$anonfun$main$1$adapted(App.scala:80) 在 scala.collection.immutable.List.foreach(List.scala:392) 在 scala.App.main(App.scala:80) 在 scala.App.main$(App.scala:78) 在 Lineage$.main(Lineage.scala:3) 在 Lineage.main(Lineage.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:686) 引起:java.lang.ClassNotFoundException: org.apache.spark.sql.internal.connector.SimpleTableProvider 在 java.net.URLClassLoader.findClass(URLClassLoader.java:382) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:418) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 49 更多
根本原因和解决方案: 正如答案中所指出的,这是罐子的问题。一世 正在使用 IDEA sbt shell 来构建 jar。以及所做的任何更改 启动 shell 后不会再次加载 build.sbt。所以, 虽然我改变了版本,但它没有被选中,直到我重新启动 又是 sbt 外壳。学得很辛苦。
【问题讨论】:
可以加spark-submit --version
吗?您似乎使用的是 Spark 3(不是 2.4.5),因为 CNFE 用于 SimpleTableProvider
,刚刚添加到 v3.0.0-rc1。
你能显示你用来创建集群的命令吗?它是哪个图像版本(1.3、1.4、1.5)?你为什么不使用 gcloud jobs submit spark
命令 - 它会采用正确的 spark 版本
@JacekLaskowski,Spark 版本是 2.4.5。我已经登录到主节点并获得了这个版本。这是我在出现此问题时进行交叉检查的第一步。
@DavidRabinowitz,Dataproc 集群映像是 1.5.4-debian10,即 spark 2.4.5。我已经登录到主节点并提交了作业。我认为这可以让我更好地控制纱线命令。但无论如何,我想这不会有什么不同,因为 spark 版本是集群中的 2.4.5。
能否请您登录系统并执行spark-submit --version
。 y.jar
是什么?什么命令创建它?添加问题的答案。谢谢。
【参考方案1】:
基于 assemblyJarName in assembly := s"$name.value$scalaBinaryVersion.value-$sparkVersion$version.value.jar" 你的 jar 名称应该有是 spark-kafka-streaming_2.12-2.4.5_0.1.jar。实际的 jar 名称暗示您可能正在使用 spark 3.0.0 API 并在 spark 2.4.5 上部署
【讨论】:
【参考方案2】:引起:java.lang.ClassNotFoundException: org.apache.spark.sql.internal.connector.SimpleTableProvider
org.apache.spark.sql.internal.connector.SimpleTableProvider 已添加到 v3.0.0-rc1 中,因此您使用的是 Spark 3.0.0 中的 spark-submit
(我猜)。
我现在才注意到您使用了--master yarn
,并且在org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:686)
处引发了异常。
我对 Dataproc 一无所知,但您应该检查 YARN / Dataproc 的配置,并确保它们可能不使用 Spark 3。
【讨论】:
以上是关于NoClassDefFoundError: org/apache/spark/sql/internal/connector/SimpleTableProvider 在 Dataproc 中运行时的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.NoClassDefFoundError: org/hibernate/QueryTimeoutException
出现错误 java.lang.NoClassDefFoundError: org/mockito/MockitoAnnotations$Mock
错误 500 - NoClassDefFoundError: org/hsqldb/lib/LongValueHashMap
java.lang.NoClassDefFoundError:org/json/JSONObject [重复]
java.lang.NoClassDefFoundError: org/springframework/util/MultiValueMap
异常java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory