You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS Glue+Spark Scala连接Presto数据库SSL证书问题求助

解决AWS Glue中Presto JDBC SSL连接找不到S3密钥库文件的问题

看起来你遇到的核心问题是Presto JDBC驱动无法直接识别S3路径作为密钥库文件路径——这个驱动是Java原生的JDBC实现,它只会在本地文件系统中查找指定路径的文件,而AWS Glue集群不会自动把S3路径映射为本地文件路径,这就是为什么你本地(用本地文件路径)能正常运行,但在Glue里用S3路径就报错的原因。

下面提供两种可行的解决方案,按推荐程度排序:


方案1:用Glue任务参数自动分发密钥库到Worker本地

这是最简单的方法,不需要修改代码,只需要在配置Glue任务时添加参数,让Glue自动把S3上的密钥库文件复制到每个Worker节点的本地临时目录:

  1. 打开你的Glue任务配置页面,找到Job parameters部分
  2. 添加一个新的参数:
    • Key: --extra-files
    • Value: s3://test/presto_client.keystore
  3. 修改你的Scala代码中的SSLKeyStorePath选项,改为本地文件名称(Glue会把文件放在Worker的当前工作目录,或者你可以用绝对路径/tmp/presto_client.keystore):
    val datanot_in_hz = sqlcontext.read.format("jdbc")
      .option("url", jdbcConUrl)
      .option("driver", "io.prestosql.jdbc.PrestoDriver")
      .option("SSL","true")
      .option("SSLKeyStorePath", "./presto_client.keystore") // 或"/tmp/presto_client.keystore"
      .option("SSLKeyStorePassword", "你的密钥库密码") // 密钥库有密码时必须添加
      .option("query", datanot_in_hz_sql)
      .option("user", dbUserName)
      .option("password", dbPassword)
      .load()
    

方案2:在Scala代码中手动下载S3密钥库到本地临时目录

如果因为某些原因无法使用Glue的--extra-files参数,你可以在代码中添加逻辑,先把S3上的密钥库文件下载到Glue Worker的本地临时目录(比如/tmp/),再把路径指向本地文件:

import com.amazonaws.services.s3.AmazonS3ClientBuilder
import java.io.File

// Glue环境中会自动通过IAM角色获取权限,无需额外配置密钥
val s3Client = AmazonS3ClientBuilder.defaultClient()
val bucketName = "test"
val key = "presto_client.keystore"
val localPath = new File("/tmp/presto_client.keystore")

// 下载S3文件到本地临时目录
s3Client.getObject(bucketName, key, localPath)

// 创建JDBC连接
val datanot_in_hz = sqlcontext.read.format("jdbc")
  .option("url", jdbcConUrl)
  .option("driver", "io.prestosql.jdbc.PrestoDriver")
  .option("SSL","true")
  .option("SSLKeyStorePath", localPath.getAbsolutePath)
  .option("SSLKeyStorePassword", "你的密钥库密码")
  .option("query", datanot_in_hz_sql)
  .option("user", dbUserName)
  .option("password", dbPassword)
  .load()

额外注意事项

  • 确保你的Glue任务执行角色拥有访问S3://test/presto_client.keystore的s3:GetObject权限(你提到同一路径的jar能访问,这个应该没问题,但可以再确认)
  • 如果你的证书是PEM格式,需要先转换成Java支持的密钥库格式(JKS或PKCS12),因为Presto JDBC驱动只识别标准Java密钥库。转换命令示例(用keytool):
    keytool -importcert -file your-cert.pem -keystore presto_client.keystore -alias presto-cert
    
  • 本地运行正常是因为你当时的SSLKeyStorePath指向的是本地文件系统路径,而非S3路径,这和Glue环境的差异导致了问题。

内容的提问来源于stack exchange,提问作者roshaga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:22:13