"spark.memory.fraction"似乎没有任何效果

pyt*_*nic 6 java scala apache-spark

在Spark中,java.lang.OutOfMemoryError: Java heap space从函数中读取HDFS中大约1 GB的字符串时出现错误.我使用的执行程序内存是6 GB.为了增加用户内存,我甚spark.memory.fraction至减少到0.3,但我仍然得到相同的错误.似乎降低该值没有任何影响.我正在使用Spark 1.6.1并使用Spark 1.6核心库进行编译.我在这里做错了吗?

Ram*_*ram 4

请参阅SparkConf

\n\n

Spark 执行器 OOM:如何在 Spark 上设置内存参数\n应用程序运行后,您将看到的下一个最可能的错误是 Spark 执行器上的 OOM。Spark 是进行内存计算的极其强大的工具,但它的强大功能也有一些尖锐的优势。执行程序 OOM\xe2\x80\x99ing 的最常见原因是应用程序试图将太多信息缓存或加载到内存中。根据您的用例,有多种解决方案:

\n\n

增加存储分数变量spark.storage.memoryFraction。这可以在命令行或对象中按上面的方式设置SparkConf。该变量准确设置 JVM 将专用于 RDD\xe2\x80\x99s 的缓存和存储的量。您可以将其设置为 0 到 1 之间的值,描述执行器 JVM 内存的哪一部分将专用于缓存 RDD。如果您的作业需要很少的 shuffle 内存,但会利用大量缓存的 RDD\xe2\x80\x99s,请增加此变量(例如:缓存 RDD,然后对其执行聚合。)

\n\n

如果所有其他方法都失败,您可能只需要为每个工作人员提供额外的内存。

\n\n

spark.executor.memory然后通过在命令行或 SparkConf 对象中设置变量来增加应用程序请求的 RAM 量。

\n\n

在您的情况下,似乎未应用内存分数设置。根据评论中的建议,您可以打印像这样应用的所有设置以进行交叉检查。

\n\n
logger.info(sparkContext.getConf.getAll.mkString("\\n") \n
Run Code Online (Sandbox Code Playgroud)\n\n

如果没有应用,你可以从语法上设置一下,然后尝试看看效果。

\n\n
val conf = new SparkConf()\n  .set("spark.memory.fraction", "1")\n  .set("spark.testing.memory", maxOnHeapExecutionMemory.toString)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6

\n\n

如测试中所述

\n\n

更新 :

\n\n

请阅读这篇好文章以了解更多详细信息

\n\n

上面帖子的要点是:

\n\n
\n

您可以在图中看到 3 个主要内存区域:

\n\n

1)Reserved Memory :系统保留的内存,其大小是\n硬编码的

\n\n

2) 用户内存(在 Spark 1.6 \xe2\x80\x9cJava 堆\xe2\x80\x9d \xe2\x80\x93 \xe2\x80\x9c保留内存\xe2\x80\x9d) * (1.0\n \xe2\x80 \x93 火花.内存.分数)

\n\n

这是分配 Spark\n Memory 后剩余的内存池,完全取决于您以自己喜欢的方式使用它。
\n 用户内存及其完全取决于您将在此 RAM 中存储什么以及如何存储,Spark 完全不考虑您在那里执行的操作以及您是否尊重此边界。在代码中不遵守此边界可能会导致 OOM 错误。

\n\n

3)Spark内存(\xe2\x80\x9cJava堆\xe2\x80\x9d\xe2\x80\x93\xe2\x80\x9c保留内存\xe2\x80\x9d)*\nspark.memory.fraction,--> Spark 管理的内存池。进一步\n分为

\n\n

|--> 存储内存

\n\n

|--> 执行内存

\n
\n\n

火花内存

\n

  • 为什么应用值 1?如果我在任务执行的函数中创建一些字符串,那么它是在用户内存中还是在 Spark 内存中?如果在用户内存中,我应该减少spark.memory.fraction的值,不是吗? (2认同)