【发布时间】:2016-07-01 21:39:09
【问题描述】:
我正在根据维基百科文章(400 万份文档,约 14GB 数据)训练 LDA 模型。我在一台内存约为 98GB 的机器上运行 scala 脚本。我使用以下参数在 spark shell 中运行 scala 代码:
$SPARK_HOME/bin/spark-shell --executor-memory 2G --driver-memory 25G --total-executor-cores 10 --conf spark.driver.maxResultSize=50g
代码sn-p:
val lda = new LDA().setOptimizer(new OnlineLDAOptimizer()).setK(numTopics).setMaxIterations(maxIterations)
val ldaModel = lda.run(lda_countVector)
执行 lda.run() 时出现以下错误:
scala> val ldaModel = lda.run(lda_countVector)
16/06/30 12:53:45 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
16/06/30 12:53:45 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
[Stage 21:==============================> (238 + 85) / 408]16/06/30 13:35:59 ERROR Executor: Exception in task 315.0 in stage 21.0 (TID 2803)
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java:1853)
at java.io.ObjectOutputStream.write(ObjectOutputStream.java:709)
at org.apache.spark.util.Utils$.writeByteBuffer(Utils.scala:183)
at org.apache.spark.scheduler.DirectTaskResult$$anonfun$writeExternal$1.apply$mcV$sp(TaskResult.scala:52)
at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1204)
at org.apache.spark.scheduler.DirectTaskResult.writeExternal(TaskResult.scala:49)
at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1459)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1430)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:44)
at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:101)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:256)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我尝试了各种内存设置,例如增加驱动程序内存、增加 maxResultSize 内存、执行程序内存等,但我仍然遇到同样的错误。如果我将 maxResultSize 降低到 40GB 以下,则会出现 maxResultSize 错误。
请帮我找出正确的内存设置。像这样的典型应用应该怎么做?
谢谢。
【问题讨论】:
-
根据 JRE 版本,您应该更多地查看 JVM 选项,尤其是
-Xmx。 -
--executor-memory 2G --driver-memory 25G 看起来很奇怪。在相反的情况下使用它更有意义。
-
谢谢大家,我会试试的。
-
@rockie-yang 如果我减少驱动程序内存,我会出现内存不足异常,并且火花日志建议我增加驱动程序内存。我想知道 LDA 的 run 方法是否在计算时返回结果。为什么还会出现 OutOfMemory 和 maxResultSize 等错误?有什么想法吗?
-
如果驱动程序发生OOM,则驱动程序的数据过多。由于您有 14G 数据,因此可能与分区有关。尝试增加分区数看看会发生什么。
标签: scala memory apache-spark