我有一个Spark批处理作业,它从一个有300个分区的Kafka主题中消耗数据。作为我工作的一部分,有各种各样的转换,如group by和join,需要洗牌。
我想知道我是否应该使用spark.sql.shuffle.partitions的默认值200或将其设置为300,这与Kafka中输入分区的数量相同,因此并行任务的数量产生读取它。
感谢在《学习Spark,第二版》中关于优化和调优Spark应用的章节中;(O'Reilly)它写的是默认值
"对于较小的或流式工作负载来说太高了;您可能希望将其减少到一个较低的值,例如执行器上的内核数或更少。
对于shuffle阶段要设置的shuffle分区数量没有神奇的公式;这个数字可能会根据您的用例、数据集、内核数量和可用的执行器内存数量而有所不同——这是一种试错方法。">
您的目标应该是减少通过网络发送给执行器任务的小分区的数量。
有一个关于为大规模工作负载调优Apache Spark的演讲录音,其中也谈到了这种配置。
但是,当您使用Spark 3时。由于自适应查询执行(AQE)框架将根据shuffle文件统计信息动态合并shuffle分区,因此您不必考虑那么多。关于AQE框架的更多细节,请参阅本博客。