Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 为什么Spark在发生洗牌时会使用并占用太多内存?_Memory_Apache Spark_Shuffle - Fatal编程技术网

Memory 为什么Spark在发生洗牌时会使用并占用太多内存?

Memory 为什么Spark在发生洗牌时会使用并占用太多内存?,memory,apache-spark,shuffle,Memory,Apache Spark,Shuffle,我发现在Spark进程中发生洗牌时内存使用过多 下图是我使用700MB数据和三个rdd.map时的内存度量。 (我使用Ganglia作为监视工具,只显示集群中的三个节点。x轴表示时间序列,y轴表示内存使用情况) 下图也是当我使用相同的数据并使用三个rdd.groupBy,三个rdd.flatMap(顺序:groupBy1->flatMap 1->groupBy2->flatMap 2->groupBy3->flatMap 3)时的内存度量 如您所见,尽管我只使用了700MB的数据,但所有三个

我发现在Spark进程中发生洗牌时内存使用过多

下图是我使用700MB数据和三个rdd.map时的内存度量。 (我使用Ganglia作为监视工具,只显示集群中的三个节点。x轴表示时间序列,y轴表示内存使用情况)

下图也是当我使用相同的数据并使用三个rdd.groupBy,三个rdd.flatMap(顺序:groupBy1->flatMap 1->groupBy2->flatMap 2->groupBy3->flatMap 3)时的内存度量

如您所见,尽管我只使用了700MB的数据,但所有三个节点的内存都显著增加(几GB)。实际上,我有8个worker节点,所有8个worker的内存都大大增加了

我认为主要原因是混洗,因为rdd.map没有混洗,但是rdd.groupBy有混洗

在这种情况下,我想知道以下三点:

  • 为什么内存使用过多?(当我在所有工作节点中使用700MB时,使用的容量超过15GB。)
  • 为什么在Spark应用程序完成之前,旧洗牌的已用内存似乎并没有被删除
  • 有没有办法减少内存使用或删除旧的shuffle中生成的内存
  • 附:我的环境:

  • 云平台:MS Azure(8个工作节点)
  • 一个工人的规格:8核CPU,16GB RAM
  • 语言:Java
  • Spark版本:1.6.2
  • Java版本:1.7(开发),1.8(执行)
  • 独立运行Spark(不使用纱线或Mesos)

  • 在Spark中,操作系统将决定数据是否可以保留在其缓冲区缓存中,还是应该溢出到磁盘。每个贴图任务创建的洗牌溢出文件数量与还原器数量相同。SPARK不会将溢出文件合并并分区为一个大文件,Apache Hadoop就是这样。 示例:如果有6000(R)个还原器和2000(M)个映射任务,则将有(M*R)6000*2000=1200万个随机文件。这是因为,在spark中,每个贴图任务创建的洗牌溢出文件数量与还原器数量相同。这导致性能下降

    请参考这篇文章,在上面的解释的继续部分详细解释了这一点

    你也可以参考报纸

    ~Kedar

    (作家)@KedarDixit感谢您提供的宝贵信息。spark.shuffle.consolidatefiles是我需要的spark属性之一,不再从spark 1.6中应用。。嗯,有其他的房产吗?当我在谷歌上搜索它的时候,却找不到它。