我是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 选项卡上),它仍然会显示
我又尝试了一次'spark.driver.memory', '10g'
。 网络用户界面和spark.sparkContext._conf.getAll()
返回了'10g'。
我对此感到困惑。
我的问题是:
有关spark.driver.memory
配置的文档对吗
如果文档正确,是否有正确的方法可以在配置后检查spark.driver.memory
。我尝试了spark.sparkContext._conf.getAll()
以及 Spark Web UI ,但似乎导致了错误的答案。
答案 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
现在该行以以下短语结尾
或您的默认属性文件中。
您可以告诉环境中的SPARK
从SPARK_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-shell
,Jupyter Notebook
或您已经初始化Spark
的任何其他环境(不推荐)。spark-submit
命令(推荐)SPARK_CONF_DIR
或SPARK_HOME/conf
(推荐)您可以通过指定
来启动spark-shell
spark-shell --driver-memory 9G
有关更多信息,请参见
答案 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)