【问题标题】:Spark Exception : Task failed while writing rowsSpark 异常:写入行时任务失败
【发布时间】:2016-07-02 06:55:41
【问题描述】:

我正在阅读文本文件并将它们转换为镶木地板文件。我正在使用火花代码进行操作。但是当我尝试运行代码时,我得到以下异常

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)

非常感谢任何帮助。

【问题讨论】:

  • 嗯,是的 - 我记得碰到过这个。我试图思考问题出在哪里……哪个版本的 Spark?你有多少个分区?您是否在 AWS EMR 上运行,并且是 Path 很可能是“s3n://...”?
  • Spark 版本为 1.4.1。我在普通的 5 节点 hadoop 集群上运行它。路径也是普通的hdfs路径。
  • 您可以尝试对您想要写入 parquet 的 dataframe 执行操作吗? (例如count)我们需要隔离的地方有一个可以解释的除以零!
  • 哦,我完全错过了ArithmeticException(感谢重新格式化@eliasah :))。在那种情况下,这对我来说不是一个熟悉的问题,我同意@eliasah 的评论。
  • @GlennieHellesSindholt 我已经开发出一种模式识别能力。重新格式化也有帮助! :))

标签: java hadoop apache-spark apache-spark-sql parquet


【解决方案1】:

我发现禁用推测可以防止此错误发生。我不太清楚为什么。在编写 parquet 行时,推测性任务和非推测性任务似乎是冲突的。

sparkConf.set("spark.speculation","false")

【讨论】:

  • 不是推测执行的问题。这是架构无法正确生成的问题,因此 / 由 Zero
【解决方案2】:

另一个可能的原因是您达到了 s3 请求速率限制。如果您仔细查看日志,您可能会看到类似这样的内容

AmazonS3Exception: Please reduce your request rate.

虽然 Spark UI 会说

Task failed while writing rows

我怀疑这是您遇到问题的原因,但如果您正在执行一项高度密集的工作,这可能是一个原因。所以我加入只是为了答案的完整性。

【讨论】:

  • 不幸的是,我重写了代码以减少 s3 的命中率。不是一个可扩展的解决方案...也许您可以要求增加限制?
【解决方案3】:

这就是手头有所有源代码的帮助:将堆栈跟踪粘贴到 IDE 中,该 IDE 可以从堆栈跟踪转到代码行,然后查看它的内容。这可能只是一些初始化/配置问题

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      就我而言,当我尝试覆盖属于不同用户的 hdfs 目录时,我看到了这个错误。删除目录让我的进程从头开始编写它解决了它。所以我想,在 hdfs 的用户权限方向上进行更多的挖掘是合适的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-14
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 2018-06-02
        • 1970-01-01
        • 2019-07-14
        相关资源
        最近更新 更多