【问题标题】:Runtime error on Scala Spark 2.0 codeScala Spark 2.0 代码上的运行时错误
【发布时间】:2017-11-18 08:32:50
【问题描述】:

我有以下代码:

import org.apache.spark.sql.SparkSession
        .
        .
        .
    val spark = SparkSession
      .builder()
      .appName("PTAMachineLearner")
      .getOrCreate()

当它执行时,我收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;
    at org.apache.spark.sql.SparkSession$Builder.config(SparkSession.scala:750)
    at org.apache.spark.sql.SparkSession$Builder.appName(SparkSession.scala:741)
    at com.acme.pta.accuracy.ml.PTAMachineLearnerModel.getDF(PTAMachineLearnerModel.scala:52)

代码编译和构建都很好。以下是依赖项:

scalaVersion := "2.11.11"
libraryDependencies ++= Seq(
  // Spark dependencies
  "org.apache.spark" %% "spark-hive" % "2.1.1",
  "org.apache.spark" %% "spark-mllib" % "2.1.1",
  // Third-party libraries
  "net.sf.jopt-simple" % "jopt-simple" % "5.0.3",
  "com.amazonaws" % "aws-java-sdk" % "1.3.11",
  "org.apache.logging.log4j" % "log4j-api" % "2.8.2",
  "org.apache.logging.log4j" % "log4j-core" % "2.8.2",
  "org.apache.logging.log4j" %% "log4j-api-scala" % "2.8.2",
  "com.typesafe.play" %% "play-ahc-ws-standalone" % "1.0.0-M9",
  "net.liftweb" % "lift-json_2.11" % "3.0.1"
)

我正在执行这样的代码:

/Users/paulreiners/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
      --class "com.acme.pta.accuracy.ml.CreateRandomForestRegressionModel" \
      --master local[4] \
      target/scala-2.11/acme-pta-accuracy-ocean.jar \

我在 Spark 1.6 上运行了这一切。我正在尝试升级到 Spark 2,但缺少一些东西。

【问题讨论】:

  • 看起来是包有问题。缺少 Scala 标准库。
  • 如何解决这个问题?
  • 将 scala-library-2.11.jar 添加到类路径或放入 jar。这取决于您的部署过程。

标签: scala apache-spark sbt spark-submit


【解决方案1】:

ArrowAssoc 类确实存在于您的 Scala 库中。见this Scala doc。但是您在 Spark 库中遇到错误。很明显,您使用的 Spark 版本与 Scala 2.11 版不兼容,因为它可能是用旧的 Scala 版本编译的。如果您看到 this older Scala API doc ,则 ArrowSpec 发生了很大变化。例如它现在是隐式的,有很多隐式依赖。确保您的 Spark 和 Scala 版本兼容。

【讨论】:

  • 我想至少使用 Spark 2.0,因为这是第一个具有我需要的模型保存和加载功能的版本。那么我需要什么版本的 Scala,在哪里可以找到呢?
  • 我使用的是兼容版本:“对于 Scala API,Spark 2.1.1 使用 Scala 2.11。您需要使用兼容的 Scala 版本 (2.11.x)。”来自spark.apache.org/docs/latest
  • @paul 你的依赖是正确的。运行时环境中的问题。 1)如果您在工作节点上预装了库,那么我想您需要更新它。 spark-1.6 默认使用 scala-2.10。 2)如果你部署fat jar那么你的包装是错误的(例如sbt-assembly设置)。
  • 我正在部署一个胖 JAR。我在程序集设置中没有看到任何特定于我正在使用的 Scala 版本的内容。
  • 我确实在 build.sbt 中找到了这个: // 将 Scala 本身从我们的程序集 JAR 中排除的特殊选项,因为 Spark // 已经捆绑在 Scala 中。 assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false) 所以我将 false 更改为 true,但这并没有解决它。所以我删除了那行,但这也没有解决它。
【解决方案2】:

我发现了问题。我的系统上安装了 Scala 2.10.5。所以 sbt 或 spark-submit 都在调用它并期待 2.11.11。

【讨论】:

    【解决方案3】:

    我有同样的问题。但是,就我而言,问题在于我将 jar 部署在 Spark1.x 集群中,因为代码是用 Spark2.x 编写的。

    因此,如果您看到此错误,只需对照各自安装的版本检查代码中使用的 spark 和 scala 版本即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多