如何在 AWS EMR 上配置/安装 JDBC SQLServerDriver for Spark 3.5?

问题描述 投票:0回答:1

我正在开发一个 PySpark ETL 管道应用程序,以便最终部署在 AWS EMR 上。数据从 Microsoft SQL Server 数据库中提取或提取。当我在本地运行代码时,我使用本地主机,一切都很好。但是当我将其部署在 EMR 集群上时,我在该步骤运行时收到此错误:

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

我以为我已经通过在 SparkSession 创建步骤中指定驱动程序的 JAR 解决了这个问题,如下所示:

def get_spark_session(
    run_local: bool = False,
    app_name: str = "ETL Pipeline",
    worker_threads: int = 8,
    jars_packages: str = "com.microsoft.sqlserver:mssql-jdbc:12.6.1.jre11",
) -> SparkSession:
    """
    Helper function to get a SparkSession object.

    :param run_local: Whether to run the SparkSession locally (typically only for debugging). Defaults to False.
    :param app_name: Name of the Spark application. Defaults to "WCV".
    :param worker_threads: Number of worker threads. Defaults to 8.
    :param jars_packages: Comma-separated list of Maven coordinates for the jars to include on the driver and executor
    :return: the SparkSession object
    """

    # build the SparkSession
    builder = SparkSession.builder.appName(app_name)
    if run_local:
        # set up a local SparkSession builder with the specified number of worker threads
        builder = builder.master(f"local[{worker_threads}]")
        logger.info("Running Spark locally")

    else:
        logger.info("Running Spark on a cluster")

    # configure the SparkSession
    builder = (
        builder.config("spark.jars.packages", jars_packages)
    )

    return builder.getOrCreate()

我使用的是 EMR 版本 7.0.0,其中包括 Spark 3.5.0。从我所看到的驱动程序的最新版本是 12.6.1,这似乎在我的本地计算机上运行良好。但我找不到任何确认信息来证明这是在 EMR 7 上使用的正确版本 - 在哪里可以找到版本兼容性图表?

根据此文档,12.6 版本支持 Java 17,这是 EMR 7.0.0 中提供的默认版本。也就是说:

版本 12.6 是最新的通用 (GA) 版本。它支持 Java 8、11、17 和 21。

还有这个:

包含 jre8 的 JAR 文件支持 Java 8,包含 jre11 的 JAR 文件支持 Java 11 及更高版本。

sql-server apache-spark jdbc amazon-emr mssql-jdbc
1个回答
0
投票

我通过下载 JAR 并将文件放置在 S3 上解决了这个问题。然后,我使用

spark-submit
参数将 S3 URI 添加到该步骤的
--jars
命令中。

© www.soinside.com 2019 - 2024. All rights reserved.