如何为 Spark 结构化流动态分配资源和管理尖峰?

Alc*_*ist 5 apache-spark spark-structured-streaming

我编写了一个结构化的流应用程序来将数据实时推送到 S3。我们从 Kafka 接收数据,并在使用结构化流处理数据后将数据推送到 S3。

我知道 Spark 流支持动态分配资源。但是在 JIRA https://issues.apache.org/jira/browse/SPARK-24815 之后发现说结构化流不支持资源的动态分配。

想知道在结构化流目前不支持动态分配资源时如何处理数据峰值。

不实现动态分配的原因如下(来自 JIRA): 如果我们设置 spark.dynamicAllocation.enabled=true 并运行一个结构化的流作业,批量动态分配算法就会启动。如果任务积压是特定大小,它会请求更多的执行程序, 并在它们空闲一段时间后删除 executors。它基本上用于批处理而不是连续处理。在批处理模式下,我们关心 numRunningOrPendingTasks 而对于流的比率:averageBatchProcTime.toDouble / batchDurationMs 即每单位时间的平均批处理时间,因此在空闲时缩小系统不是一个有效的解决方案。

问题:未提供资源动态分配时如何处理 SPIKES。

小智 1

因此,通过将 minPartitions 设置为高于主题分区的数字,假设主题中有 10 个分区,并且设置 minPartitions=1000,任务数量会按比例缩放以满足触发间隔。然而,当负载下降时,Kafka源仍然考虑消费者缓存并在所有执行器上循环执行任务。因此执行器永远不会保持空闲状态以通过动态分配空闲时间来缩小规模。