Spark Avro выдает исключение при записи файла: NoSuchMethodError

Любая попытка записи в файл формата Avro завершается ошибкой из-за трассировки стека ниже.

Мы используем Spark 2.4.3 (с предоставленным пользователем Hadoop), Scala 2.12, и мы загружаем пакет Avro во время выполнения с любой искровой оболочкой:

spark-shell --packages org.apache.spark:spark-avro_2.12:2.4.3

или искра-отправить:

spark-submit --packages org.apache.spark:spark-avro_2.12:2.4.3 ...

Сессия Spark сообщает об успешной загрузке пакета Avro.

... в любом случае, в тот момент, когда мы пытаемся записать какие-либо данные в формат avro, например:

df.write.format("avro").save("hdfs:///path/to/outputfile.avro")

или с выбором:

df.select("recordidstring").write.format("avro").save("hdfs:///path/to/outputfile.avro")

... выдает ту же ошибку stacktrace (эта копия из искровой оболочки):

java.lang.NoSuchMethodError: org.apache.avro.Schema.createUnion([Lorg/apache/avro/Schema;)Lorg/apache/avro/Schema;
  at org.apache.spark.sql.avro.SchemaConverters$.toAvroType(SchemaConverters.scala:185)
  at org.apache.spark.sql.avro.SchemaConverters$.$anonfun$toAvroType$1(SchemaConverters.scala:176)
  at scala.collection.Iterator.foreach(Iterator.scala:941)
  at scala.collection.Iterator.foreach$(Iterator.scala:941)
  at scala.collection.AbstractIterator.foreach(Iterator.scala:1429)
  at scala.collection.IterableLike.foreach(IterableLike.scala:74)
  at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
  at org.apache.spark.sql.types.StructType.foreach(StructType.scala:99)
  at org.apache.spark.sql.avro.SchemaConverters$.toAvroType(SchemaConverters.scala:174)
  at org.apache.spark.sql.avro.AvroFileFormat.$anonfun$prepareWrite$2(AvroFileFormat.scala:119)
  at scala.Option.getOrElse(Option.scala:138)
  at org.apache.spark.sql.avro.AvroFileFormat.prepareWrite(AvroFileFormat.scala:118)
  at org.apache.spark.sql.execution.datasources.FileFormatWriter$.write(FileFormatWriter.scala:103)
  at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:170)
  at org.apache.spark.sql.execution.command.DataWritingCommandExec.sideEffectResult$lzycompute(commands.scala:104)
  at org.apache.spark.sql.execution.command.DataWritingCommandExec.sideEffectResult(commands.scala:102)
  at org.apache.spark.sql.execution.command.DataWritingCommandExec.doExecute(commands.scala:122)
  at org.apache.spark.sql.execution.SparkPlan.$anonfun$execute$1(SparkPlan.scala:131)
  at org.apache.spark.sql.execution.SparkPlan.$anonfun$executeQuery$1(SparkPlan.scala:155)
  at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
  at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:152)
  at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:127)
  at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:80)
  at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:80)
  at org.apache.spark.sql.DataFrameWriter.$anonfun$runCommand$1(DataFrameWriter.scala:676)
  at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$1(SQLExecution.scala:78)
  at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:125)
  at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:73)
  at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:676)
  at org.apache.spark.sql.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:290)
  at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:271)
  at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:229)

У нас есть возможность без проблем писать в других форматах (текстовые, json, ORC, паркет).

Мы используем HDFS (Hadoop v3.1.2) в качестве хранилища файлов.

Я экспериментировал с разными версиями пакетов Avro (например, 2.11 и ниже), которые либо вызывают ту же ошибку, либо не загружаются полностью из-за несовместимости. Эта ошибка возникает во всех Python, Scala (с использованием оболочки или spark-submit) и Java (с использованием spark-submit).

Похоже, что для этого существует Открытая проблема на apache.org JIRA, но Сейчас исполнился год без какого-либо решения. Я столкнулся с этой проблемой, но мне интересно, есть ли у сообщества исправление? Любая помощь очень ценится.


person Thomas Humphries    schedule 19.02.2020    source источник
comment
Отвечает ли это на ваш вопрос? Устранение проблем с зависимостями в Apache Spark   -  person user10938362    schedule 19.02.2020
comment
Откройте пользовательский интерфейс Spark и посмотрите путь к классам задания. Банка правильно добавлена?   -  person OneCricketeer    schedule 19.02.2020
comment
@ user10938362 попробовал предложения из этого сообщения, спасибо, но все равно получаю ту же ошибку.   -  person Thomas Humphries    schedule 21.02.2020
comment
@ cricket_007 да, о jar-файлах avro сообщается, что они успешно добавлены, и мой app.jar запускается и выводит нормально - до тех пор, пока не появится команда avro write ...   -  person Thomas Humphries    schedule 21.02.2020
comment
Удалось создать убер-банку? Кроме того, есть ли конкретная причина, по которой вы хотите использовать Avro, а не Parquet или ORC?   -  person OneCricketeer    schedule 21.02.2020
comment
Создание банок в порядке, не жалуется. Мы экспериментируем со всеми форматами файлов в разных конфигурациях и языковых вариантах.   -  person Thomas Humphries    schedule 21.02.2020


Ответы (3)


На основе комментарий в связанной ошибке, вы должны указать avro как минимум с 1.8.0 версией, примерно так:

spark-submit --packages org.apache.spark:spark-avro_2.12:2.4.3,org.apache.avro:avro:1.9.2 ...

(Возможно, вы захотите попробовать и другой порядок.)

person Gábor Bakos    schedule 19.02.2020
comment
протестировали различный порядок и версии на Spark-submit или Shell, но все равно ошибка. - person Thomas Humphries; 21.02.2020
comment
явно указали avro - в командной строке и в app.jar pom.xml - такая же ошибка. - person Thomas Humphries; 21.02.2020
comment
:( Извините, я не знаю, как это исправить. - person Gábor Bakos; 21.02.2020
comment
Привет @ GáborBakos, Будет ли --package загружать jar-файлы avro на рабочие узлы? ЕСТЬ ли способ. - person Thota Srinath; 23.11.2020

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

person XuGuang Lv    schedule 29.05.2020

Эта проблема, по-видимому, специфична для нашей конфигурации в нашем локальном кластере - сборки HDFS с одним узлом (локально в Windows, других Linux и т. Д.) Позволяют avro писать нормально. Мы перестроим проблемный кластер, но я уверен, что проблема связана с плохой конфигурацией только в этом кластере - решение - перестроить.

person Thomas Humphries    schedule 08.07.2020