如何加快PySpark的单元测试速度?

后端开发 2026-07-11

我有一段代码,在Databricks集群上用Spark运行,并为所有逻辑(包括PySpark代码)编写了单元测试。我查阅了以下资料:此处此处,以及 用于PySpark测试的官方文档。我基于这些文章做了一个尽可能精简的Spark会话的fixture:

@pytest.fixture(scope="session")
def spark():
    """Minimal session-scoped SparkSession."""
    spark = (
        SparkSession.builder.master("local[*]")
        .appName("pytest-pyspark")
        .config("spark.sql.shuffle.partitions", "1")
        .config("spark.default.parallelism", "1")
        .config("spark.driver.extraJavaOptions", "-Djava.net.preferIPv4Stack=true")
        .config("spark.ui.enabled", "false")
        .config("spark.ui.showConsoleProgress", "false")
        .config("spark.sql.ui.retainedExecutions", "0")
        .config("spark.sql.catalogImplementation", "in-memory")
        .config("spark.driver.host", "127.0.0.1")
        .config("spark.driver.bindAddress", "127.0.0.1")
        .config("spark.sql.adaptive.enabled", "false")
        .config("spark.sql.execution.arrow.pyspark.enabled", "true")
        .getOrCreate()
    )

    yield spark
    spark.stop()

但每个使用该Spark会话的测试都要耗时3-5分钟!测试数据是两行、五列的DataFrame,所以这不是问题所在。如何用更小的数据集让单元测试跑得更快?本地和CI/CD流水线都很慢。

解决方案

这个 答案 是对的,Spark会话的配置不是问题所在。就我而言,会话实际上根本就不是本地的。

真正的问题是我们安装了 databricks-connect。这个库会覆盖PySpark,并让 SparkSession.builder.getOrCreate() 连接到远程的Databricks集群。你可以在这里看到相关问题的报道 这里这里

因此,尽管代码看起来像是本地会话,但每个测试实际上都在连接到集群!

修复: 将测试放在一个不包含 databricks-connect 的独立虚拟环境中运行(我为此使用了 pyenv)。移除它之后,同样的测试从分钟级下降到秒级。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章