猿问

解决ApacheSPark中的依赖问题

解决ApacheSPark中的依赖问题

在构建和部署星火应用程序时,常见的问题是:

  • java.lang.ClassNotFoundException.

  • object x is not a member of package y

    编译错误。
  • java.lang.NoSuchMethodError

如何解决这些问题?


红糖糍粑
浏览 2428回答 4
4回答

侃侃尔雅

在构建和部署星火应用程序时,所有依赖项都需要兼容版本。Scala版本..所有软件包都必须使用相同的主要(2.10,2.11,2.12)Scala版本。考虑以下(不正确)build.sbt:name&nbsp;:=&nbsp;"Simple&nbsp;Project"version&nbsp;:=&nbsp;"1.0"libraryDependencies&nbsp;++=&nbsp;Seq( &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-core_2.11"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-streaming_2.10"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.bahir"&nbsp;%&nbsp;"spark-streaming-twitter_2.11"&nbsp;%&nbsp;"2.0.1")我们用spark-streaming对于Scala2.10,剩下的包用于Scala2.11。一个有效文件可能是name&nbsp;:=&nbsp;"Simple&nbsp;Project"version&nbsp;:=&nbsp;"1.0"libraryDependencies&nbsp;++=&nbsp;Seq( &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-core_2.11"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-streaming_2.11"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.bahir"&nbsp;%&nbsp;"spark-streaming-twitter_2.11"&nbsp;%&nbsp;"2.0.1")但是最好是全局指定版本并使用%%:name&nbsp;:=&nbsp;"Simple&nbsp;Project"version&nbsp;:=&nbsp;"1.0"scalaVersion&nbsp;:=&nbsp;"2.11.7"libraryDependencies&nbsp;++=&nbsp;Seq( &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%%&nbsp;"spark-core"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%%&nbsp;"spark-streaming"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.bahir"&nbsp;%%&nbsp;"spark-streaming-twitter"&nbsp;%&nbsp;"2.0.1")同样,在Maven中:<project> &nbsp;&nbsp;<groupId>com.example</groupId> &nbsp;&nbsp;<artifactId>simple-project</artifactId> &nbsp;&nbsp;<modelVersion>4.0.0</modelVersion> &nbsp;&nbsp;<name>Simple&nbsp;Project</name> &nbsp;&nbsp;<packaging>jar</packaging> &nbsp;&nbsp;<version>1.0</version> &nbsp;&nbsp;<properties> &nbsp;&nbsp;&nbsp;&nbsp;<spark.version>2.0.1</spark.version> &nbsp;&nbsp;</properties>&nbsp; &nbsp;&nbsp;<dependencies> &nbsp;&nbsp;&nbsp;&nbsp;<dependency>&nbsp;<!--&nbsp;Spark&nbsp;dependency&nbsp;--> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<groupId>org.apache.spark</groupId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<artifactId>spark-core_2.11</artifactId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<version>${spark.version}</version> &nbsp;&nbsp;&nbsp;&nbsp;</dependency> &nbsp;&nbsp;&nbsp;&nbsp;<dependency> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<groupId>org.apache.spark</groupId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<artifactId>spark-streaming_2.11</artifactId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<version>${spark.version}</version> &nbsp;&nbsp;&nbsp;&nbsp;</dependency>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<dependency> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<groupId>org.apache.bahir</groupId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<artifactId>spark-streaming-twitter_2.11</artifactId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<version>${spark.version}</version> &nbsp;&nbsp;&nbsp;&nbsp;</dependency> &nbsp;&nbsp;</dependencies></project>火花版所有软件包都必须使用相同的主要SPark版本(1.6、2.0、2.1、.)。考虑以下(不正确的)构建:name&nbsp;:=&nbsp;"Simple&nbsp;Project"version&nbsp;:=&nbsp;"1.0"libraryDependencies&nbsp;++=&nbsp;Seq( &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-core_2.11"&nbsp;%&nbsp;"1.6.1", &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-streaming_2.10"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.bahir"&nbsp;%&nbsp;"spark-streaming-twitter_2.11"&nbsp;%&nbsp;"2.0.1")我们用spark-core1.6其余组件在Spark2.0中。一个有效文件可能是name&nbsp;:=&nbsp;"Simple&nbsp;Project"version&nbsp;:=&nbsp;"1.0"libraryDependencies&nbsp;++=&nbsp;Seq( &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-core_2.11"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-streaming_2.10"&nbsp;%&nbsp;"2.0.1", &nbsp;&nbsp;&nbsp;"org.apache.bahir"&nbsp;%&nbsp;"spark-streaming-twitter_2.11"&nbsp;%&nbsp;"2.0.1")但是最好使用一个变量:name&nbsp;:=&nbsp;"Simple&nbsp;Project"version&nbsp;:=&nbsp;"1.0"val&nbsp;sparkVersion&nbsp;=&nbsp;"2.0.1"libraryDependencies&nbsp;++=&nbsp;Seq( &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-core_2.11"&nbsp;%&nbsp;sparkVersion, &nbsp;&nbsp;&nbsp;"org.apache.spark"&nbsp;%&nbsp;"spark-streaming_2.10"&nbsp;%&nbsp;sparkVersion, &nbsp;&nbsp;&nbsp;"org.apache.bahir"&nbsp;%&nbsp;"spark-streaming-twitter_2.11"&nbsp;%&nbsp;sparkVersion)同样,在Maven中:<project> &nbsp;&nbsp;<groupId>com.example</groupId> &nbsp;&nbsp;<artifactId>simple-project</artifactId> &nbsp;&nbsp;<modelVersion>4.0.0</modelVersion> &nbsp;&nbsp;<name>Simple&nbsp;Project</name> &nbsp;&nbsp;<packaging>jar</packaging> &nbsp;&nbsp;<version>1.0</version> &nbsp;&nbsp;<properties> &nbsp;&nbsp;&nbsp;&nbsp;<spark.version>2.0.1</spark.version> &nbsp;&nbsp;&nbsp;&nbsp;<scala.version>2.11</scala.version> &nbsp;&nbsp;</properties>&nbsp; &nbsp;&nbsp;<dependencies> &nbsp;&nbsp;&nbsp;&nbsp;<dependency>&nbsp;<!--&nbsp;Spark&nbsp;dependency&nbsp;--> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<groupId>org.apache.spark</groupId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<artifactId>spark-core_${scala.version}</artifactId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<version>${spark.version}</version> &nbsp;&nbsp;&nbsp;&nbsp;</dependency> &nbsp;&nbsp;&nbsp;&nbsp;<dependency> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<groupId>org.apache.spark</groupId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<artifactId>spark-streaming_${scala.version}</artifactId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<version>${spark.version}</version> &nbsp;&nbsp;&nbsp;&nbsp;</dependency>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<dependency> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<groupId>org.apache.bahir</groupId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<artifactId>spark-streaming-twitter_${scala.version}</artifactId> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<version>${spark.version}</version> &nbsp;&nbsp;&nbsp;&nbsp;</dependency> &nbsp;&nbsp;</dependencies></project>星火依赖项中使用的星火版本必须与星火安装版本相匹配。例如,如果在集群上使用1.6.1,则必须使用1.6.1来构建JAR。小版本的不匹配并不总是被接受的。用于构建JAR的Scala版本必须与用于构建已部署的SPark的Scala版本相匹配。默认情况下(可下载的二进制文件和默认构建):星火1.x->Scala2.10星火2.x->Scala2.11如果包含在FAT JAR中,则应该可以在工作节点上访问其他包。有许多选择,包括:在群集节点中提交时,应包括应用程序。jar在……里面--jars.--jars主张spark-submit-在当地分发jar档案。--packages主张spark-submit-从Maven存储库获取依赖项。

扬帆大鱼

除了user 7337271已经给出的非常广泛的答案之外,如果问题是由于缺少外部依赖关系而导致的,那么您可以使用以下方法构建一个JAR。Maven组装插件在这种情况下,请确保将构建系统中的所有核心火花依赖项标记为“提供”,并确保它们与运行时星火版本相关联。

德玛西亚99

应用程序的依赖类将在应用-JAR选择你的发射命令。更多详细信息可在火花文档摘自文件:application-jar:绑定JAR的路径,包括应用程序和所有依赖项。URL必须在集群中全局可见,例如,hdfs:/path或所有节点上存在的文件:/path
随时随地看视频慕课网APP

相关分类

Java
我要回答