Je lis des fichiers texte et les convertis en fichiers de parquet. Je le fais en utilisant le code d'étincelle. Mais quand j'essaye de lancer le code, je reçois l'exception suivante
org.Apache.spark.SparkException: Job aborted due to stage failure: Task 2 in stage 1.0 failed 4 times, most recent failure: Lost task 2.3 in stage 1.0 (TID 9, ukfhpdbivp12.uk.experian.local): org.Apache.spark.SparkException: Task failed while writing rows.
at org.Apache.spark.sql.sources.InsertIntoHadoopFsRelation.org$Apache$spark$sql$sources$InsertIntoHadoopFsRelation$$writeRows$1(commands.scala:191)
at org.Apache.spark.sql.sources.InsertIntoHadoopFsRelation$$anonfun$insert$1.apply(commands.scala:160)
at org.Apache.spark.sql.sources.InsertIntoHadoopFsRelation$$anonfun$insert$1.apply(commands.scala:160)
at org.Apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:63)
at org.Apache.spark.scheduler.Task.run(Task.scala:70)
at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:745)
Caused by: Java.lang.ArithmeticException: / by zero
at parquet.hadoop.InternalParquetRecordWriter.initStore(InternalParquetRecordWriter.Java:101)
at parquet.hadoop.InternalParquetRecordWriter.<init>(InternalParquetRecordWriter.Java:94)
at parquet.hadoop.ParquetRecordWriter.<init>(ParquetRecordWriter.Java:64)
at parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.Java:282)
at parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.Java:252)
at org.Apache.spark.sql.parquet.ParquetOutputWriter.<init>(newParquet.scala:83)
at org.Apache.spark.sql.parquet.ParquetRelation2$$anon$4.newInstance(newParquet.scala:229)
at org.Apache.spark.sql.sources.DefaultWriterContainer.initWriters(commands.scala:470)
at org.Apache.spark.sql.sources.BaseWriterContainer.executorSideSetup(commands.scala:360)
at org.Apache.spark.sql.sources.InsertIntoHadoopFsRelation.org$Apache$spark$sql$sources$InsertIntoHadoopFsRelation$$writeRows$1(commands.scala:172)
... 8 more
J'essaie d'écrire le cadre de données de la manière suivante:
dataframe.write().parquet(Path)
Toute aide est grandement appréciée.
Une autre raison possible est que vous atteignez les limites de taux de requêtes s3. Si vous regardez de près vos journaux, vous verrez peut-être quelque chose comme ceci.
AmazonS3Exception: Please reduce your request rate.
Alors que l'interface utilisateur Spark dira
Task failed while writing rows
Je doute que ce soit la raison pour laquelle vous rencontrez un problème, mais c'est une raison possible si vous travaillez très intensément. J'ai donc inclus juste pour la complétude de la réponse.
J'ai trouvé que désactivant la spéculation empêche cette erreur de se produire. Je ne sais pas trop pourquoi. Il semble que les tâches spéculatives et non spéculatives soient en conflit lors de l'écriture de lignes de parquet.
sparkConf.set("spark.speculation","false")
Si cela est toujours d'actualité, mon expérience avec cette question est que je n'ai pas commencé hadoop. Si vous lancez spark sur le dessus, il peut être intéressant de commencer hadoop et de vérifier à nouveau.
C'est là qu'avoir toutes les sources à portée de main est utile: collez la trace de pile dans un IDE pouvant aller d'une trace de pile à des lignes de code et voyez ce qui est écrit. C'est probablement juste un problème init/config
Dans mon cas, j'ai vu cette erreur lorsque j'ai essayé de remplacer le répertoire hdfs qui appartenait à un autre utilisateur. Supprimer le répertoire a laisser mon processus l'écrire à partir de zéro l'a résolu. Donc, je suppose que plus de fouilles est approprié en ce qui concerne les autorisations des utilisateurs sur les fichiers hdfs.