apache-spark - Spark java.lang.OutOfMemoryError : Java Heap space

标签 apache-spark out-of-memory spark-submit

<分区>

当我使用 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()`

inputData 有大约 2500 万行,大小约为 2GB。模型构建阶段是这样发生的

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)

我正在使用以下命令在具有 16gb RAM 的机器上本地运行上述 spark 作业

spark-submit --class holmes.model.building.ModelBuilder ./holmes-model-building/target/scala-2.11/holmes-model-building_2.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 --conf spark.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) 删除 spark.memory.offHeap.enabled=true 并将驱动程序内存增加到盒子上可用内存的大约 90%。您可能知道这一点,因为您没有设置执行程序内存,但在本地模式下,驱动程序和执行程序都在同一进程中运行,该进程由驱动程序内存控制。我没有尝试过,但是 offHeap 功能听起来值(value)有限。 Reference

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

3a) 如果您想坚持使用本地模式,请尝试使用较少的内核。您可以通过指定在 master 设置中使用的核心数来实现这一点,例如 --master local[4] 而不是使用所有核心的 local[*] 。使用较少的同时处理数据的线程运行将导致在任何给定时间 RAM 中的数据较少。

3b) 如果您迁移到集群,出于与上述相同的原因,您可能还想调整执行程序核心的数量。您可以使用 --executor-cores 标志执行此操作。

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

关于apache-spark - Spark java.lang.OutOfMemoryError : Java Heap space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082110/

相关文章:

java - Spark : Complex operation with dataframes

Scala 向量标量乘法

delphi - 如何分析Delphi应用程序中过多的内存消耗(PageFileUsage)?

scala - 值拆分不是 (String, String) 的成员

apache-spark - 如何将配置从 spark-submit 传递到 yarn cluster?

java.lang.NoClassDefFoundError Spark-submit 使用其他项目中的类

python - 如何将 pyspark 日志记录级别设置为调试?

database - Crate - 节点主机的最低内存要求是多少?

android - 什么时候(如果有的话)我应该使用 Bitmap.recycle()?

hadoop - spark Yarn模式如何从spark-submit获取applicationId