You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:30:44