AWS Glue/Spark写入SQL Server遇JAR签名信息冲突问题求助
问题修复:AWS Glue/Spark写入SQL Server时签名信息不匹配错误
错误原因分析
出现的java.lang.SecurityException是因为同一个包下的类签名信息不匹配,通常由以下原因导致:
- 手动指定的
mssql-jdbc驱动版本与spark-mssql-connector依赖的JDBC版本冲突 - AWS Glue环境自带了某个版本的SQL Server JDBC驱动,与你引入的版本重复加载
- 重复创建SparkSession导致配置混乱,依赖包加载冲突
具体修复步骤
1. 移除重复创建SparkSession的代码
Glue作业启动时已经初始化好了SparkSession,无需通过spark.builder.getOrCreate()重新创建,这会导致配置冲突。修改代码如下:
def write_df_to_target(self, df, schema_table): # 直接使用Glue提供的spark_session,不要重新创建 spark = self.gc.spark_session credentials = self.get_credentials(self.replica_connection_name) df.write \ .format("com.microsoft.sqlserver.jdbc.spark") \ .option("url", f"{credentials['url']};databaseName={self.database_name}") \ .option("dbtable", schema_table) \ .option("user", credentials["user"]) \ .option("password", credentials["password"]) \ .option("batchsize","50000") \ .option("numPartitions","150") \ .option("bulkCopyTableLock","true") \ .save()
2. 统一依赖版本,避免冲突
spark-mssql-connector已经内置了对mssql-jdbc的依赖,无需手动指定JDBC驱动版本,否则容易出现版本不兼容。在Glue作业配置中统一指定依赖:
- 打开Glue作业的Job parameters,添加以下参数:
--conf spark.jars.packages=com.microsoft.azure:spark-mssql-connector_2.12:1.1.0
3. 优先加载用户指定的依赖(解决环境自带驱动冲突)
如果Glue环境自带了旧版本的SQL Server驱动,需要让用户指定的依赖优先加载,在Job parameters中添加:
--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true
4. 清理重复的JAR包
检查Glue作业的Dependent JARs配置,如果之前上传过单独的mssql-jdbc JAR包,立即删除,避免重复加载导致签名冲突。
验证方案
完成上述修改后,重新运行Glue作业,批量写入SQL Server的操作应该可以正常执行。如果仍有问题,可以尝试升级spark-mssql-connector到最新兼容版本(比如1.2.0),确保与Glue的Spark版本匹配。
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

