【问题标题】:Spark Avro throws exception on file write: NoSuchMethodErrorSpark Avro 在文件写入时抛出异常:NoSuchMethodError
【发布时间】:2020-02-19 01:31:02
【问题描述】:

任何 Avro 格式的文件写入尝试都会失败,并显示下面的堆栈跟踪。

我们使用的是 Spark 2.4.3(带有用户提供的 Hadoop)、Scala 2.12,并且我们在运行时使用 spark-shell 加载 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 Session 报告加载 Avro 包成功。

...在任何一种情况下,当我们尝试将任何数据写入 avro 格式时,例如:

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

或选择:

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

... 产生相同的堆栈跟踪错误(此副本来自 spark-shell):

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、parquet)。

我们使用 HDFS (Hadoop v3.1.2) 作为文件存储。

我已经尝试过不同的 Avro 包版本(例如 2.11,更低版本),它们要么引发相同的错误,要么由于不兼容而完全加载失败。所有 Python、Scala(使用 shell 或 spark-submit)和 Java(使用 spark-submit)都会出现此错误。

在 apache.org JIRA 上似乎有一个 Open Issue 用于此,但现在已经有一年了,没有任何解决方案。我遇到了这个问题,但也想知道社区是否有解决办法?非常感谢任何帮助。

【问题讨论】:

  • 这能回答你的问题吗? Resolving dependency problems in Apache Spark
  • 打开 Spark UI 并查看作业类路径。 jar 是否正确添加?
  • @user10938362 已经尝试了该帖子中的建议,谢谢,但仍然遇到同样的错误。
  • @cricket_007 是的,avro jar 被报告为添加成功,并且我的 app.jar 启动并输出正常 - 直到 avro write 命令...
  • 你成功创建了一个 uber jar 吗?此外,您是否有特定原因要使用 Avro 而不是 Parquet 或 ORC?

标签: scala apache-spark avro spark-avro


【解决方案1】:

我在最新的 Spark 上遇到了同样的异常。当我将以下依赖项添加到 pom 中时,它就消失了。

  <properties>
    ....
    <spark.version>3.1.2</spark.version>
    <avro.version>1.10.2</avro.version>
  </properties>

  <dependencies>
    ....
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.12</artifactId>
      <version>${spark.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.12</artifactId>
      <version>${spark.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-avro_2.12</artifactId>
      <version>${spark.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.avro</groupId>
      <artifactId>avro</artifactId>
      <version>${avro.version}</version>
    </dependency>
  </dependencies>

看来您在启动应用程序的类路径中肯定缺少必需的依赖项。

【讨论】:

    【解决方案2】:

    基于链接错误中的a comment,您应该至少指定具有1.8.0 版本的avro,如下所示:

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

    (您可能也想尝试其他订单。)

    【讨论】:

    • 已经在 spark-submit 或 shell 上测试了不同的顺序和版本,但仍然是同样的错误。
    • 明确指定了 avro - 在命令行和 app.jar pom.xml - 同样的错误。
    • :( 抱歉,我不知道如何解决它。
    • 嗨@GáborBakos, --package 会在工作节点上加载avro jar吗?有没有办法。
    【解决方案3】:

    哥们,我遇到了和你一样的错误,但是我将 spark 版本更新到 2.11 2.4.4 后问题就消失了。

    【讨论】:

      【解决方案4】:

      这个问题似乎是特定于我们在本地集群上的配置 - HDFS 的单节点构建(本地在 windows、其他 linux 等)允许 avro 正常写入。我们将重建问题集群,但我确信问题只是该集群上的错误配置 - 解决方案 - 重建。

      【讨论】:

        猜你喜欢
        • 2014-01-03
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        相关资源
        最近更新 更多