我对在Spark中处理执行程序内存和驱动程序内存感到困惑 .
我的环境设置如下:
-
内存128 G,16个CPU用于9个VM
-
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) .
司机记忆怎么样?
2 回答
在Spark应用程序中,Driver负责任务调度,Executor负责执行作业中的具体任务 .
如果您熟悉MapReduce,那么您的map任务和reduce任务都在Executor中执行(在Spark中,它们被称为ShuffleMapTasks和ResultTasks),而且,您要缓存的任何RDD也都在执行程序的JVM的堆和磁盘中 .
所以我认为你的驱动程序可以使用几GB .
您需要分配给驱动程序的内存取决于作业 .
If the job is based purely on transformations 并终止某些分布式输出操作,如rdd.saveAsTextFile,rdd.saveToCassandra,...然后驱动程序的内存需求将非常低 . 几百MB的MB会做 . 驱动程序还负责提供文件和收集指标,但不参与数据处理 .
If the job requires the driver to participate in the computation ,例如一些ML算法需要实现结果并在下一次迭代中广播它们,然后你的工作取决于通过驱动程序的数据量 . 像
.collect
,.take
和takeSample
这样的操作将数据传递给驱动程序,因此驱动程序需要足够的内存来分配这些数据 .例如如果群集中有一个3GB的
rdd
并且调用val myresultArray = rdd.collect
,则驱动程序中需要3GB的内存来保存该数据以及第一段中提到的功能的额外空间 .