如何强制Spark仅使用单个CPU核心开展加速实验
Spark单核心强制限制方案
配置失效原因
原有配置不生效的核心原因:
- local模式下
spark.executor.instances、spark.executor.cores等集群执行器配置无任何作用,所有计算逻辑均运行在Driver进程内- 默认
master("local")等价于master("local[*]"),会自动使用设备全部可用核心- 未限制Spark默认并行度,多分区会触发多任务并行执行
完整配置方案
- 修改master声明指定单线程
将master配置改为.master("local[1]"),方括号内的数值为Spark Driver可用的最大线程数,设为1即强制所有Spark任务串行执行 - 补充并行度限制配置
在原有配置基础上增加以下参数:os.environ['NUMBEXPR_MAX_THREADS'] = 1 os.environ['NUMEXPR_NUM_THREADS'] = 1 spark = SparkSession.builder \ .master("local[1]") \ .config("spark.executor.instances", "1") \ .config("spark.executor.cores", "1") \ .config("spark.driver.cores", "1") \ .config("spark.task.cpus", "1") \ .config("spark.sql.shuffle.partitions", "1") \ .config("spark.default.parallelism", "1") \ .config("spark.driver.memory", "50g") \ # 关闭内置多线程优化组件,避免隐性并行 .config("spark.shuffle.io.numConnectionsPerPeer", "1") \ .config("spark.reducer.maxReqsInFlight", "1") \ .config("spark.sql.execution.arrow.enabled", "false") \ .config("spark.sql.parquet.enableVectorizedReader", "false") \ .getOrCreate() - 可选:操作系统级CPU绑定
若要彻底避免进程被调度到其他核心,可在启动脚本前通过taskset命令绑定进程到指定核心:
该命令会将整个Python进程及内部所有子线程绑定到0号核心,实现单核心100%占满的效果taskset -c 0 python your_spark_script.py
注意事项
- 所有涉及shuffle、重分区的算子都要手动确认最终分区数为1,避免多分区触发多任务
- 避免使用自带线程池的功能(如pandas UDF、多线程第三方库),这类功能会绕过Spark配置启动额外线程
内容的提问来源于stack exchange,提问作者Meike
相关产品推荐
相关产品推荐

