为什么 elasticsearch-spark 5.5.0 在提交到 YARN 集群时会失败并出现 AbstractMe



我写了一个火花作业,主要目标是写入 es,并提交它,问题是当我把它提交到火花簇上时,火花回馈了

[ERROR][org.apache.spark.deploy.yarn.ApplicationMaster] User class 抛出异常: java.lang.AbstractMethodError: org.elasticsearch.spark.sql.DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;Lorg/apache/spark/sql/SaveMode;Lscala/collection/immutable/Map;Lorg/apache/spark/sql/Dataset;(Lorg/apache/spark/sql/sources/BaseRelation; java.lang.AbstractMethodError: org.elasticsearch.spark.sql.DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;Lorg/apache/spark/sql/SaveMode;Lscala/collection/immutable/Map;Lorg/apache/spark/sql/Dataset;(Lorg/apache/spark/sql/sources/BaseRelation; at org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:472( at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:48( at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:58( at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(command.scala:56( at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(command.scala:74( at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117(here

但是如果我使用 local[2] 提交我的工作,工作效果很好。奇怪,罐子的两个环境是一样的。我使用 elasticsearch-spark20_2.11_5.5.0 和 spark2.2

看起来你面临着Spark版本不匹配,即你使用elasticsearch-spark20_2.11_5.5.0(注意名称中的spark20(和Spark 2.2。

引用java.lang.AbstractMethodError的javadoc

当应用程序尝试调用抽象方法时引发。通常,编译器会捕获此错误;仅当自上次编译当前正在执行的方法以来某些类的定义发生了不兼容的更改时,才会在运行时发生此错误。

这几乎解释了您的体验(请注意以"此错误只能在运行时发生"开头的部分(。

更深入地挖掘,堆栈跟踪中的这一行给了我你使用的 Spark 的确切版本,即 Spark 2.2.0。

org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:472(

这为您提供了问题"诞生"的确切位置(请参阅该行(:

dataSource.createRelation(sparkSession.sqlContext, mode, caseInsensitiveOptions, data)

这与堆栈跟踪中最顶层的行匹配:

java.lang.AbstractMethodError: org.elasticsearch.spark.sql.DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;Lorg/apache/spark/sql/SaveMode;Lscala/collection/immutable/Map;Lorg/apache/spark/sql/Dataset;(Lorg/apache/spark/sql/sources/BaseRelation; java.lang.AbstractMethodError: org.elasticsearch.spark.sql.DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;Lorg/apache/spark/sql/SaveMode;Lscala/collection/immutable/Map;Lorg/apache/spark/sql/Dataset;(Lorg/apache/spark/sql/sources/BaseRelation

看起来elasticsearch-spark20_2.11_5.5.0连接器是一个 CreatableRelationProvider,但不知何故它没有实现该方法。既然Spark 2.0已经有了这个界面,这怎么可能?!让我们找出并回顾一下elasticsearch-spark20_2.11_5.5.0的源代码。

从堆栈跟踪中,您知道 ES 实现是 org.elasticsearch.spark.sql.DefaultSource。数据源确实是一个 CreatableRelationProvider:

private[sql] class DefaultSource ... with CreatableRelationProvider  {

并且它确实覆盖了所需的 createRelation 方法(否则将无法编译它,因为该接口从 1.3 开始就存在了!

方法和堆栈跟踪之间的唯一更改是data: DataFrame(在连接器和接口中(与Lorg/apache/spark/sql/Dataset;在堆栈跟踪中。这就引出了关于 Spark 应用程序中代码的问题,或者您可能在将 Spark 应用程序提交到 YARN 集群的方式中存在错误(并且您确实将 Spark 应用程序提交到 YARN 集群,不是吗?

我很困惑,但希望答案已经阐明了可能导致它的原因。

最新更新