Spark 2.1.0和Scala 2.11。
我们的项目有数百个单元测试,可以执行相对简单的操作,例如创建3个或4个对象的数据集并对它们执行简单的转换。其中许多测试需要5到10秒的时间才能运行,其中数百次测试会增加很多分钟,这对我们的CI构建来说正成为一个问题。操作非常简单,我想知道我们是否可以使用Spark配置来加快速度。
例如,只需创建如下数据集:
val histData = Seq(
FooType(id = "id1", code = "code1",orgId = 1l),
FooType(id = "id2", code = "code2",orgId = 1l),
FooType(id = "id3", code = "code3",orgId = 1l)
).toDS()
需要800毫秒(FooType是一个案例类)。在创建了这样的2或3个数据集以及一些过滤/地图/加入操作之后(我真的不认为这些细节很重要,但如果你让我知道并且我会发布它们),collect()
需要1000-2000毫秒。添加这样的一些操作,测试可能需要5-10秒。
对于单元测试,我们只关注测试的功能方面,我们不需要线程,缩放,缓存,磁盘存储等。测试数据很小(通常小于1KB)并且已创建在内存中(不是从磁盘或任何外部源读取),并在内存中的转换对象上执行断言。据我所知,在幕后,Spark可能正在调用DAGScheduler,代码生成器等,我想知道是否有办法在没有该功能的情况下执行作业。或者,如果必须这样做,在单元测试套件的开始处执行一次并在整个过程中使用它。
使用以下内容创建会话:
session = SparkSession.builder.config("spark.sql.shuffle.partitions","10").getOrCreate()
并且在每个单元测试中使用相同的会话。我们直接从单元测试中调用Spark API方法,因此没有Spark提交或单独的进程或作业,它们都在由调用单元测试的IDE或gradle创建的JVM中运行。
在我看来,这些操作每个应该花费几毫秒,我正在寻找一种方法来削减Spark配置,以便以最快的方式评估内存中的所有内容。感谢您的任何提示或想法。