首页 > 解决方案 > 从 Kafka 读取 Spark 批处理作业的 spark.sql.shuffle.partitions 的最佳值

问题描述

我有一个 Spark 批处理作业,它使用具有 300 个分区的 Kafka 主题中的数据。作为我工作的一部分,有各种转换,如 group by 和 join 需要改组。

我想知道我是否应该使用 spark.sql.shuffle.partitions 的默认值 200 或将其设置为 300,这与 Kafka 中的输入分区数相同,因此要读取的并行任务数它。

谢谢

标签: apache-sparkapache-kafkaapache-spark-sql

解决方案


在“Learning Spark, 2nd edition”(O'Reilly)一书的优化和调优 Spark 应用程序一章中,默认值被写入

“对于较小的或流式工作负载来说太高了;您可能希望将其降低到较低的值,例如执行器上的核心数量或更少。

为 shuffle 阶段设置的 shuffle 分区数量没有神奇的公式;这个数字可能会根据您的用例、数据集、内核数量和可用的执行程序内存量而有所不同——这是一种试错法。”

您的目标应该是减少通过网络发送到执行者任务的小分区数量。

有一段关于Tuning Apache Spark for Large Scale Workloads的谈话录音,其中也谈到了这种配置。

但是,当您使用 Spark 3.x 时,您不会考虑那么多,因为自适应查询执行 (AQE) 框架会根据 shuffle 文件统计信息动态合并 shuffle 分区。此博客中提供了有关 AQE 框架的更多详细信息。


推荐阅读