首页 文章

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

提问于
浏览
40

我对在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 回答

  • 5

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

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

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

  • 84

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

    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.taketakeSample 这样的操作将数据传递给驱动程序,因此驱动程序需要足够的内存来分配这些数据 .

    例如如果群集中有一个3GB的 rdd 并且调用 val myresultArray = rdd.collect ,则驱动程序中需要3GB的内存来保存该数据以及第一段中提到的功能的额外空间 .

相关问题