【问题标题】:Not able to set right memory options in Spark无法在 Spark 中设置正确的内存选项
【发布时间】: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


【解决方案1】:

在 spark-shell 中,您没有提供主 URL。这意味着您在本地模式下运行。所以执行器内存设置将被忽略。核心数将默认为 CPU-s 的数量。最保守的做法是使用 -master local[1]。这意味着只有 1 个核心 您可以将驱动程序内存增加到 80G ,还将 spark.memory.storageFraction 设置为 0.1。这会占用用于缓存 Rdd 的内存,并为减速器提供更多内存。

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 2015-10-22
    • 2012-12-30
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多