当前位置: 首页 > 知识库问答 >
问题:

Spark Java.lang.OutOfMemoryError:Java堆空间[重复]

夏景同
2023-03-14

当我使用spark运行一个模型训练管道时,我产生了上面的错误

`val inputData = spark.read
  .option("header", true)
  .option("mode","DROPMALFORMED")
  .csv(input)
  .repartition(500)
  .toDF("b", "c")
  .withColumn("b", lower(col("b")))
  .withColumn("c", lower(col("c")))
  .toDF("b", "c")
  .na.drop()`
val tokenizer = new Tokenizer()
  .setInputCol("c")
  .setOutputCol("tokens")

val cvSpec = new CountVectorizer()
  .setInputCol("tokens")
  .setOutputCol("features")
  .setMinDF(minDF)
  .setVocabSize(vocabSize)

val nb = new NaiveBayes()
  .setLabelCol("bi")
  .setFeaturesCol("features")
  .setPredictionCol("prediction")
  .setSmoothing(smoothing)

new Pipeline().setStages(Array(tokenizer, cvSpec, nb)).fit(inputData)

spark-submit--class holmes.model.building.modelbuilding/target/scala-2.11/holmes-model-building2.11-1.0.0-snapshot-7d6978.jar--master local[*]--conf spark.serializer=org.apache.spark.serializer.kryoserializer--conf spark.kryoserializer.buffer.max=2000m--conf spark.driver.maxresultsize=2g--conf spark.rpc.message.maxsize=1024--conf spark.memory.offheap.enabled=true.memory.offheap.size=50g--driver-memory=12g

oom错误由org.apache.spark.util.Collection.ExternalSorter.WritePartitionedFile(ExternalSorter.Scala:706)触发(在堆栈跟踪的底部)

日志:

Caused by: java.lang.OutOfMemoryError: Java heap space at java.lang.reflect.Array.newInstance(Array.java:75) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1897) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) org.apache.spark.util.collection.ExternalSorter.writePartitionedFile(ExternalSorter.scala:706) 

任何建议都会很棒:)

共有1个答案

武峻熙
2023-03-14

我会尝试的事情:

1)删除spark.memory.offheap.enabled=true并将驱动程序内存增加到框上可用内存的90%。您可能知道这一点,因为您没有设置执行程序内存,但在本地模式下,驱动程序和执行程序都运行在由驱动程序内存控制的同一进程中。我没有尝试过,但offheap功能听起来价值有限。参考

2)一个实际的集群而不是本地模式。更多的节点显然会给你更多的RAM。

3b)如果您移动到一个集群,您可能还希望调整executors内核的数量,原因与上面提到的相同。您可以使用--executor-cores标志来完成此操作。

4)尝试使用更多的分区。在您的示例代码中,您重新分区到500个分区,也许可以尝试1000或2000个分区?更多的分区意味着每个分区更小,内存压力更小。

 类似资料:
  • 我有一个文件,大小,我试图在Windows10上运行它,在DBeaver程序上使用RAM,我得到错误 我尝试了许多解决办法,但都不起作用。、、对我都不起作用。

  • 我有一个Java控制台应用程序,它使用DOM处理大的xml文件,基本上它从数据库中获取的数据创建xml文件。现在,正如你所猜测的那样,它使用了大量的内存,但令我惊讶的是,它与糟糕的代码无关,而是与“Java堆空间没有缩小”有关。我尝试使用这些JVM参数从Eclipse运行我的应用程序: 我甚至添加了 正如您所看到的,我的应用程序在某一点上占用了约400 MB的堆空间,堆增长到约650 MB,但几秒

  • 问题内容: 我最近在具有24个CPU和32GB RAM的服务器上使用了带有Ipython的PySpark。它仅在一台机器上运行。在我的过程中,我想收集以下代码中给出的大量数据: 当我做 它给我outOfMemory错误。。另外,此错误发生后,我无法在Spark上执行任何操作,因为它失去了与Java的连接。它给。 看起来堆空间很小。如何设置更大的限制? 编辑 : 我在运行之前尝试过的事情: 我根据此

  • 问题内容: 我在执行多线程程序时遇到以下错误 上面的错误发生在其中一个线程中。 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。 有什么办法可以增加堆空间? 我应该对程序进行哪些更改,以使其占用更少的堆空间? 问题答案: 如果要增加堆空间,可以 -在命令行上使用。默认情况下,这些值基于JRE版本和系统配置。你可以在Ja

  • 我面临一些关于内存问题的问题,但我无法解决它。非常感谢您的帮助。我不熟悉Spark和pyspark功能,试图读取大约5GB大小的大型JSON文件,并使用 每次运行上述语句时,都会出现以下错误: 我需要以RDD的形式获取JSON数据,然后使用SQLSpark进行操作和分析。但是我在第一步(读取JSON)本身就出错了。我知道要读取如此大的文件,需要对Spark会话的配置进行必要的更改。我遵循了Apac

  • 我想从网页上选定的文本中提取名词,并在文本显示时突出显示它们。所以我使用OpenNLP库来解析和获取名词列表。它在java类中运行良好,没有内存问题,尽管在显示输出之前花费了6-7秒,但当我在jsp页面中运行代码时,我得到了以下错误: 根本原因 我读到的一些解决方案建议通过这样做来增加apache tomcat的堆内存大小: 所以我将其设置为-Xmx2g,但仍然会产生相同的错误。我认为我不需要修改