如何设置PySpark运行时JVM的Xmx内存参数?
这个问题我之前也碰到过,核心是你混淆了不同Spark内存参数的作用,且没找对正确的配置时机——先给你拆解清楚:你看到的-Xmx1g是Spark Driver进程的初始堆内存,而你尝试的SPARK_DAEMON_MEMORY是给Spark集群守护进程(比如Master、Worker)用的,和Driver完全不相关,所以修改它肯定没用。下面给你几种靠谱的修改方式:
1. 单次会话临时生效(最直接)
启动pyspark shell的时候直接指定--driver-memory参数,比如要改成4G:
pyspark --driver-memory 4g
或者用spark-submit提交作业时加上这个参数:
spark-submit --driver-memory 4g your_script.py
这样启动的JVM命令里就会自动把-Xmx1g替换成-Xmx4g,你可以再用ps aux验证。
2. 全局永久生效(所有Spark会话)
修改Spark的默认配置文件,一劳永逸:
- 找到你的Spark安装目录下的
conf文件夹(如果是conda装的pyspark,路径可能是~/miniconda3/lib/python3.6/site-packages/pyspark/conf) - 复制
spark-defaults.conf.template为spark-defaults.conf - 在文件里添加一行:
spark.driver.memory 4g
保存后,不管是启动pyspark shell还是提交作业,都会自动应用这个内存配置。
3. 通过环境变量生效(需提前设置)
如果想用环境变量,要确保在启动Spark之前正确导出SPARK_DRIVER_MEMORY,比如在Linux终端里:
export SPARK_DRIVER_MEMORY=4g pyspark
注意:如果是在pyspark shell启动之后再设置环境变量,肯定不会生效——因为进程已经启动,参数没法动态修改。
4. 在Python代码中指定(适合脚本提交)
如果是写独立的PySpark脚本,可以在初始化Spark上下文之前通过SparkConf设置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("YourAppName") \ .config("spark.driver.memory", "4g") \ .getOrCreate()
这种方式适合用spark-submit提交的脚本,pyspark shell里因为已经提前初始化了SparkContext,所以这种方法不适用。
最后提醒一句:Driver的内存不要设置超过机器的可用物理内存,不然会触发JVM的OOM错误,反而适得其反。
内容的提问来源于stack exchange,提问作者Reut Sharabani

