Azure Databricks中cx_Oracle连接Oracle报DPI-1047问题咨询
Azure Databricks cx_Oracle 连接Oracle 报DPI-1047错误解答
针对四个疑问的逐一答复
- 关于init脚本是否部署成功:是部署未按预期完成。集群事件日志显示init脚本执行成功,仅代表脚本整体执行返回了0退出码,不代表内部所有步骤执行符合预期。你通过
dbutils.fs.ls("/databricks/driver/")未查询到oracle_ctl目录,同时下载的客户端文件结构和预设结构不符,说明脚本中的目录创建、文件解压、路径移动环节至少有一步执行失效,没有把Oracle客户端文件放置到预设路径。 - 关于
/databricks/driver/oracle_ctl是否为隐藏目录:不是。dbutils.fs.ls仅会默认不展示名称以.开头的隐藏目录,oracle_ctl不符合隐藏目录命名规则,无法查询到就代表该路径在driver节点上实际不存在。 - 关于依赖查找路径是否错误:是路径配置和实际客户端文件结构不匹配。你下载的新版Oracle Instant Client压缩包解压后,
libclntsh.so等依赖文件直接存放在解压根目录,不存在lib子文件夹;但当前配置的cx_Oracle依赖查找路径、或者LD_LIBRARY_PATH环境变量硬编码指向了/databricks/driver/oracle_ctl/lib,自然无法找到对应依赖文件,报错路径中出现的双斜杠//不影响路径解析,不是报错核心原因。 - 关于cx_Oracle方案是否可用、连接语法是否正确:cx_Oracle连接Oracle的方案本身可正常使用,你使用的
cx_Oracle.connect(user= user_name, password= password,dsn= IP+':'+Port+'/'+DB_name)语法没有问题,本地内网环境可连通说明DSN拼接逻辑正确,当前报错和连接语法无关,修复客户端依赖路径问题后即可正常连接。
可直接落地的修复步骤
- 修正init脚本逻辑:下载对应版本64位Oracle Instant Client后,先校验解压后的文件结构,将所有客户端依赖文件移动到
/databricks/driver/oracle_ctl目录下。如果要保留原有lib层级的路径配置,可在oracle_ctl目录下新建lib子文件夹,将所有.so后缀的依赖文件移入该子目录。 - 在init脚本中追加环境变量配置,将客户端实际存放路径加入全局动态链接库查找路径,参考命令:
echo 'export LD_LIBRARY_PATH=/databricks/driver/oracle_ctl:$LD_LIBRARY_PATH' >> /databricks/spark/conf/spark-env.sh
如果是把依赖放在lib子目录下,就把路径替换为/databricks/driver/oracle_ctl/lib。
- 重启集群后,先执行shell命令校验文件是否存在:
%sh ls -l /databricks/driver/oracle_ctl
确认libclntsh.so文件存在后,再运行连接代码测试。
前置校验项:需确认Databricks集群所在虚拟网络已和Oracle数据库所在内网打通,网络安全组、防火墙规则已放通对应数据库端口,且下载的Oracle客户端版本和目标数据库版本兼容。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

