Intellij Idea 为什么我的Scala+Spark应用单元测试在IntelliJ中比常规的mvn干净测试运行要快得多?

idfiyjo8  于 2023-03-07  发布在  Scala
关注(0)|答案(1)|浏览(119)

我有一整套执行大量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>
                    ...

我认为这在某种程度上有所改善,但衡量时间,它也没有帮助。
谢谢!

oxosxuxt

oxosxuxt1#

可能有几个原因:

  • 并行测试执行:IntelliJ默认可以并行运行单元测试,而'mvn clean test默认按顺序运行测试。
  • 不同的测试运行程序:IntelliJ使用自己的测试运行器,而Maven使用Surefire测试运行器。
  • 缓存:IntelliJ可以缓存编译后的类和依赖项,这可以加快测试的执行速度,而Maven不缓存编译后的类
  • IntelliJ测试环境和Maven测试环境之间可能存在配置差异

相关问题