Apache spark 为什么elasticsearch spark 5.5.0在提交到纱线集群时会出现AbstractMethodError错误?
我写了一个spark作业,主要目标是将其写入es并提交,问题是当我将其提交到spark集群时,spark会回馈我 [ERROR][org.apache.spark.deploy.warn.ApplicationMaster]用户类引发异常: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; 位于org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:472) 位于org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:48) 位于org.apache.spark.sql.execution.command.executeCommandExec.sideEffectResult$lzycompute(commands.scala:58) 位于org.apache.spark.sql.execution.command.executeCommandExec.sideEffectResult(commands.scala:56) 位于org.apache.spark.sql.execution.command.executeCommandExec.doExecute(commands.scala:74) 在org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117)中Apache spark 为什么elasticsearch spark 5.5.0在提交到纱线集群时会出现AbstractMethodError错误?,apache-spark,elasticsearch,apache-spark-sql,apache-spark-2.2,Apache Spark,elasticsearch,Apache Spark Sql,Apache Spark 2.2,我写了一个spark作业,主要目标是将其写入es并提交,问题是当我将其提交到spark集群时,spark会回馈我 [ERROR][org.apache.spark.deploy.warn.ApplicationMaster]用户类引发异常:java.lang.AbstractMethodError:org.elasticsearch.spark.sql.DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;Lorg/apach
但是,如果我提交我的工作使用本地[2],工作结果就很好。奇怪的是,两个罐子的环境是相同的。我使用elasticsearch-spark20_2.11_5.5.0和spark2.2似乎您面临Spark版本不匹配的问题,即使用
elasticsearch-spark20_2.11_5.5.0
(注意spark20
)和Spark 2.2
引用以下文件的javadoc:
当应用程序尝试调用抽象方法时引发。通常,编译器会捕获此错误;仅当自上次编译当前执行的方法以来,某个类的定义发生了不兼容的更改时,才会在运行时发生此错误
这很好地解释了您的体验(注意以“此错误只能在运行时发生”开头的部分)
深入挖掘,堆栈跟踪中的这一行给出了您使用的Spark的确切版本,即Spark 2.2.0
org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:472)
这将为您提供问题“诞生”的确切位置(请参阅):
与堆栈跟踪中最上面的行匹配的:
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连接器,但不知何故它没有实现该方法。既然Spark 2.0已经有了这个接口,那怎么可能呢?!让我们查找并查看elasticsearch-spark20\u 2.11\u 5.5.0
的源代码
从堆栈跟踪中,您知道ES实现是。数据源确实是一个:
而且它确实覆盖了所需的方法(否则就不可能编译它,因为接口从1.3开始就存在了!)
方法和堆栈跟踪之间的唯一变化是data:DataFrame
(在连接器和接口中)与Lorg/apache/spark/sql/Dataset堆栈跟踪中的代码>。这就引出了有关Spark应用程序中代码的问题,或者您将Spark应用程序提交到纱线簇的方式可能有错误(您确实将Spark应用程序提交到纱线簇,不是吗?)
我很困惑,但希望这个答案能让我们了解到底是什么导致了这一现象
dataSource.createRelation(sparkSession.sqlContext, mode, caseInsensitiveOptions, data)
private[sql] class DefaultSource ... with CreatableRelationProvider {