我对在Spark中处理执行程序内存和驱动程序内存感到困惑。
我的环境设置如下:
输入数据信息:
对于简单的开发,我使用spark-submit
以独立群集模式(8个工作线程,20个内核,45.3 G内存)执行我的Python代码。现在我想设置执行程序内存或驱动程序内存以进行性能调整。
从Spark documentation开始,执行程序内存的定义是
每个执行程序进程使用的内存量,格式与JVM内存字符串相同(例如512m,2g)。
司机记忆怎么样?
答案 0 :(得分:92)
您需要分配给驱动程序的内存取决于作业。
如果作业完全基于转换并终止于某些分布式输出操作,如rdd.saveAsTextFile,rdd.saveToCassandra,......那么驱动程序的内存需求将非常低。几百MB的MB会做。驱动程序还负责提供文件和收集指标,但不参与数据处理。
如果作业需要驱动程序参与计算,例如一些ML算法需要实现结果并在下一次迭代中广播它们,然后你的工作取决于通过驱动程序的数据量。像.collect
,.take
和takeSample
这样的操作会将数据传递给驱动程序,因此驱动程序需要足够的内存来分配此类数据。
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 在执行作业时可能使用的最大内存(开销)值。