PySpark:java.lang.OutOfMemoryError:Java堆空间

79

最近我一直在使用带有Ipython的PySpark,它运行在拥有24个CPU和32GB RAM的服务器上,仅在一台机器上运行。在我的过程中,我想收集大量数据,如下面给出的代码:

train_dataRDD = (train.map(lambda x:getTagsAndText(x))
.filter(lambda x:x[-1]!=[])
.flatMap(lambda (x,text,tags): [(tag,(x,text)) for tag in tags])
.groupByKey()
.mapValues(list))

当我进行这个操作时

training_data =  train_dataRDD.collectAsMap()

它给出了OutOfMemory错误,Java heap Space。此外,在此错误之后我无法执行任何Spark操作,因为它与Java失去连接。它会给出Py4JNetworkError: Cannot connect to the java server

看起来堆空间很小。如何将其设置为更大的限制?

编辑

在运行之前尝试的事情:sc._conf.set('spark.executor.memory','32g').set('spark.driver.memory','32g').set('spark.driver.maxResultsSize','0')

我根据这里的文档更改了spark选项(如果您按Ctrl-F并搜索spark.executor.extraJavaOptions):http://spark.apache.org/docs/1.2.1/configuration.html

它说我可以通过设置spark.executor.memory选项来避免OOMs。我也做了相同的事情,但它似乎没有起作用。


请查看此问题:https://dev59.com/DmEi5IYBdhLWcg3wltIl - Bruno Caceiro
@bcaceiro:我看到很多Spark选项在帖子中被设置。我不使用Scala,我正在使用IPython。您知道我是否可以从shell内设置这些选项吗? - pg2455
@bcaceiro:根据您指向我的帖子的建议,更新了问题。看起来JVM存在一些问题。 - pg2455
4个回答

94

尝试了很多配置参数后,我发现只需要更改一个参数即可启用更多的堆空间,即spark.driver.memory

sudo vim $SPARK_HOME/conf/spark-defaults.conf
#uncomment the spark.driver.memory and change it according to your use. I changed it to below
spark.driver.memory 15g
# press : and then wq! to exit vim editor

关闭您现有的Spark应用程序,然后重新运行它。您将不会再遇到这个错误。 :)


4
你能否从实际的脚本中更改这个配置值(例如 set('spark.driver.memory','15g'))? - swdev
1
我尝试过了,但没有成功。我认为需要使用新的全局参数重新启动。 - pg2455
14
从文档中翻译:spark.driver.memory是指用于驱动程序进程的内存量,即初始化SparkContext的地方。(例如1g、2g)。 注意: 在客户端模式下,不要直接通过SparkConf在您的应用程序中设置此配置,因为驱动程序JVM在该点上已经启动。相反,请通过--driver-memory命令行选项或在默认属性文件中设置它。 - Răzvan Flavius Panda
我正在使用IDEA SBT控制台中的SBT运行Spark代码,对我来说解决方法是在传递给SBT控制台启动的Java VM参数中添加“-Xmx4096M -d64”。这在“其他设置”->“SBT”下进行。 - Răzvan Flavius Panda
Spark不断发展。因此,您可能需要查看其文档,并找出与内存分配相关的配置参数。 - pg2455
我不得不创建$SPARK_HOME/conf/spark-defaults.conf文件,但无论如何都起作用了。另外,我不需要重新启动Spark或其他任何操作,只需重新启动我的Python应用程序,设置就会立即生效。 - Manu CJ

57

如果你想在脚本或Jupyter笔记本中设置这个,你可以这样做:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .master('local[*]') \
    .config("spark.driver.memory", "15g") \
    .appName('my-cool-app') \
    .getOrCreate()

太好了!像预期的那样,在Jupyter Notebook中无缝运行。谢谢! - Rodrigo Hjort

2

我遇到了同样的错误,我只是在创建会话时为Spark分配了内存。

spark = SparkSession.builder.master("local[10]").config("spark.driver.memory", "10g").getOrCreate()

或者

SparkSession.builder.appName('test').config("spark.driver.memory", "10g").getOrCreate()

2
我遇到了与 pyspark 相同的问题(使用 brew 安装)。在我的情况下,它安装在路径 /usr/local/Cellar/apache-spark 上。
我唯一的配置文件位于 apache-spark/2.4.0/libexec/python//test_coverage/conf/spark-defaults.conf
如此建议的这里,我在路径 /usr/local/Cellar/apache-spark/2.4.0/libexec/conf/spark-defaults.conf 中创建了文件 spark-defaults.conf,并将行 spark.driver.memory 12g 添加到其中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接