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

pg2*_*455 34 java heap-memory out-of-memory apache-spark pyspark

我最近在我的服务器上使用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))
Run Code Online (Sandbox Code Playgroud)

当我做

training_data =  train_dataRDD.collectAsMap()
Run Code Online (Sandbox Code Playgroud)

它给了我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选项来避免OOM.我做了同样的事情,但似乎没有工作.

pg2*_*455 48

在尝试了大量配置参数之后,我发现只需要更改一个配置参数以启用更多的堆空间即ie 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
Run Code Online (Sandbox Code Playgroud)

关闭现有的火花应用程序并重新运行它.您不会再遇到此错误.:)

  • 来自docs:spark.driver.memory"用于驱动程序进程的内存量,即SparkContext初始化的位置.(例如1g,2g).注意:在客户端模式下,不能直接通过SparkConf设置此配置应用程序,因为驱动程序JVM已经在那时启动了.相反,请通过--driver-memory命令行选项或默认属性文件中设置它." (5认同)
  • 您可以从实际脚本(即`set('spark.driver.memory','15g')`)更改此conf值吗? (3认同)
  • 没有您的解决方案不起作用。 (2认同)

lou*_*ton 25

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

from pyspark.sql import SparkSession

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