PySpark大计算量任务触发电脑关机?求故障原因
问题:Spark计算圆周率时样本量过大导致电脑直接关机
我运行以下Spark脚本计算圆周率:
import pyspark import random sc = pyspark.SparkContext(appName="Pi") num_samples = 100000000 def inside(p): x, y = random.random(), random.random() return x*x + y*y < 1 count = sc.parallelize(range(0, num_samples)).filter(inside).count() pi = 4 * count / num_samples print(pi) sc.stop()
当num_samples设为1亿时运行正常,但增大到10亿后,电脑仅运行约2秒就直接关机。我的硬件配置是CPU AMD 5950X、64GB内存、GPU RTX 3070 TI,请问这是什么原因?
原因分析
- Driver端内存过载触发硬件保护:使用
sc.parallelize(range(0, num_samples))创建RDD时,Spark会在Driver节点将range(0, 1000000000)完全加载为Python列表。64位系统中每个Python整数对象约占28字节,10亿个对象会占用超过260GB内存,远超你的64GB物理内存。 - 过热触发关机:内存耗尽后系统会强制启用磁盘交换分区,导致CPU长时间满负载运行,同时内存和CPU温度急剧上升,触发主板过温保护机制,直接切断电源关机。
解决方案
1. 避免Driver端加载超大列表
使用PySpark内置的sc.range()方法替代parallelize(range(...)),该方法会直接在Executor节点分布式生成数值序列,无需在Driver端预加载完整列表:
import pyspark import random sc = pyspark.SparkContext(appName="Pi") num_samples = 1000000000 def inside(p): x, y = random.random(), random.random() return x*x + y*y < 1 # 用sc.range创建分布式RDD,避免Driver内存过载 count = sc.range(0, num_samples).filter(inside).count() pi = 4 * count / num_samples print(pi) sc.stop()
2. 调整Spark内存配置(可选)
启动Spark时可手动指定Driver和Executor的内存上限,避免内存资源耗尽:
spark-submit --driver-memory 16g --executor-memory 32g your_script.py
3. 检查硬件散热
建议排查CPU、内存的散热系统,确保风扇运转正常、硅脂状态良好,避免因过热导致硬件损伤或异常关机。
内容的提问来源于stack exchange,提问作者datashout
相关产品推荐
相关产品推荐

