【问题标题】:Why does elasticsearch-spark 5.5.0 fail with AbstractMethodError when submitting to YARN cluster?为什么在提交到 YARN 集群时,elasticsearch-spark 5.5.0 会因 AbstractMethodError 而失败?
【发布时间】:2018-08-06 00:42:28
【问题描述】:

我写了一个spark作业,主要目标是写入es,并提交它,问题是当我将它提交到spark集群时,spark返回

[ERROR][org.apache.spark.deploy.yarn.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.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:58) 在 org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:56) 在 org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117) 这里

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

【问题讨论】:

    标签: apache-spark elasticsearch apache-spark-sql apache-spark-2.2


    【解决方案1】:

    您似乎遇到了 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)

    这将为您提供问题“诞生”的确切位置(请参阅that line):

    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 集群,不是吗? em>)

    我很困惑,但希望答案能阐明可能是什么原因造成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-20
      • 2015-11-06
      • 2016-06-25
      • 1970-01-01
      • 2015-12-19
      • 2014-11-14
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多