apache-spark - 从 Kafka 读取 Spark 批处理作业的 spark.sql.shuffle.partitions 的最佳值
问题描述
我有一个 Spark 批处理作业,它使用具有 300 个分区的 Kafka 主题中的数据。作为我工作的一部分,有各种转换,如 group by 和 join 需要改组。
我想知道我是否应该使用 spark.sql.shuffle.partitions 的默认值 200 或将其设置为 300,这与 Kafka 中的输入分区数相同,因此要读取的并行任务数它。
谢谢
解决方案
在“Learning Spark, 2nd edition”(O'Reilly)一书的优化和调优 Spark 应用程序一章中,默认值被写入
“对于较小的或流式工作负载来说太高了;您可能希望将其降低到较低的值,例如执行器上的核心数量或更少。
为 shuffle 阶段设置的 shuffle 分区数量没有神奇的公式;这个数字可能会根据您的用例、数据集、内核数量和可用的执行程序内存量而有所不同——这是一种试错法。”
您的目标应该是减少通过网络发送到执行者任务的小分区数量。
有一段关于Tuning Apache Spark for Large Scale Workloads的谈话录音,其中也谈到了这种配置。
但是,当您使用 Spark 3.x 时,您不会考虑那么多,因为自适应查询执行 (AQE) 框架会根据 shuffle 文件统计信息动态合并 shuffle 分区。此博客中提供了有关 AQE 框架的更多详细信息。
推荐阅读
- sql-server - SQL Server 性能相关
- ios - Xcode '找不到 Info.plist 路径。'
- docker - 如果 RUN 在多阶段构建中失败,则使 Docker 构建停止
- ansible - 如何在 Ansible 中将变量放入变量中?
- marklogic - cts 搜索空格敏感
- cytoscape - 如何使用来自 Phytozome 的基因 id 为高粱基因列表创建节点和边
- python - 使用 exec 导入特定模块的优缺点?
- mysql - 使用 insert SET 语法可以插入多行吗?
- jersey-2.0 - 如何在泽西岛有问题地创建 WADL
- javascript - axios GET 中的 vue.js 多选更改选项