首页 > 解决方案 > Spark结构化流 - java.lang.OutOfMemoryError:Java堆空间

问题描述

使用 Spark 结构化流处理输入流时出现以下异常。

org.apache.spark.SparkException:作业因阶段失败而中止:阶段 5.0 中的任务 22 失败 1 次,最近一次失败:阶段 5.0 中丢失任务 22.0(TID 403,本地主机,执行程序驱动程序):java.lang.OutOfMemoryError: Java 堆空间

我已经处理了下面给出的水印,

    .withWatermark("timestamp", "5 seconds")
        .groupBy(window($"timestamp", "1 second"), $"column")

可能是什么问题?我尝试将触发器从默认更改为固定间隔,但我仍然面临问题。

标签: apache-sparkapache-spark-sqlspark-structured-streaming

解决方案


我不认为这个问题与水印或触发器有关。OutOfMemory出现错误的原因有两个:

  1. 内存泄漏。这个编程错误会导致你的应用程序不断地消耗更多的内存。每次使用应用程序的泄漏功能时,都会将一些对象留在 Java 堆空间中。随着时间的推移,泄漏的对象会消耗所有可用的 Java 堆空间并触发错误。

  2. 指定给它的资源的数据过多。您的集群有一个指定的阈值,并且只能容纳一定数量的数据。当数据量超过该阈值时,在峰值之前正常运行的作业停止运行并触发java.lang.OutOfMemoryError: Java heap space error.

您的错误也说明task 22.0 in stage 5.0了这意味着它成功完成了第 1-4 阶段。对我来说,这意味着分配给它的资源有太多数据,因为它不会像内存泄漏那样在多次运行中死亡。尝试使用类似spark.readStream.option("maxFilesPerTrigger", "6")或增加分配给该集群的内存来限制读取的数据量。


推荐阅读