AWS Glue Python Shell 与 Oracle 的连接

Posted

技术标签:

【中文标题】AWS Glue Python Shell 与 Oracle 的连接【英文标题】:AWS Glue Python Shell connection with Oracle 【发布时间】:2020-04-14 09:36:55 【问题描述】:

在运行 AWS Glue Python shell(不使用 Spark)时,我想连接 Oracle。 我在 dev_endpoint 或我的虚拟机中成功地完成了所有的事情(在下面的链接中描述),但我的目标是拥有它 AWS Glue Python Shell。 Connection with Oracle cx_Oracle problem with AWS Glue Python Shell

AWS Glue Python Shell 中的所有库都必须以 .whl 或 .egg 包的形式提供 - 然后安装它们。但是 AWS Glue 是无服务器的,我无法找到它们的安装位置 - 因此我可以正确设置 rpath。

如何知道absolute_path_to_library_dir?

【问题讨论】:

【参考方案1】:

由于glue 是无服务器的,所以没有/path/to/library/dir

glue 中的 python 进程需要一些东西来连接到外部数据库,例如你的 oracle 服务器。

    python库必须打包成.egg.whl,上传到s3,创建作业时必须指定这些文件的位置(字段Python Library Path)。 这适用于您创作或通常pip install 的任何库,但这些在 aws 为粘合过程提供的环境中不可用。因此,您需要在本地为cx_Oracle 构建一个.egg,上传到s3,并在创建工作时提供Python Library Path 中的路径。如果您已经创建了作业,您可以编辑该作业并提供s3-path-to-cs-oracle.egg

    必须通过 etl 脚本从安全的外部服务中获取连接凭据等秘密。一种选择是将 oracle 连接凭据存储在胶水中。从 aws 胶水控制台,转到连接,添加 jdbc 连接并保存您的数据库凭据。

    在您的 etl 脚本中,使用boto3.client('glue').get_connection 检索连接详细信息,并使用用户上传的cx_Oracle 库连接到数据库。这是一个示例 sn-p,您需要对其进行调整并包含在您的 etl 脚本中

sn-p:

import boto3
import cx_Oracle as orcl

glue = boto3.client('glue')
resp = glue.get_connection(Name='my-oracle-connection')
props = resp['Connection']['ConnectionProperties']
dsn = props['JDBC_CONNECTION_URL'].split('//')[-1]
user = props['USERNAME']
pw = props['PASSWORD']
db = orcl.connect(user, pw, dsn)
#^ `db` should be a connection to your oracle db

【讨论】:

我收到此错误:cx_Oracle.DatabaseError:DPI-1047:找不到 64 位 Oracle 客户端库:“libclntsh.so:无法打开共享对象文件:没有这样的文件或目录”。 libclntsh.so 带有 oracle 即时客户端软件包。正如***.com/questions/57598027/… 中提到的那样,应该设置 LD_LIBRARY_PATH 或 rpath - 但这不能在 AWS Glue Python Shell 中完成,因为正如您所提到的,胶水是无服务器的。有什么办法吗? 请按照此答案***.com/a/59467059/15235078 生成已修补的客户端,并阅读我的 cmets 到此答案以获取有关如何设置 Glue 作业的说明。我知道对于许多偶然发现此问题的人来说,这仍然是一个实际问题。我设法在评论中添加了这些步骤,但请告诉我您是否想要一个带有分步指南的单独答案。

以上是关于AWS Glue Python Shell 与 Oracle 的连接的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue Python shell 配置 DPU

AWS Glue Python-Shell:如何提供自己的库?

将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用

AWS Glue 作业失败:调用 o71.getDynamicFrame..SdkClientException 时发生错误:无法执行 HTTP 请求:Connect .s3..connect 超时

每次我从 Python 库路径调用 .egg 时,AWS Glue 作业都会崩溃

如何为 AWS Glue 生产 Python 脚本?