设置local[16]后Spark UI Executor核心数为何超出本机实际核心数?
为什么Spark在local[16]模式下能显示16个核心并并行执行16个任务?
嘿,这个问题我之前也碰到过,给你唠唠背后的门道~
首先得明确:Spark的local[N]参数里的N,指的是Spark要启动的工作线程数量,而不是强制绑定的硬件核心数。Spark本身不会去校验你的笔记本实际有多少物理/逻辑核心,它只会老老实实按照你指定的数字创建对应数量的线程。
你的机器有8个逻辑处理器(超线程后的数量),但操作系统是允许创建超过逻辑核心数的线程的——这些多出来的线程会通过操作系统的时间分片机制,轮流抢占CPU资源来运行。所以当你设置local[16]时,Spark就启动了16个工作线程,这也就是为什么Spark UI的Executors标签里cores列显示16,Stages的Event Timeline能看到16个任务并行处理。
不过这里得提个醒:虽然这么设置是可行的,但性能未必是最优的。当线程数超过逻辑核心数过多时,操作系统需要频繁切换线程上下文,这会带来额外的开销,反而可能拖慢任务执行速度。通常更推荐用local[*]来让Spark自动识别并使用机器的所有逻辑核心数(也就是你的8个),这样能平衡并行度和系统开销。
附上你的测试代码方便参考:
import time from pyspark import SparkContext sc = SparkContext(master="local[16]") t0 = time() rdd = sc.parallelize([1,2]*10000000) rdd1 = rdd.reduce(lambda x,y:x+y) print(time()-t0)
内容的提问来源于stack exchange,提问作者Van
相关产品推荐
相关产品推荐

