为什么AWS Glue上的Spark-XML因AbstractMethodError而失败?

时间:2018-02-06 05:50:52

标签: python apache-spark apache-spark-sql aws-glue apache-spark-xml

我有一个用Python编写的AWS Glue作业,它引入了spark-xml库(通过Dependent jars路径)。我使用的是spark-xml_2.11-0.2.0.jar。当我尝试将我的DataFrame输出到XML时,我收到一个错误。我使用的代码是:

applymapping1.toDF().repartition(1).write.format("com.databricks.xml").save("s3://glue.xml.output/Test.xml");

我得到的错误是:

  

" /mnt/yarn/usercache/root/appcache/application_1517883778506_0016/container_1517883778506_0016_02_000001/pyspark.zip/pyspark/sql/readwriter.py" ;,   第550行,在保存文件中   " /mnt/yarn/usercache/root/appcache/application_1517883778506_0016/container_1517883778506_0016_02_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py" ;,   第1133行,在调用文件中   " /mnt/yarn/usercache/root/appcache/application_1517883778506_0016/container_1517883778506_0016_02_000001/pyspark.zip/pyspark/sql/utils.py" ;,   第63行,在deco文件中   " /mnt/yarn/usercache/root/appcache/application_1517883778506_0016/container_1517883778506_0016_02_000001/py4j-0.10.4-src.zip/py4j/protocol.py" ;,   第319行,在get_return_value py4j.protocol.Py4JJavaError:错误   在调用o75.save时发生了。 :java.lang.AbstractMethodError:   com.databricks.spark.xml.DefaultSource15.createRelation(Lorg /阿帕奇/火花/ SQL / SQLContext; Lorg /阿帕奇/火花/ SQL / SaveMode; Lscala /收集/不变/地图; Lorg /阿帕奇/火花/ SQL /数据集; )Lorg /阿帕奇/火花/ SQL /来源/ BaseRelation;   在   org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:426)   在   org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:215)   在

如果我将其更改为CSV,则可以正常工作:

applymapping1.toDF().repartition(1).write.format("com.databricks.csv").save("s3://glue.xml.output/Test.xml");

注意:使用CSV时我不必导入spark-xml。我认为spark-csv包含在AWS Glue的Spark环境中。

有关尝试的建议吗?

我尝试过各种版本的spark-xml:

火花xml_2.11-0.2.0 火花xml_2.11-0.3.1 火花xml_2.10-0.2.0

1 个答案:

答案 0 :(得分:0)

该问题与Why does elasticsearch-spark 5.5.0 give AbstractMethodError when submitting to YARN cluster?非常相似(但并非完全相同),该问题也涉及AbstractMethodError


引用java.lang.AbstractMethodError的javadoc:

  

当应用程序尝试调用抽象方法时抛出。通常,此错误由编译器捕获;如果自从上次编译当前执行的方法以来某个类的定义发生了不兼容的更改,则只有在运行时才会发生此错误。

这几乎可以解释您的经验(请注意以“此错误只能在运行时发生”开头的部分)。

我认为这是Spark版本的游戏不匹配。

给出堆栈跟踪中的com.databricks.spark.xml.DefaultSource15和执行以下操作的the change

  

由于Spark 1.5+的兼容性,删除了单独的DefaultSource15

     

这将删除DefaultSource15并将其合并到DefaultSource中。为了兼容性,在Spark 1.5+中对此进行了分离。在master和spark-xml 0.4.x中,它放弃了1.x支持。

您应确保AWS Glue的Spark环境中的Spark版本与spark-xml相匹配。最新版本的spark-xml 0.4.1 was released on 6 Nov 2016