如何在客户端模式下设置'spark.driver.memory'- pyspark(版本2.3.1)

i2loujxw  于 2023-02-15  发布在  Spark
关注(0)|答案(3)|浏览(258)

我是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 *,但它似乎导致了一个错误的答案。

j0pj023g

j0pj023g1#

您提供了以下代码。

spark = SparkSession.builder \
       .master("local[2]") \
       .appName("test") \
       .config("spark.driver.memory", "9g")\ # This will work (Not recommended)
       .getOrCreate()
sc = spark.sparkContext
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

不能直接通过SparkConf设置此配置
表示您可以设置驱动程序内存,但不建议在RUN TIME时设置。因此,如果您使用spark.driver.memory设置它,它会接受更改并覆盖它。但不建议这样做。因此,这个注解不能直接通过SparkConf设置这个配置在文档中不适用。您可以告诉JVM示例化它自己(JVM)的驱动程序内存为9g,使用SparkConf
现在,如果你沿着这条线走(Spark对此没有意见
相反,请通过--driver-memory进行设置,这意味着
当您尝试根据client提交Spark作业时,您可以使用--driver-memory标志设置驱动程序内存,例如

spark-submit --deploy-mode client --driver-memory 12G

现在这一行以下面的短语结束
或在默认属性文件中。
您可以让您环境中的SPARKSPARK_CONF_DIR$SPARK_HOME/conf中读取默认设置,其中driver-memory可以进行配置。Spark也可以这样做。
回答你的第二部分
如果文档是正确的,是否有一个适当的方法,我可以检查spark.driver.memory后配置。我尝试了spark.sparkContext._conf.getAll()以及Spark Web UI,但它似乎导致了一个错误的答案。”
我想说的是,文档是正确的。您可以检查驱动程序内存使用或最终为您所指定的关于spark.sparkContext._conf.getAll()的作品太。

>>> sc._conf.get('spark.driver.memory')
u'12g' # which is 12G for the driver I have used

结束有关文档的讨论。您可以在

  • spark-shellJupyter Notebook或已初始化Spark的任何其他环境(不推荐)。
  • spark-submit命令(推荐使用
  • SPARK_CONF_DIRSPARK_HOME/conf建议使用
  • 可以通过指定以下命令启动spark-shell

spark-shell --driver-memory 9G
有关详细信息,请参阅,
Default Spark Properties File

hof1towb

hof1towb2#

仅当驱动程序JVM在**之前未启动时,才能通过SparkSession.builder.config**设置spark.driver.memory
为了证明这一点,首先对一个新的Python解释器运行以下代码:

spark = SparkSession.builder.config("spark.driver.memory", "512m").getOrCreate()
spark.range(10000000).collect()

代码抛出java.lang.OutOfMemoryError: GC overhead limit exceeded,因为512 m的驱动程序容纳不下10 M行,但是如果你使用2g内存(同样,使用新的Python解释器):

spark = SparkSession.builder.config("spark.driver.memory", "2g").getOrCreate()
spark.range(10000000).collect()

代码运行得很好。现在,你会想到这个:

spark = SparkSession.builder.config("spark.driver.memory", "512m").getOrCreate()
spark.stop()  # to set new configs, you must first stop the running session 
spark = SparkSession.builder.config("spark.driver.memory", "2g").getOrCreate()
spark.range(10000000).collect()

运行没有错误,因为您的会话的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命令行选项或在默认属性文件中设置驱动程序内存
是正确的。

mo49yndu

mo49yndu3#

是的,文档是正确的。JVM启动前需要指定内存。JVM启动后,即使您在应用程序内部以编程方式更改该属性的值,也不会重置JVM分配的内存。您可以从Spark UI的“Executors”选项卡验证分配和使用的驱动程序内存。
注意:在客户机模式下,不能直接在应用程序中通过SparkConf设置此配置,因为此时驱动程序JVM已经启动。

相关问题