PySpark: java.lang.OutofMemoryError: Java heap space

我最近一直在我的服务器上使用PySpark和Ipython,有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()

它给了我超出记忆错误。.另外,在此错误之后,我无法在Spark上执行任何操作,因为它会断开与Java的连接。它给出了.Java heap SpacePy4JNetworkError: Cannot connect to the java server

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

编辑

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

我根据这里的文档更改了火花选项(如果你做ctrl-f并搜索spark.executor.extraJavaOptions):http://spark.apache.org/docs/1.2.1/configuration.html

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


答案 1

在尝试了大量配置参数后,我发现只需要更改一个即可启用更多的堆空间,即.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 应用程序,然后重新运行它。您不会再遇到此错误。:)


答案 2

如果你正在寻找从脚本或 jupyter 笔记本中设置此项的方法,你可以执行以下操作:

from pyspark.sql import SparkSession

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

推荐