我遇到了一个Spark结构化流(SSS)应用程序问题,该应用程序因程序错误而崩溃,并且周末未处理。当我重新启动它时,有很多关于主题的消息需要重新处理(关于3个主题的大约250'000条消息都需要加入)。
重新启动时,应用程序再次因OutOfMemory异常而崩溃。我从文档中了解到,在这些情况下,应该对读取流进行maxOffsetsPerTrigger
配置。我更改了PySpark代码(在SSS 2.4.3 btw上运行),使所有3个主题都具有以下内容
rawstream = (spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", bootstrapServers)
.option("subscribe", topicName)
.option("maxOffsetsPerTrigger", 10000L)
.option("startingOffsets", "earliest")
.load()
我的期望是,现在SSS查询将从每个主题加载〜33'000偏移,并将它们加入第一批。然后在第二批处理中,它将清理第一批处理中的状态记录,由于水印而使其到期(这将清除第一批处理中的大部分记录),然后从每个主题中读取另外的〜33k。因此,在大约8批处理之后,它应该已经处理了滞后,并具有“合理的”内存量。
但是应用程序仍然因OOM崩溃,当我在应用程序主UI中检查DAG时,它报告它再次尝试读取所有250'000条消息。
还有其他需要配置的内容吗?如何检查此选项是否真正使用? (不幸的是,当我检查计划时,该计划被截断并仅显示(Options: [includeTimestamp=true,subscribe=IN2,inferSchema=true,failOnDataLoss=false,kafka.b...)
,我不知道如何在圆点后显示该部分)