【问题标题】:Spark Driver Memory and Executor MemorySpark 驱动程序内存和执行程序内存
【发布时间】:2026-02-10 20:05:02
【问题描述】:

我是 Spark 的初学者,我正在运行我的应用程序以从文本文件中读取 14KB 数据,进行一些转换和操作(收集、收集AsMap)并将数据保存到数据库

我在我的 16G 内存、8 个逻辑核心的 macbook 上本地运行它。

Java 最大堆设置为 12G。

这是我用来运行应用程序的命令。

bin/spark-submit --class com.myapp.application --master local[*] --executor-memory 2G --driver-memory 4G /jars/application.jar

我收到以下警告

2017-01-13 16:57:31.579 [执行器任务启动 worker-8hread] 警告 org.apache.spark.storage.MemoryStore - 没有足够的空间来缓存 rdd_57_0 在内存中! (目前计算为 26.4 MB)

谁能指导我这里出了什么问题以及如何提高性能?另外如何优化 suffle-spill ?这是我本地系统中发生的泄漏的视图

【问题讨论】:

  • 在本地模式下,spark.executor.memory 无效。所以只需通过spark.driver.memory 尝试超过 6g,因为你有 16g 内存。
  • 您要读取的文件大小是多少?
  • @RajatMishra 我尝试使用 6g 驱动程序内存和 8g java 最大堆。我仍然收到同样的信息。

标签: java apache-spark spark-streaming spark-submit


【解决方案1】:

运行内存过多的执行程序通常会导致过多的垃圾收集延迟。所以分配更多的内存不是一个好主意。由于您只有 14KB 数据,因此 2GB 执行程序内存和 4GB 驱动程序内存绰绰有余。分配这么多内存是没有用的。您甚至可以使用 100MB 内存来运行此作业,并且性能会比 2GB 更好。

在运行应用程序时,驱动程序内存更有用,在纱线集群模式下,因为应用程序主运行驱动程序。在这里,您无需在本地模式下运行应用程序 driver-memory。您可以从作业中删除此配置。

在你的应用程序中你已经分配了

Java Max heap is set at: 12G.
executor-memory: 2G 
driver-memory: 4G

总内存分配= 16GB,而您的 macbook 仅有 16GB 内存。 在这里,您已将全部 RAM 内存分配给 spark 应用程序。

这不好。操作系统本身消耗大约 1GB 内存,您可能正在运行其他也消耗 RAM 内存的应用程序。所以在这里你实际上分配了比你拥有的更多的内存。这是您的应用程序抛出错误Not enough space to cache the RDD

的根本原因
  1. 将 Java 堆分配给 12 GB 是没有用的。您需要将其减少到 4GB 或更少。
  2. 将执行程序内存减少到executor-memory 1G 或更少
  3. 由于您在本地运行,请从您的配置中删除 driver-memory

提交您的工作。它会顺利运行。

如果您非常想了解 Spark 内存管理技术,请参阅这篇有用的文章。

Spark on yarn executor resource allocation

【讨论】:

  • 由于应用程序是在本地模式下运行的,你不认为执行器内存没有任何影响,因为工作人员住在驱动程序 jvm 进程中吗?
  • @RajatMishra 是的!!,你是对的,似乎在本地模式下没有使用executor-memory。我会做更多的测试并相应地更新我的答案:)
  • 有人有关于 Spark 2.0+ 内存管理的资源吗,我没有找到与你提供的优秀资源类似的任何东西。谢谢
【解决方案2】:

在本地模式下,你不需要指定master,使用默认参数就可以了。 官网称,“Spark bin 目录下的 spark-submit 脚本用于在集群上启动应用程序。它可以通过统一的界面使用 Spark 支持的所有集群管理器,因此您不必为每个应用程序专门配置one.".所以你最好在集群中使用spark-submit,在本地你可以使用spark-shell。

【讨论】:

  • 通过spark-shell,你可以调试你的应用,找出哪一步出错。