0
votes

spark scala avro write échoue avec AbstractMethodError

Im essayant de lire les données depuis avro, repartitionner les données par un champ et les enregistrer au format avro. ci-dessous est mon exemple de code. pendant le processus de débogage, je ne peux pas faire un show (10) sur mon dataframe. il échoue avec l'erreur suivante. quelqu'un peut-il m'aider s'il vous plaît à comprendre ce que je fais mal dans mes lignes de code?

Code:

java.lang.AbstractMethodError: org.apache.spark.sql.avro.AvroFileFormat.shouldPrefetchData(Lorg/apache/spark/sql/SparkSession;Lorg/apache/spark/sql/types/StructType;Lorg/apache/spark/sql/types/StructType;)Z
  at org.apache.spark.sql.execution.FileSourceScanExec.inputRDD$lzycompute(DataSourceScanExec.scala:309)
  at org.apache.spark.sql.execution.FileSourceScanExec.inputRDD(DataSourceScanExec.scala:305)
  at org.apache.spark.sql.execution.FileSourceScanExec.doExecute(DataSourceScanExec.scala:404)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:131)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:127)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:156)
  at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
  at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:152)
  at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:127)
  at org.apache.spark.sql.execution.ProjectExec.doExecute(basicPhysicalOperators.scala:70)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:131)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:127)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:156)
  at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
  at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:152)
  at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:127)
  at org.apache.spark.sql.execution.SparkPlan.getByteArrayRdd(SparkPlan.scala:283)
  at org.apache.spark.sql.execution.SparkPlan.executeTake(SparkPlan.scala:375)
  at org.apache.spark.sql.execution.CollectLimitExec.executeCollect(limit.scala:38)
  at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$collectFromPlan(Dataset.scala:3389)
  at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2550)
  at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2550)
  at org.apache.spark.sql.Dataset$$anonfun$52.apply(Dataset.scala:3370)
  at org.apache.spark.sql.execution.SQLExecution$$anonfun$withNewExecutionId$1.apply(SQLExecution.scala:78)
  at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:125)
  at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:73)
  at org.apache.spark.sql.Dataset.withAction(Dataset.scala:3369)
  at org.apache.spark.sql.Dataset.head(Dataset.scala:2550)
  at org.apache.spark.sql.Dataset.take(Dataset.scala:2764)
  at org.apache.spark.sql.Dataset.getRows(Dataset.scala:254)
  at org.apache.spark.sql.Dataset.showString(Dataset.scala:291)
  at org.apache.spark.sql.Dataset.show(Dataset.scala:751)
  at org.apache.spark.sql.Dataset.show(Dataset.scala:710)
  at org.apache.spark.sql.Dataset.show(Dataset.scala:719)
  ... 85 elided

L'affichage et l'écriture échouent avec l'erreur suivante:

XXX


0 commentaires

4 Réponses :


0
votes

Le problème ci-dessus est dû à la compatibilité des jars de Spark et Spark-Avro. Utilisez les dépendances correctes de Spark et Avro de maven central.

Le package Spark-Avro est disponible uniquement à partir de la version Spark 2.4.0. Vérifiez votre version de Spark soit dans pom.xml, soit dans build.sbt

Le lien suivant fournit des informations sur le binaire Spark Avro dans maven central: https://mvnrepository.com/artifact/org.apache.spark/spark- avro


2 commentaires

J'ai eu la bonne version définie dans mon build.sbt ressemble à 2.4.4. a quelques problèmes avec spark-avro. J'ai rétrogradé le cluster à 2.4.3 avec build.sbt je suis capable de faire df.select cependant, df.show échoue toujours mais avec nouveau message d'erreur. Causé par: org.apache.spark.SparkException: travail abandonné en raison d'un échec d'étape: la tâche 0 à l'étape 8.0 a échoué 4 fois, échec le plus récent: tâche perdue 0.3 à l'étape 8.0 (TID 29, ip-10-255 50-25.corp.tenablesecurity.com, exécuteur 19): java.lang.ArrayIndexOutOfBoundsException: 2


java.lang.ArrayIndexOutOfBoundsException est une exception différente en raison de "Levée pour indiquer qu'un tableau a été accédé avec un index illégal. L'index est soit négatif, soit supérieur ou égal à la taille du tableau." L'exception d'origine due à une incompatibilité est corrigée.



1
votes

spark-avro pour spark 2.4.4 et scala 2.11.12 semble être bogué. La rétrogradation vers spark 2.4.3 et scala 2.11.12 fonctionne très bien


0 commentaires

1
votes

cela m'a rendu un peu fou et je n'ai pas pu obtenir l'aide d'AWS. La dernière version de Spark 2.4.4 a définitivement des problèmes avec Avro. Le passage à la version 2.4.3 a résolu les problèmes que j'avais.


0 commentaires

2
votes

Ceci est une source causée par un changement inintégrément binaire incompatible avec FileFormat dans EMR-5.28.0, qui sera corrigé lorsque EMR-5.29.0 sort. Heureusement, pour le format d'avroi, il existe une solution de contournement facile qui peut être utilisée dans EMR-5.28.0. Au lieu d'utiliser la version de Spark-Avro de Maven Central, cela fonctionnera si vous utilisez le pot d'étincelles fournie avec EMR. C'est-à-dire au lieu de quelque chose comme - packages org.apache.spark: Spark-Avro_2.11: 2.4.4 , Utilisez - JARS / USR / LIB / SPARK / EXTERN / LIB /spark-avro.jarled.


3 commentaires

C'est une solution de contournement très intéressante pour utiliser le JAR spark-avro fourni! Est-ce que emr-5.27.0 est affecté par cela? Je suppose que c'est aussi bogué car 5.27.0 utilise spark-2.4.4. Si votre cas d'utilisation le permet, il peut être plus sûr de s'en tenir à emr-5.26.0 jusqu'à ce que la version 5.29.0 soit sortie.


Non, seule emr-5.28.0 est affectée par cela. Le bogue se trouve spécifiquement dans l'un des correctifs d'EMR au-dessus de Spark 2.4.4 dans emr-5.28.0, pas dans Spark 2.4.4 lui-même.


BTW, les deux emr-5.28.1 et emr-5.29.0 sont disponibles maintenant, et les deux ont le correctif pour ce problème. Veuillez consulter docs.aws.amazon.com/emr /latest/ReleaseGuide/emr-release-5x.h‌ tml .