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核心库进行编译.我在这里做错了吗?
请参阅SparkConf
\n\nSpark 执行器 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\nspark.executor.memory然后通过在命令行或 SparkConf 对象中设置变量来增加应用程序请求的 RAM 量。
在您的情况下,似乎未应用内存分数设置。根据评论中的建议,您可以打印像这样应用的所有设置以进行交叉检查。
\n\nlogger.info(sparkContext.getConf.getAll.mkString("\\n") \nRun Code Online (Sandbox Code Playgroud)\n\n如果没有应用,你可以从语法上设置一下,然后尝试看看效果。
\n\nval conf = new SparkConf()\n .set("spark.memory.fraction", "1")\n .set("spark.testing.memory", maxOnHeapExecutionMemory.toString)\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6
\n\n如测试中所述
\n\n请阅读这篇好文章以了解更多详细信息
\n\n上面帖子的要点是:
\n\n\n\n\n\n您可以在图中看到 3 个主要内存区域:
\n\n1)Reserved Memory :系统保留的内存,其大小是\n硬编码的
\n\n2) 用户内存(在 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\n
\n 用户内存及其完全取决于您将在此 RAM 中存储什么以及如何存储,Spark 完全不考虑您在那里执行的操作以及您是否尊重此边界。在代码中不遵守此边界可能会导致 OOM 错误。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
| 归档时间: |
|
| 查看次数: |
3212 次 |
| 最近记录: |