我有一整套执行大量Spark操作的UT。我注意到当我在InteliJ IDEA中运行测试集时,它在大约10分钟内完成。当我继续使用maven构建时,该过程几乎需要一个小时。如果我只运行maven测试目标,它需要超过50分钟,所以大部分时间都在UT执行中。
我比较了IntelliJ和Maven的执行日志,它们都是相同的(显然并行操作的顺序不同),所以执行在功能上是等效的。我不知道当UT在Maven中运行时,该怎么做才能找到导致性能大幅下降的原因。
在其中一项测试中,使用日志中报告的时间(分组并丢弃相同的行/时间)的时间差异示例。
美芬:102秒
12:34:50 [ScalaTest...
12:35:01 [ScalaTest...
12:35:19 [Executor...
12:35:20 [ScalaTest...
12:35:25 [ScalaTest...
12:36:06 [Executor...
12:36:08 [ScalaTest...
12:36:16 [ScalaTest...
12:36:24 [ScalaTest...
12:36:32 [ScalaTest...
智能J:26秒
12:49:53 [ScalaTest...
12:49:58 [ScalaTest...
12:50:04 [Executor...
12:50:04 [ScalaTest...
12:50:07 [ScalaTest...
12:50:13 [Executor...
12:50:14 [ScalaTest...
12:50:16 [ScalaTest...
12:50:18 [ScalaTest...
12:50:19 [ScalaTest...
我在执行Spark操作的其他每一个测试中都看到了相同的模式。有时环境之间的时间差几乎是10倍,并且在所有测试之间取平均值,大约是5倍。看起来在节点中切换到并行执行时会发生很多等待。您知道如何识别可能导致此问题的配置设置吗?我可以应用什么Spark设置来使两个环境以相似的处理时间运行?
我已经尝试过减少分区并将spark.sql.shuffle.partitions
设置为较低的值(1、2、3 ......),但我没有看到任何区别。
- 编辑**:我开始尝试使用surefire、scalatest和maven内存设置。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xmx8G -XX:MaxPermSize=4048M</argLine>
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
...
我认为这在某种程度上有所改善,但衡量时间,它也没有帮助。
谢谢!
1条答案
按热度按时间oxosxuxt1#
可能有几个原因: