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:如何提供自己的库?
将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用
AWS Glue 作业失败:调用 o71.getDynamicFrame..SdkClientException 时发生错误:无法执行 HTTP 请求:Connect .s3..connect 超时