Spark 3.5.*中mapInPandas执行密集型任务性能骤降问题
Spark 3.5+ 下mapInPandas执行计算密集型任务性能骤降的解决方案
问题现象
- 升级至Spark 3.5.*系列版本(包括4.0.0-preview2预览版)后,使用
mapInPandas执行计算密集型任务(例如并行计算SHAP值)时出现显著性能下降 - Spark 3.1至3.4版本性能表现稳定,3.5版本的单迭代执行时间较3.4.4版本提升5-8倍,不同规模的LGB模型测试均存在该问题
排查过程
- 查阅Spark 3.5官方发布说明,尝试回滚相关配置项,未解决问题
- 检查任务的逻辑与物理执行计划,未发现异常
- 使用sparkmeasure工具分析执行过程,未定位到性能瓶颈
- 覆盖测试3.5.0至3.5.5所有子版本,问题均复现;测试4.0.0-preview2版本,问题依然存在
根因定位
Spark 3.5版本修复SPARK-42613 bug后,调整了spark.task.cpus参数的默认行为:当未显式设置该参数时,默认值变为1。而计算密集型任务(如SHAP值计算)需要利用多核心并行执行,默认值1限制了任务可用的核心数,直接导致性能骤降。
解决方法
显式配置spark.task.cpus参数为任务可用的核心数即可恢复性能:
- 配置文件方式:在Spark配置文件中添加
spark.task.cpus = <实际可用核心数>
- 代码动态设置:在Spark会话初始化后添加
spark.conf.set("spark.task.cpus", "<实际可用核心数>")
内容的提问来源于stack exchange,提问作者jsn
相关产品推荐
相关产品推荐

