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

wls*_*ica 44 memory-management apache-spark

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

我的环境设置如下:

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

输入数据信息:

  • 来自HDFS的3.5 GB数据文件

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

Spark文档中,执行程序内存的定义是

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

司机记忆怎么样?

maa*_*asg 97

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

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

如果作业需要驱动程序参与计算,例如某些ML算法需要实现结果并在下一次迭代中广播它们,那么您的工作将取决于通过驱动程序的数据量.操作,如.collect,.taketakeSample传送数据至驱动器并因此,驾驶员需要足够的内存来分配这样的数据.

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

  • @OmkarPuttagunta否.当您将分区减少到1时,该单个分区将位于其中一个执行程序中.由于您不知道哪一个,您的每个执行者都需要>> 20Gb.我建议你找一个替代解决方案. (4认同)
  • 如果我想做`datraframe。Coalesce(1).wirte()。csv(outpuDir)`20 GB数据,我是否需要确保驱动程序分配的内存大于20GB? (2认同)

yjs*_*hen 5

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

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

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