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

时间:2016-06-23 09:04:06

标签: python apache-spark pyspark

为了编写一个独立的脚本,我想直接从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 ...

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

3 个答案:

答案 0 :(得分:7)

使用conf是没有意义的。 尝试将此序言添加到您的代码中:

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

答案 1 :(得分:2)

我有这个完全相同的问题,只是想出了一个hacky方法来做到这一点。事实证明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命令的参数。

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

答案 2 :(得分:0)

你可以使用 - 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 (手动设置的驱动程序内存)有一个可以动态更改的变量。