使用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节点的本地临时目录:
- 打开你的Glue任务配置页面,找到Job parameters部分
- 添加一个新的参数:
- Key:
--extra-files - Value:
s3://test/presto_client.keystore
- Key:
- 修改你的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
相关产品推荐
相关产品推荐

