Spark异常:写入行时任务失败

11

我正在阅读文本文件并将它们转换为parquet文件。我正在使用Spark代码进行操作。但是当我尝试运行代码时,我遇到以下异常

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, XXXX.XXX.XXX.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

我想以以下方式编写数据框:

dataframe.write().parquet(Path)

非常感谢您的帮助。


1
嗯,是的 - 我记得遇到过这个问题。我在思考问题所在...你使用的是哪个版本的Spark?你有多少个分区?你是否在AWS EMR上运行,并且Path是否是"s3n://..."? - Glennie Helles Sindholt
1
你能否尝试在你想要写入Parquet的数据框中执行一个操作吗?(例如count)我们需要隔离一个可解释的除零操作! - eliasah
1
哦,我完全忽略了ArithmeticException(感谢@eliasah的重新格式化 :))。在这种情况下,这对我来说不是一个熟悉的问题,我同意@eliasah的评论。 - Glennie Helles Sindholt
不仅是除法逻辑,像 toInt() 或任何异常都会导致这个错误。你能发一下你创建 dataframe 的代码吗? - WoodChopper
问题在于Parquet模式未能生成。因此,Spark尝试从Parquet模式中查找一些统计信息,并尝试通过计数或其他方式进行划分,但由于其值为零而失败。 - Aditya Calangutkar
显示剩余4条评论
6个回答

6
另一个可能原因是您超过了s3请求速率限制。如果您仔细查看日志,您可能会看到以下内容:
AmazonS3Exception: 请减少您的请求速率。
虽然Spark UI会显示:
写入行时任务失败
我怀疑这不是您遇到问题的原因,但如果您正在运行高强度的作业,则可能是一个可能的原因。因此,我包括它以便回答完整。

1
我重写了代码,以减少对S3的访问。不幸的是,这不是可扩展的解决方案...也许你可以请求增加限制? - Carlos Bribiescas

2
我发现禁用推测可以防止这种错误发生。我不太确定为什么。似乎在写入parquet行时,推测任务和非推测任务存在冲突。
sparkConf.set("spark.speculation","false")

1
这不是执行推测的问题,而是模式未正确生成,因此出现了除零错误。 - Aditya Calangutkar
不是 Spark >= 3.1 的解决方案 - Jérémy

1
在我的情况下,当我试图覆盖属于另一个用户的hdfs目录时,出现了这个错误。删除该目录并让我的进程从头开始写入解决了这个问题。因此,我猜测,在hdfs上更深入地挖掘用户权限是合适的方向。

0
这就是拥有所有源代码的好处所在:将堆栈跟踪粘贴到可以从堆栈跟踪转到代码行的IDE中,看看它说了什么。这可能只是一些初始化/配置问题。

0
如果这个问题仍然存在,我的经验是我没有启动hadoop。如果你在其上运行spark,启动hadoop并再次检查可能是值得的。

0
在我的情况下,下面的命令解决了问题,因为日期列或时间戳列中的值有问题(例如,日期列中的日期超出范围,如1700-01-01)。
#Set the spark.sql.parquet.int96RebaseModeInWrite property
spark.conf.set("spark.sql.parquet.int96RebaseModeInWrite", "CORRECTED")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接