为了账号安全,请及时绑定邮箱和手机立即绑定

解决ApacheSPark中的依赖问题

解决ApacheSPark中的依赖问题

红糖糍粑 2019-06-03 17:25:28
解决ApacheSPark中的依赖问题在构建和部署星火应用程序时,常见的问题是:java.lang.ClassNotFoundException.object x is not a member of package y编译错误。java.lang.NoSuchMethodError如何解决这些问题?
查看完整描述

4 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

在构建和部署星火应用程序时,所有依赖项都需要兼容版本。

  • Scala版本..所有软件包都必须使用相同的主要(2.10,2.11,2.12)Scala版本。

    考虑以下(不正确)build.sbt:

    name := "Simple Project"version := "1.0"libraryDependencies ++= Seq(
       "org.apache.spark" % "spark-core_2.11" % "2.0.1",
       "org.apache.spark" % "spark-streaming_2.10" % "2.0.1",
       "org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1")

    我们用spark-streaming对于Scala2.10,剩下的包用于Scala2.11。一个有效文件可能是

    name := "Simple Project"version := "1.0"libraryDependencies ++= Seq(
       "org.apache.spark" % "spark-core_2.11" % "2.0.1",
       "org.apache.spark" % "spark-streaming_2.11" % "2.0.1",
       "org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1")

    但是最好是全局指定版本并使用%%:

    name := "Simple Project"version := "1.0"scalaVersion := "2.11.7"libraryDependencies ++= Seq(
       "org.apache.spark" %% "spark-core" % "2.0.1",
       "org.apache.spark" %% "spark-streaming" % "2.0.1",
       "org.apache.bahir" %% "spark-streaming-twitter" % "2.0.1")

    同样,在Maven中:

    <project>
      <groupId>com.example</groupId>
      <artifactId>simple-project</artifactId>
      <modelVersion>4.0.0</modelVersion>
      <name>Simple Project</name>
      <packaging>jar</packaging>
      <version>1.0</version>
      <properties>
        <spark.version>2.0.1</spark.version>
      </properties> 
      <dependencies>
        <dependency> <!-- Spark dependency -->
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-core_2.11</artifactId>
          <version>${spark.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-streaming_2.11</artifactId>
          <version>${spark.version}</version>
        </dependency> 
        <dependency>
          <groupId>org.apache.bahir</groupId>
          <artifactId>spark-streaming-twitter_2.11</artifactId>
          <version>${spark.version}</version>
        </dependency>
      </dependencies></project>
  • 火花版所有软件包都必须使用相同的主要SPark版本(1.6、2.0、2.1、.)。

    考虑以下(不正确的)构建:

    name := "Simple Project"version := "1.0"libraryDependencies ++= Seq(
       "org.apache.spark" % "spark-core_2.11" % "1.6.1",
       "org.apache.spark" % "spark-streaming_2.10" % "2.0.1",
       "org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1")

    我们用spark-core1.6其余组件在Spark2.0中。一个有效文件可能是

    name := "Simple Project"version := "1.0"libraryDependencies ++= Seq(
       "org.apache.spark" % "spark-core_2.11" % "2.0.1",
       "org.apache.spark" % "spark-streaming_2.10" % "2.0.1",
       "org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1")

    但是最好使用一个变量:

    name := "Simple Project"version := "1.0"val sparkVersion = "2.0.1"libraryDependencies ++= Seq(
       "org.apache.spark" % "spark-core_2.11" % sparkVersion,
       "org.apache.spark" % "spark-streaming_2.10" % sparkVersion,
       "org.apache.bahir" % "spark-streaming-twitter_2.11" % sparkVersion)

    同样,在Maven中:

    <project>
      <groupId>com.example</groupId>
      <artifactId>simple-project</artifactId>
      <modelVersion>4.0.0</modelVersion>
      <name>Simple Project</name>
      <packaging>jar</packaging>
      <version>1.0</version>
      <properties>
        <spark.version>2.0.1</spark.version>
        <scala.version>2.11</scala.version>
      </properties> 
      <dependencies>
        <dependency> <!-- Spark dependency -->
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-core_${scala.version}</artifactId>
          <version>${spark.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-streaming_${scala.version}</artifactId>
          <version>${spark.version}</version>
        </dependency> 
        <dependency>
          <groupId>org.apache.bahir</groupId>
          <artifactId>spark-streaming-twitter_${scala.version}</artifactId>
          <version>${spark.version}</version>
        </dependency>
      </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存储库获取依赖项。


查看完整回答
反对 回复 2019-06-03
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

除了user 7337271已经给出的非常广泛的答案之外,如果问题是由于缺少外部依赖关系而导致的,那么您可以使用以下方法构建一个JAR。Maven组装插件

在这种情况下,请确保将构建系统中的所有核心火花依赖项标记为“提供”,并确保它们与运行时星火版本相关联。


查看完整回答
反对 回复 2019-06-03
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

应用程序的依赖类将在应用-JAR选择你的发射命令。

更多详细信息可在火花文档

摘自文件:

application-jar:绑定JAR的路径,包括应用程序和所有依赖项。URL必须在集群中全局可见,例如,hdfs:/path或所有节点上存在的文件:/path


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 2426 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信