Java AWS EMR上的Spark:更新至EMR-5.20(使用Spark 2.4):工作比以前花费更多

Java AWS EMR上的Spark:更新至EMR-5.20(使用Spark 2.4):工作比以前花费更多,java,apache-spark,amazon-emr,Java,Apache Spark,Amazon Emr,最近,我们将EMR发布标签从EMR-5.16.0升级到EMR-5.20.0,使用Spark 2.4而不是2.3.1 起初,情况很糟糕。乔布斯开始接受比以前多得多的工作。 最后,我们将MaximumResourcesLocation设置为true(在emr-5.16中,默认情况下可能为true),情况开始好转。 但有些阶段的花费仍然比以前多得多(而其他阶段的花费则更少)。 即: Spark 2.4: Spark 2.3.1: 来自应用程序历史记录的图像 对于Spark 2.4,keyBy操作所

最近,我们将EMR发布标签从EMR-5.16.0升级到EMR-5.20.0,使用Spark 2.4而不是2.3.1

起初,情况很糟糕。乔布斯开始接受比以前多得多的工作。 最后,我们将MaximumResourcesLocation设置为true(在emr-5.16中,默认情况下可能为true),情况开始好转。 但有些阶段的花费仍然比以前多得多(而其他阶段的花费则更少)。 即: Spark 2.4:

Spark 2.3.1:

来自应用程序历史记录的图像

对于Spark 2.4,keyBy操作所用的时间是Spark 2.3.1的10倍多

它与分区的数量有关。 在spark 2.3.1中,mapToPair操作后RDD的分区数为5580,而在spark 2.4中,RDD的默认并行度为群集的128,因为它在64核群集中运行

我试图强制将分区重新分配到10000,而keyBy阶段仅用了1.2分钟就结束了。但我认为这不是一个好的、也不是决定性的解决办法

这是一个已知的问题吗?
我应该尝试将默认并行度设置为更大的数量吗?

您知道他们使用的是什么版本的Scala吗?我在Spark 2.4和Scala 2.12上遇到了一些问题,但我的问题更“严重”,应用程序会崩溃,回到2.11就可以了。我使用的是Java应用程序,而不是Scala,Emr 5.20:2.11.12;Emr 5.16:2.11.8;我也使用Java应用程序。它似乎与属性spark.default.parallelism有关,即。。。128 . 我正在研究为什么在5.20中,该步骤使用默认并行性而不是输入RDD的分区数。我强制keyBy的并行性为10000,并在1.2分钟内完成。这太荒谬了。问题是我不想硬编码并行。你用同样的方法调整内存了吗?当看截图时,我发现2.4比2.3.1消耗更少的内存。。。你的员工的内存有限吗?你知道他们使用什么版本的Scala吗?我在Spark 2.4和Scala 2.12上遇到了一些问题,但我的问题更“严重”,应用程序会崩溃,回到2.11就可以了。我使用的是Java应用程序,而不是Scala,Emr 5.20:2.11.12;Emr 5.16:2.11.8;我也使用Java应用程序。它似乎与属性spark.default.parallelism有关,即。。。128 . 我正在研究为什么在5.20中,该步骤使用默认并行性而不是输入RDD的分区数。我强制keyBy的并行性为10000,并在1.2分钟内完成。这太荒谬了。问题是我不想硬编码并行。你用同样的方法调整内存了吗?当看截图时,我发现2.4比2.3.1消耗更少的内存。。。你的员工记忆力有限吗?