如何在Spark中处理执行程序内存和驱动程序内存?

时间:2014-11-28 04:07:00

标签: memory-management apache-spark

我对在Spark中处理执行程序内存和驱动程序内存感到困惑。

我的环境设置如下:

  • 内存128 G,适用于9 VM的16 CPU
  • Centos的
  • Hadoop 2.5.0-cdh5.2.0
  • Spark 1.1.0

输入数据信息:

  • 来自HDFS的3.5 GB数据文件

对于简单的开发,我使用spark-submit以独立群集模式(8个工作线程,20个内核,45.3 G内存)执行我的Python代码。现在我想设置执行程序内存或驱动程序内存以进行性能调整。

Spark documentation开始,执行程序内存的定义是

  

每个执行程序进程使用的内存量,格式与JVM内存字符串相同(例如512m,2g)。

司机记忆怎么样?

3 个答案:

答案 0 :(得分:92)

您需要分配给驱动程序的内存取决于作业。

如果作业完全基于转换并终止于某些分布式输出操作,如rdd.saveAsTextFile,rdd.saveToCassandra,......那么驱动程序的内存需求将非常低。几百MB的MB会做。驱动程序还负责提供文件和收集指标,但不参与数据处理。

如果作业需要驱动程序参与计算,例如一些ML算法需要实现结果并在下一次迭代中广播它们,然后你的工作取决于通过驱动程序的数据量。像.collect.taketakeSample这样的操作会将数据传递给驱动程序,因此驱动程序需要足够的内存来分配此类数据。

e.g。如果群集中有rdd 3GB且呼叫val myresultArray = rdd.collect,则驱动程序中需要3GB内存来保存该数据,并为第一段中提到的功能增加一些空间。 / p>

答案 1 :(得分:5)

在Spark应用程序中,Driver负责任务调度,Executor负责执行您工作中的具体任务。

如果您熟悉MapReduce,那么您的地图任务& reduce任务都在Executor中执行(在Spark中,它们被称为ShuffleMapTasks& ResultTasks),而且,无论你想要缓存什么RDD,它都在执行程序的JVM堆中。磁盘。

所以我认为你的驱动程序可以使用几GB。

答案 2 :(得分:0)

Spark shell 所需内存 = (驱动程序内存 + 384 MB) + (执行程序数量 * (执行程序内存 + 384 MB))

此处 384 MB 是 Spark 在执行作业时可能使用的最大内存(开销)值。