在PySp中以编程方式设置驱动程序的内存大小

2024-06-14 08:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

为了编写一个独立的脚本,我想直接从Python启动并配置Spark上下文。 使用PySpark的脚本,我可以设置驱动程序的内存大小:

$ /opt/spark-1.6.1/bin/pyspark
... INFO MemoryStore: MemoryStore started with capacity 511.5 MB ...
$ /opt/spark-1.6.1/bin/pyspark --conf spark.driver.memory=10g
... INFO MemoryStore: MemoryStore started with capacity 7.0 GB ...

但是,当从Python模块启动上下文时,无法设置驱动程序的内存大小:

$ export SPARK_HOME=/opt/spark-1.6.1                                                                                                                                                                                                                                                                                                                
$ export PYTHONPATH=$PYTHONPATH:$SPARK_HOME/python
$ python
>>> from pyspark import SparkConf, SparkContext
>>> sc = SparkContext(conf=SparkConf().set('spark.driver.memory', '10g'))
... INFO MemoryStore: MemoryStore started with capacity 511.5 MB ...

我知道的唯一解决方案是在sparks-default.conf中设置spark.driver.memory,这是不令人满意的。 正如this post中所解释的,Java/Scala在JVM启动后不能更改驱动程序的内存大小是有意义的。 在导入pyspark模块之前或导入时,是否有办法从Python动态配置它?


Tags: info脚本binconfdriverwith驱动程序spark
3条回答

您可以使用--driver memory标志通过spark submit命令传递它。

spark-submit   \
    --master yarn  \
    --deploy-mode cluster  \
    --driver-cores 12 --driver-memory 20g \
    --num-executors 52 --executor-cores 6  --executor-memory 30g MySparkApp.py

在shell脚本或其他脚本中使用上述命令,而不是20(手动设置的驱动程序内存)有一个可以动态更改的变量。

我也有同样的问题,只是想出了一个老生常谈的办法。结果there is an existing answer采用了相同的方法。但我要解释它为什么有效。

如您所知,无法设置驱动程序内存after the JVM starts。但是当创建SparkContext时,pyspark通过calling spark-submit and passing in pyspark-shell as the command启动JVM

SPARK_HOME = os.environ["SPARK_HOME"]
# Launch the Py4j gateway using Spark's run command so that we pick up the
# proper classpath and settings from spark-env.sh
on_windows = platform.system() == "Windows"
script = "./bin/spark-submit.cmd" if on_windows else "./bin/spark-submit"
submit_args = os.environ.get("PYSPARK_SUBMIT_ARGS", "pyspark-shell")
if os.environ.get("SPARK_TESTING"):
   submit_args = ' '.join([
        "--conf spark.ui.enabled=false",
        submit_args
    ])
command = [os.path.join(SPARK_HOME, script)] + shlex.split(submit_args)

注意PYSPARK_SUBMIT_ARGS环境变量。这些是上下文将发送给spark-submit命令的参数。

因此只要在实例化新的SparkContext之前设置PYSPARK_SUBMIT_ARGS="--driver-memory=2g pyspark-shell",驱动程序内存设置就应该生效。有多种方法可以设置此环境变量,请参阅我之前为一个方法链接的答案。

像现在这样使用conf是没有意义的。 尝试将此序言添加到代码中:

memory = '10g'
pyspark_submit_args = ' --driver-memory ' + memory + ' pyspark-shell'
os.environ["PYSPARK_SUBMIT_ARGS"] = pyspark_submit_args

相关问题 更多 >