Memory 为什么Spark在发生洗牌时会使用并占用太多内存?
我发现在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有混洗 在这种情况下,我想知道以下三点: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中,操作系统将决定数据是否可以保留在其缓冲区缓存中,还是应该溢出到磁盘。每个贴图任务创建的洗牌溢出文件数量与还原器数量相同。SPARK不会将溢出文件合并并分区为一个大文件,Apache Hadoop就是这样。 示例:如果有6000(R)个还原器和2000(M)个映射任务,则将有(M*R)6000*2000=1200万个随机文件。这是因为,在spark中,每个贴图任务创建的洗牌溢出文件数量与还原器数量相同。这导致性能下降 请参考这篇文章,在上面的解释的继续部分详细解释了这一点 你也可以参考报纸 ~Kedar(作家)@KedarDixit感谢您提供的宝贵信息。spark.shuffle.consolidatefiles是我需要的spark属性之一,不再从spark 1.6中应用。。嗯,有其他的房产吗?当我在谷歌上搜索它的时候,却找不到它。