Почему из-за AbstractMethodError с помощью AbstractMethodError происходит сбой эластичного поиска-искры 5.5.0 при передаче в кластер YARN?
Я написал задание spark, основная цель которого - записать в es и отправить его, проблема в том, что когда я отправляю его в кластеры spark, spark возвращает
[ОШИБКА][org.apache.spark.deploy.yarn.ApplicationMaster] Исключение класса пользователя: java.lang.AbstractMethodError: org.elasticsearch.spark.sql.DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;Lorg/ Apache / искровой / SQL /SaveMode;Lscala/ коллекция / неизменяемая / Карта; Lorg / Apache / искровые / SQL /Dataset;)Lorg/ Apache / искровые / SQL / источники /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/ искра / SQL /Dataset;)Lorg/ Apache / искровые / SQL / источники / BaseRelation; в org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:472) в org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:48) в org..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) здесь
Но если я отправляю свою работу, использую локально [2], работа отлично получается. Странно, и два окружения банок одинаковы. Я использую asticsearch-spark20_2.11_5.5.0 и spark2.2
1 ответ
Похоже, вы столкнулись с несоответствием версии Spark, т.е. вы используете elasticsearch-spark20_2.11_5.5.0
(нота spark20
в названии) и Spark 2.2.
Цитирование javadoc java.lang.AbstractMethodError:
Брошенный, когда приложение пытается вызвать абстрактный метод. Обычно эта ошибка отлавливается компилятором; эта ошибка может возникнуть только во время выполнения, если определение некоторого класса несовместимо изменилось с момента последней компиляции выполняемого в данный момент метода.
Это в значительной степени объясняет то, что вы испытываете (обратите внимание на часть, которая начинается с "эта ошибка может возникнуть только во время выполнения").
Углубившись глубже, эта строка в трассировке стека дала мне точную версию 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 / искра / SQL /Dataset;)Lorg/ Apache / искровые / SQL / источники /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/ искра / SQL /Dataset;)Lorg/ Apache / искровой / SQL / источники / 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, не так ли?)
Я озадачен, но, надеюсь, ответ пролил некоторый свет на то, что могло быть причиной.