【问题标题】:How to use cx_Oracle within AWS SageMaker (Jupyter Notebook)如何在 AWS SageMaker(Jupyter Notebook)中使用 cx_Oracle
【发布时间】:2019-04-12 02:03:33
【问题描述】:

我关注了官方installation guide,但到目前为止还没有运气。我想知道cx_Oracle 可以在 AWS SageMaker 的虚拟环境中工作。到目前为止我使用的步骤是:

  1. 创建一个/opt/oracle 目录并在其中解压缩基本的instantclient。
  2. sudo yum install libaio
  3. sudo sh -c "echo /opt/oracle/instantclient_18_3 > /etc/ld.so.conf.d/oracle-instantclient.conf"sudo ldconfig
  4. 最后将LD_LIBRARY_PATH 导出为:export LD_LIBRARY_PATH=/opt/oracle/instantclient_18_3:$LD_LIBRARY_PATH

当尝试使用connection = cx_Oracle.connect(usr + '/' + pwd + '@' + url) 在笔记本内运行连接时,我收到DPI-1047 错误代码,指出libclntsh.so 无法打开,但是该库 在@987654333 @ 文件夹。作为另一种选择,当通过终端 Python 控制台运行相同的连接时,我收到 ORA-01804 错误代码,表示时区文件未正确读取,这也是我正在尝试修复的问题,但怀疑与cx_Oracle 找不到它的库文件夹。 (现在,向我解释一下:为什么亿万富翁公司要创建一个像样的库导入和安装这么困难?)

有没有我遗漏的步骤?是否有我应该考虑的有关 AWS SageMaker 的详细信息?另外,还有其他选择可以通过 Python 和 AWS 从 oracle 服务器中提取数据吗?

【问题讨论】:

  • 如果有人认识可以解决这个问题的人,我什至准备花相当多的钱来知道这个问题的解决方案。
  • 我也很困惑,为什么亚马逊会让你这么难。我没有任何 AWS 经验,所以没有直接的答案。三个 cmets:(i) cx_Oracle 安装说明实际上位于 cx-oracle.readthedocs.io/en/latest/installation.html (ii) 您没有给出确切的错误 DPI 消息,这可能会有所帮助。 (iii) 配置 ldconfig 后,您不需要(不应该)设置 LD_LIBRARY_PATH。
  • 我的评论实际上是针对 Oracle 使库如此容易出现配置错误(就像他们销售的许多其他软件一样),但我想它也适用于亚马逊。 (i) 您发布的链接与我遵循的教程具有相同的说明,这是您下载软件包时指向的那个; (iii)你是对的,我忘记了,只是我都做了,因为它们都不行。
  • (ii) 完整的错误是:DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help.
  • 这可能是在黑暗中拍摄,但您能否详细说明您导出LD_LIBRARY_PATH 的位置? Jupyter 内核会话可能不会与您的终端会话共享环境变量。 (替代方法是将您的步骤移动到笔记本生命周期配置中,或使用 %env 指令)

标签: python-3.x amazon-web-services cx-oracle amazon-sagemaker


【解决方案1】:

您好,感谢您使用 SageMaker!

经过一番努力,我终于能够找出允许我从 SageMaker 笔记本实例中查询 Oracle 12 数据库的一系列步骤。以下是我采取的步骤:

  1. 出于测试目的,我使用Amazon RDS 创建了一个Oracle 12 数据库。 (如果您已经有可用的 Oracle 数据库,当然可以跳过此步骤。)
  2. 我下载了 Oracle 12 Instant Client RPM,如 here 所述。请注意,您需要一个 Oracle 帐户才能下载此文件。
  3. 我从 JupyterLab 中将 RPM 上传到了我的 SageMaker Notebook 实例。请注意,在继续下一步之前,这可能需要 2-3 分钟才能完全上传。 (我最初在运行安装时遇到了问题,因为上传仍在进行中。)
  4. 我按照 Oracle 说明中的说明从 Jupyter 终端运行了以下所有命令:
cd SageMaker

sudo yum install oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
sudo sh -c "echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig
sudo mkdir -p /usr/lib/oracle/12.2/client64/lib/network/admin

# Restart Jupyter...
sudo restart jupyter-server
  1. 然后我安装了cx_Oracle 库:
source activate python3
pip install cx_Oracle --upgrade
  1. 最后,我使用 conda_python3 内核创建了一个新笔记本:
import cx_Oracle
db = cx_Oracle.connect("my_username/my_password@my-rds-instance.ccccccccccc.us-east-1.rds.amazonaws.com/ORCL")

# Example query
cursor = db.cursor()
for row in cursor.execute('select * from DBA_TABLES'):
  print(row)

...然后它起作用了!

请注意,我花了几次尝试找出确切的连接字符串,这可能会因您的数据库配置方式而异。不幸的是,错误消息很难理解 - 就我而言,我遇到了错误 ORA-12504: TNS:listener is not given the SERVICE_NAME in CONNECT_DATA 直到我在末尾指定了 /ORCL连接字符串。

如果您需要经常执行这些步骤,您可以在 SageMaker Lifecycle Configuration 脚本中添加 Oracle 客户端的安装和配置。我还没有测试过这种情况,但可能值得一试!

最后一件事,我在您的问题中注意到您使用的是 Oracle 18 客户端。我没有测试那个确切的场景,因为我只能访问 Oracle 12 数据库。但是,Oracle 12 客户端也应该能够连接到 Oracle 18 数据库。

最好, 凯文

【讨论】:

猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-28
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多