Ошибка метода неизвестна на кластере, работает локально - обе версии свечи идентичны

У меня проблема с использованием spark.ml.util.SchemaUtils на Spark v1.6.0. Я получаю следующую ошибку:

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)

при выполнении этого минимального примера на моем кластере (вдохновленный библиотекой, которую я в конечном итоге хочу использовать):

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())

  }
}

Однако тот же пример, запущенный локально на моем рабочем столе, работает без проблем.

Из того, что я видел в Интернете (например, здесь), такого рода сообщения об ошибках часто связаны с несоответствием версий между средами компиляции и среды выполнения, но моя программа, локальный дистрибутив Spark и мой кластерный дистрибутив имеют одинаковые версии Spark & ​​mllib. v1.6.0, та же версия Scala v2.10.6 и та же версия Java v7.

Я проверил исходный код Spark 1.6.0, и appendColumn существует в org.apache.spark.ml.util.SchemaUtils с правильной подписью (но SchemaUtils не упоминается в документации API org.apache.spark.ml.util API).

ETA: Извлечь из моего файла 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>

1 ответ

Вам нужно проверить все места, где вы можете изменить путь к классу для заданий, запущенных в кластере. Например, эти свойства:

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

Вам также следует изучить процесс сборки, чтобы убедиться, что зависимости, которые, по вашему мнению, вы упаковываете, действительно являются тем, что вы упаковываете.

Другие вопросы по тегам