【问题标题】:Method unknown error on cluster, works locally - both spark versions are identical集群上的方法未知错误,在本地工作 - 两个火花版本是相同的
【发布时间】:2017-03-17 17:41:23
【问题描述】:

我在 Spark v1.6.0 上使用 spark.ml.util.SchemaUtils 时遇到问题。我收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.ml.util.SchemaUtils$.appendColumn(Lorg/apache/spark/sql/types/StructType;Ljava/lang/String;Lorg/apache/spark/sql/types/DataType;)Lorg/apache/spark/sql/types/StructType;
        at org.apache.spark.ml.SchemaTest$.main(SchemaTest.scala:17)

在我的集群上运行这个最小示例时(灵感来自我最终想要使用的 library):

package org.apache.spark.ml

import org.apache.spark.ml.util.SchemaUtils
import org.apache.spark.sql.types._
import org.apache.spark.mllib.linalg.VectorUDT

object SchemaTest {

  def main(args: Array[String]): Unit = {
    val schema: StructType =
      StructType(
        StructField("a", IntegerType, true) :: StructField("b", LongType, false) :: Nil
      )

    val transformed = SchemaUtils.appendColumn(schema, "test", new VectorUDT())

  }
}

但是,在我的桌面上本地启动的相同示例运行没有问题。

从我在网上看到的(例如here),这种错误信息通常与编译和运行环境之间的版本不匹配有关,但是我的程序,我的本地spark分布和我的集群分布都有相同的 Spark 和 mllib 版本 v1.6.0、相同的 Scala 版本 v2.10.6 和相同的 Java 版本 v7。

我检查了 Spark 1.6.0 源代码,并且在 org.apache.spark.ml.util.SchemaUtils 中确实存在 appendColumn,并且具有正确的签名(但 org.apache.spark.ml 中没有提及 SchemaUtils。 util API 文档)。

预计到达时间: 从我的 pom.xml 文件中提取:

 <dependencies>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.10.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>1.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.10</artifactId>
        <version>1.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.10</artifactId>
        <version>1.6.0</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

【问题讨论】:

    标签: scala apache-spark apache-spark-1.6


    【解决方案1】:

    您需要检查所有可以更改集群上运行的作业的类路径的位置。例如,这些属性:

    • spark.driver.extraClassPath
    • spark.driver.userClassPathFirst
    • spark.executor.extraClassPath
    • spark.executor.userClassPathFirst

    您还应该检查您的组装过程,以确保您认为要打包的依赖项实际上就是您要打包的。

    【讨论】:

    • 我本地 spark 上的 conf 文件是空的,集群上 Spark UI 的 Environement 选项卡没有显示 ClassPath 的任何参数,所以我假设两个版本都默认使用这些值。我的包装似乎也为所有人提供了正确的版本(我将 pom 依赖项添加到我的 OP 中)。
    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多