Установите размер памяти драйвера программно в PySpark

чтобы написать автономный скрипт, я хотел бы запустить и настроить контекст Spark непосредственно из Python. Используя скрипт 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, который не является удовлетворительным. Как объясняется в этот пост, это имеет смысл для Java / Scala не в состоянии изменить размер памяти драйвера после запуска JVM. Есть ли способ каким-то образом настроить его динамически из Python до или при импорте pyspark модуль?

3 ответов


нет смысла использовать conf, как вы это делаете. Попробуйте добавить эту преамбулу в свой код:

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

у меня была такая же проблема, и я просто понял, как это сделать. И получается существует ответа который принимает тот же подход. Но я объясню, почему это работает.

как известно, драйвер-память не может быть установлен после JVM запускается. Но при создании SparkContext pyspark запускает JVM по вызов spark-submit и передача в pyspark-shell в качестве команда

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 переменные среды. Это аргументы, которые контекст будет отправлять в .

так долго, как вы установите PYSPARK_SUBMIT_ARGS="--driver-memory=2g pyspark-shell" до вы создаете новыйSparkContext, настройка памяти драйвера должна вступить в силу. Существует несколько способов установить эту переменную среды, см. ответ, который я связал ранее для одного метода.


вы можете передать его через команду spark-submit, используя --driver-memory флаг.

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

имейте эту команду выше в скрипте оболочки или другом и вместо 20 (память драйверов, которая устанавливается вручную) имеет переменную, которую вы можете динамически изменять.