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

Databricks共享计算集群访问Volumes信任库连接Oracle失败排查

Databricks共享计算集群JDBC连接Oracle(TCPS)信任库问题解决

问题原因分析

  1. Volumes权限限制:共享集群的Executor/JVM进程以服务用户(如spark)运行,即使你是Volumes文件的所有者,服务用户未必拥有该文件的读取权限,导致JDBC驱动无法加载信任库。
  2. 信任库有效性问题:PKIX路径错误通常意味着信任库中缺少Oracle服务器的根证书或中间证书,即使文件存在,证书链不完整也会导致验证失败。
  3. DBFS共享集群访问限制:共享集群默认限制对用户个人DBFS目录的访问,Executor进程无法读取该路径下的文件。

可行解决办法

方法一:用集群初始化脚本复制信任库到本地临时目录

将Volumes中的信任库复制到集群节点的本地临时目录(所有进程可读取),再在JDBC配置中指向该路径:

  1. 创建初始化脚本copy_truststore.sh,内容如下:
#!/bin/bash
# 复制Volumes中的信任库到本地临时目录
cp /Volumes/test_catalog/test_schema/test_volume/oracle_truststore.jks /tmp/oracle_truststore.jks
# 设置全局可读权限
chmod 644 /tmp/oracle_truststore.jks
  1. 将脚本上传到同一Volumes目录下。
  2. 在集群配置的初始化脚本中添加路径:dbfs:/Volumes/test_catalog/test_schema/test_volume/copy_truststore.sh(注意前缀用dbfs:)。
  3. 修改JDBC代码中的信任库路径:
url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=xxxx)(HOST=xxxx))(CONNECT_DATA=(SID=xxx)))"

df = (
    spark.read.format("jdbc")
    .option("url", url)
    .option("dbTable", "schema.table")
    .option("user", "user")
    .option("password", dbutils.secrets.get(scope = "oracle", key = "password"))
    .option("driver", "oracle.jdbc.driver.OracleDriver")
    .option("fetchsize", 2000)
    .option("javax.net.ssl.trustStoreType", "JKS")
    .option("javax.net.ssl.trustStore", "/tmp/oracle_truststore.jks")  # 修改为本地临时路径
    .option("javax.net.ssl.trustStorePassword", dbutils.secrets.get(scope = "oracle", key = "truststore_pw"))
    .load()
)

方法二:验证并修复信任库证书链

确认信任库中包含完整的Oracle证书链:

  1. 在个人集群中执行以下命令查看信任库内容:
%sh
keytool -list -keystore /Volumes/test_catalog/test_schema/test_volume/oracle_truststore.jks -storepass $(dbutils.secrets.get(scope="oracle", key="truststore_pw"))
  1. 如果缺少Oracle根证书或中间证书,重新导入:
%sh
# 假设证书文件已上传到Volumes
keytool -importcert -file /Volumes/test_catalog/test_schema/test_volume/oracle_root_cert.crt -keystore /Volumes/test_catalog/test_schema/test_volume/oracle_truststore.jks -alias oracle_root -storepass $(dbutils.secrets.get(scope="oracle", key="truststore_pw")) -noprompt

方法三:配置集群级JVM参数(全局生效)

将信任库配置添加到集群的Spark参数中,避免每个JDBC连接重复配置:

  1. 在集群配置的Spark配置中添加:
spark.driver.extraJavaOptions -Djavax.net.ssl.trustStore=/tmp/oracle_truststore.jks -Djavax.net.ssl.trustStorePassword={{secrets/oracle/truststore_pw}} -Djavax.net.ssl.trustStoreType=JKS
spark.executor.extraJavaOptions -Djavax.net.ssl.trustStore=/tmp/oracle_truststore.jks -Djavax.net.ssl.trustStorePassword={{secrets/oracle/truststore_pw}} -Djavax.net.ssl.trustStoreType=JKS
  1. 同样配合方法一中的初始化脚本复制信任库到/tmp目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:07:39