在运行时增加 PySpark 可用的内存

Increase memory available to PySpark at runtime

我正在尝试使用 Spark 构建推荐系统,只是 运行 内存不足:

Exception in thread "dag-scheduler-event-loop" java.lang.OutOfMemoryError: Java heap space

我想通过在运行时修改 PySpark 中的 spark.executor.memory 属性 来增加 Spark 可用的内存。

这可能吗?如果是,怎么做?

更新

受到@zero323 评论中link的启发,我尝试删除并重新创建 PySpark 中的上下文:

del sc
from pyspark import SparkConf, SparkContext
conf = (SparkConf().setMaster("http://hadoop01.woolford.io:7077").setAppName("recommender").set("spark.executor.memory", "2g"))
sc = SparkContext(conf = conf)

返回:

ValueError: Cannot run multiple SparkContexts at once;

这很奇怪,因为:

>>> sc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sc' is not defined

您可以在启动 pyspark-shell

时设置 spark.executor.memory
pyspark --num-executors 5 --driver-memory 2g --executor-memory 2g

我不确定你为什么选择上面的答案,因为它需要重新启动 shell 并使用不同的命令打开!尽管这可行并且很有用,但实际上有一个在线解决方案是所要求的。这基本上就是@zero323 在上面的评论中引用的内容,但是 link 导致 post 描述了 Scala 中的实现。下面是专门针对 PySpark 的工作实现。

注意:您要修改设置的SparkContext必须没有启动,否则您需要关闭它,修改设置,然后重新打开。

from pyspark import SparkContext
SparkContext.setSystemProperty('spark.executor.memory', '2g')
sc = SparkContext("local", "App Name")

来源: https://spark.apache.org/docs/0.8.1/python-programming-guide.html

p.s。如果您需要关闭 SparkContext,只需使用:

SparkContext.stop(sc)

要仔细检查已设置的当前设置,您可以使用:

sc._conf.getAll()

据我所知,不可能在 运行 时更改 spark.executor.memory。数据节点上的容器甚至会在 spark-context 初始化之前创建。

引用this,在2.0.0之后你不必使用SparkContext,而是SparkSessionconf方法如下:

spark.conf.set("spark.executor.memory", "2g")