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

时间:2018-12-04 06:14:59

标签: python pyspark config

我是PySpark的新手,我想在我的本地计算机上使用 Jupyter-Notebook 使用 pySpark (版本2.3.1)。

我要通过以下操作将 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.driver.memory','9g')

即使我访问 spark web UI (在端口 4040 environment 选项卡上),它仍然会显示 enter image description here

我又尝试了一次'spark.driver.memory', '10g'网络用户界面spark.sparkContext._conf.getAll()返回了'10g'。 我对此感到困惑。 我的问题是:

  1. 有关spark.driver.memory配置的文档对吗

  2. 如果文档正确,是否有正确的方法可以在配置后检查spark.driver.memory。我尝试了spark.sparkContext._conf.getAll()以及 Spark Web UI ,但似乎导致了错误的答案。

3 个答案:

答案 0 :(得分:2)

您提供了以下代码。

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设置此配置

表示您可以设置驱动程序内存,但是不建议在运行时间中使用。因此,如果您使用spark.driver.memory进行设置,它将接受更改并覆盖它。但是,不建议这样做。因此,该注释不得直接通过SparkConf设置此配置,不适用于文档。您可以使用9g告诉JVM用SparkConf的驱动程序内存实例化自身(JVM)。

现在,如果您按此行进行操作(可以使用此火花

  

相反,请通过--driver-memory进行设置,这意味着

当您尝试针对Spark提交client作业时,可以使用--driver-memory标志设置驱动程序内存,例如

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

现在该行以以下短语结尾

  

或您的默认属性文件中。

您可以告诉环境中的SPARKSPARK_CONF_DIR$SPARK_HOME/conf中读取可以配置driver-memory的默认设置。 火花也可以。

回答第二部分

  

如果文档正确,是否有正确的方法可以在配置后检查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.driver.memory”
  • spark-shellJupyter Notebook或您已经初始化Spark的任何其他环境(不推荐)。
  • spark-submit命令(推荐)
  • SPARK_CONF_DIRSPARK_HOME/conf(推荐)
  • 您可以通过指定

    来启动spark-shell

    spark-shell --driver-memory 9G

有关更多信息,请参见

Default Spark Properties File

答案 1 :(得分:1)

通过spark.driver.memory设置SparkSession.builder.config 仅在之前尚未启动驱动程序JVM的情况下有效。

要证明这一点,请首先针对新的Python解释器运行以下代码:

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

代码将抛出java.lang.OutOfMemoryError: GC overhead limit exceeded,因为1000万行不适合512m驱动程序。但是,如果您尝试使用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,这表示您的驱动程序内存仍然是512m!。由于驱动程序JVM在收到新配置时已经启动,因此驱动程序内存尚未更新。有趣的是,如果您使用spark.sparkContext.getConf().getAll()(或从Spark UI)读取spark的配置,它会告诉您驱动程序内存为2g,这显然是不正确的。

因此,官方Spark文档(https://spark.apache.org/docs/2.4.5/configuration.html#application-properties)正确地说您应该通过--driver-memory命令行选项或在默认属性文件中设置驱动程序内存。< / p>

答案 2 :(得分:0)

是的,文档是正确的。需要在JVM启动之前指定内存。 JVM启动后,即使您在应用程序内以编程方式更改属性的值,它也不会重置JVM分配的内存。您可以从Spark UI的“执行程序”选项卡中验证分配和使用的驱动程序内存。

  

注意:在客户端模式下,不得通过   SparkConf直接在您的应用程序中,因为驱动程序JVM具有   已经开始了。

enter image description here