为了编写一个独立的脚本,我想直接从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动态配置它?
答案 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
启动JVMSPARK_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 (手动设置的驱动程序内存)有一个可以动态更改的变量。