Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark java.lang.OutOfMemoryError:java堆空间_Apache Spark_Out Of Memory_Spark Submit - Fatal编程技术网

Apache spark Spark java.lang.OutOfMemoryError:java堆空间

Apache spark Spark java.lang.OutOfMemoryError:java堆空间,apache-spark,out-of-memory,spark-submit,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

当我使用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--驱动程序内存=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%左右。您可能知道这一点,因为您没有设置执行器内存,但在本地模式下,驱动程序和执行器都在同一进程中运行,该进程由驱动程序内存控制。我还没有试过,但是
堆外
功能听起来价值有限

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

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

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


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

通常,当Java堆中没有足够的空间分配对象时,会抛出此错误。在这种情况下,垃圾收集器无法提供空间来容纳新对象,堆也无法进一步扩展。此外,当本机内存不足以支持加载Java类时,可能会引发此错误。在极少数情况下,当执行垃圾收集的时间过长且释放的内存很少时,可能会抛出java.lang.OutOfMemoryError

如何修复错误:

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) 


请在java.io.ObjectInputStream.readArray(ObjectInputStream.java:1897)的java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529)的java.io.ObjectInputStream.readArray(ObjectInputStream.java:1897)处添加由以下原因引起的完整日志˚:java.lang.OutOfMemoryError:java.lang.reflect.Array.newInstance(Array.java:75)(ObjectInputStream.java:2027)位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)org.apache.spark.util.collection.ExternalSorter.writePartitionedFile(ExternalSorter.scala:706)这能回答你的问题吗?谢谢你,Ryan。我会试试你的建议。