我是PySpark的新手,我正在尝试在本地计算机上使用 * Jupyter-Notebook *。
我想通过执行以下操作将 * spark. driver. memory * 设置为9Gb:
spark = SparkSession.builder \
.master("local[2]") \
.appName("test") \
.config("spark.driver.memory", "9g")\
.getOrCreate()
sc = spark.sparkContext
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
spark.sparkContext._conf.getAll() # check the config
它回来了
[('spark.driver.memory', '9g'),
('spark.driver.cores', '4'),
('spark.rdd.compress', 'True'),
('spark.driver.port', '15611'),
('spark.serializer.objectStreamReset', '100'),
('spark.app.name', 'test'),
('spark.executor.id', 'driver'),
('spark.submit.deployMode', 'client'),
('spark.ui.showConsoleProgress', 'true'),
('spark.master', 'local[2]'),
('spark.app.id', 'local-xyz'),
('spark.driver.host', '0.0.0.0')]
这很奇怪,因为当我看这份文件时,它显示
注意:在客户端模式中,此配置不能通过SparkConf直接在应用程序中设置,因为此时驱动程序JVM已经启动。请通过--driver-memory命令行选项或在默认属性文件中设置此配置。document here
但是,正如您在上面的结果中看到的,它返回
[('Spark.驱动器.内存','9g')
即使我访问spark web UI(端口 * 4040 , 环境 * 选项卡),它仍然显示
我用'spark.driver.memory', '10g'
又试了一次。* web UI * 和spark.sparkContext._conf.getAll()
返回了**'10g'**。我对此很困惑。我的问题是:
1.文档中有关spark.driver.memory
配置的内容是否正确
1.如果文档是正确的,有没有一个正确的方法,我可以检查spark.driver.memory
后配置。我尝试了spark.sparkContext._conf.getAll()
以及 * Spark Web UI *,但它似乎导致了一个错误的答案。
3条答案
按热度按时间j0pj023g1#
您提供了以下代码。
不能直接通过
SparkConf
设置此配置表示您可以设置驱动程序内存,但不建议在RUN TIME时设置。因此,如果您使用
spark.driver.memory
设置它,它会接受更改并覆盖它。但不建议这样做。因此,这个注解不能直接通过SparkConf设置这个配置在文档中不适用。您可以告诉JVM示例化它自己(JVM)的驱动程序内存为9g
,使用SparkConf
。现在,如果你沿着这条线走(Spark对此没有意见)
相反,请通过--driver-memory进行设置,这意味着
当您尝试根据
client
提交Spark
作业时,您可以使用--driver-memory
标志设置驱动程序内存,例如现在这一行以下面的短语结束
或在默认属性文件中。
您可以让您环境中的
SPARK
从SPARK_CONF_DIR
或$SPARK_HOME/conf
中读取默认设置,其中driver-memory
可以进行配置。Spark也可以这样做。回答你的第二部分
如果文档是正确的,是否有一个适当的方法,我可以检查spark.driver.memory后配置。我尝试了spark.sparkContext._conf.getAll()以及Spark Web UI,但它似乎导致了一个错误的答案。”
我想说的是,文档是正确的。您可以检查驱动程序内存使用或最终为您所指定的关于
spark.sparkContext._conf.getAll()
的作品太。结束有关文档的讨论。您可以在
spark-shell
、Jupyter Notebook
或已初始化Spark
的任何其他环境(不推荐)。spark-submit
命令(推荐使用)SPARK_CONF_DIR
或SPARK_HOME/conf
(建议使用)spark-shell
spark-shell --driver-memory 9G
有关详细信息,请参阅,
Default Spark Properties File
hof1towb2#
仅当驱动程序JVM在**之前未启动时,才能通过
SparkSession.builder.config
**设置spark.driver.memory
。为了证明这一点,首先对一个新的Python解释器运行以下代码:
代码抛出
java.lang.OutOfMemoryError: GC overhead limit exceeded
,因为512 m的驱动程序容纳不下10 M行,但是如果你使用2g内存(同样,使用新的Python解释器):代码运行得很好。现在,你会想到这个:
运行没有错误,因为您的会话的
spark.driver.memory
似乎设置为2g。但是,您得到java.lang.OutOfMemoryError: GC overhead limit exceeded
,这意味着您的驱动程序内存仍然是512 m!驱动程序内存没有更新,因为驱动程序JVM在接收到新配置时已经启动。有趣的是,如果您使用spark.sparkContext.getConf().getAll()
读取spark的配置(或者从Spark UI),它告诉你你的驱动内存是2g,这显然不是真的。因此,正式的spark文档(https://spark.apache.org/docs/2.4.5/configuration.html#application-properties)中说您应该通过--driver-memory命令行选项或在默认属性文件中设置驱动程序内存是正确的。
mo49yndu3#
是的,文档是正确的。JVM启动前需要指定内存。JVM启动后,即使您在应用程序内部以编程方式更改该属性的值,也不会重置JVM分配的内存。您可以从Spark UI的“Executors”选项卡验证分配和使用的驱动程序内存。
注意:在客户机模式下,不能直接在应用程序中通过SparkConf设置此配置,因为此时驱动程序JVM已经启动。