我正在开发一个 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 及更高版本。
我通过下载 JAR 并将文件放置在 S3 上解决了这个问题。然后,我使用
spark-submit
参数将 S3 URI 添加到该步骤的 --jars
命令中。