【问题标题】:Unable to connect to Oracle database with provider on MWAA无法通过 MWAA 上的提供程序连接到 Oracle 数据库
【发布时间】:2021-06-23 07:43:21
【问题描述】:

我目前正在使用 MWAA(Airflow 版本:2.0.2)来构建数据管道。当我尝试使用提供程序连接到 Oracle 数据库 (Oracle 10g) 时,cx_Oracle 引发异常。

  1. 安装 apache-airflow[oracle]==2.0.2 后执行

cx_Oracle.DatabaseError:DPI-1047:找不到 64 位 Oracle 客户端库:“libclntsh.so:无法打开共享对象文件:没有这样的文件或目录”

  1. 上传plugins.zip,里面有instant_client_12_1目录,覆盖OracleHook的get_conn函数,执行init_oracle_client函数,指定instant client目录

cx_Oracle.DatabaseError:DPI-1047:找不到 64 位 Oracle 客户端库:“libmql1.so:无法打开共享对象文件:没有这样的文件或目录”

但该文件确实存在于文件夹下(如下)

-rw-rw-r-- 1 martin martin    29404 Jun 23 07:30 adrci
-rw-rw-r-- 1 martin martin      450 Jun 23 07:30 BASIC_LITE_README
-rw-rw-r-- 1 martin martin    43944 Jun 23 07:30 genezi
lrwxrwxrwx 1 martin martin       21 Jun 23 07:35 libclntshcore.so -> libclntshcore.so.12.1
-rw-rw-r-- 1 martin martin  6990875 Jun 23 07:30 libclntshcore.so.12.1
lrwxrwxrwx 1 martin martin       17 Jun 23 07:35 libclntsh.so -> libclntsh.so.12.1
-rw-rw-r-- 1 martin martin 58793741 Jun 23 07:30 libclntsh.so.12.1
-rw-rw-r-- 1 martin martin  1768370 Jun 23 07:30 libipc1.so
-rw-rw-r-- 1 martin martin   544150 Jun 23 07:30 libmql1.so
-rw-rw-r-- 1 martin martin  6213011 Jun 23 07:30 libnnz12.so
lrwxrwxrwx 1 martin martin       15 Jun 23 07:35 libocci.so -> libocci.so.12.1
-rw-rw-r-- 1 martin martin  2576030 Jun 23 07:30 libocci.so.12.1
-rw-rw-r-- 1 martin martin  6005681 Jun 23 07:30 libociicus.so
-rw-rw-r-- 1 martin martin   156353 Jun 23 07:30 libocijdbc12.so
-rw-rw-r-- 1 martin martin   337137 Jun 23 07:30 libons.so
-rw-rw-r-- 1 martin martin   118491 Jun 23 07:30 liboramysql12.so
-rw-rw-r-- 1 martin martin  3692096 Jun 23 07:30 ojdbc6.jar
-rw-rw-r-- 1 martin martin  3698857 Jun 23 07:30 ojdbc7.jar
-rw-rw-r-- 1 martin martin   227410 Jun 23 07:30 uidrvci
-rw-rw-r-- 1 martin martin    71202 Jun 23 07:30 xstreams.jar

我认为不可能在 MWAA 上更新 LD_LIBRARY_PATH 等环境变量,有什么想法吗?谢谢。

【问题讨论】:

  • 我在笔记本电脑上进行了测试,也得到了相同的结果。
  • 似乎不是气流问题。请参阅other discussion about this error
  • 嗨@TomaszUrbaszek。但是我们无法修改 MWAA 上的环境变量 LD_LIBRARY_PATH(或者有办法吗?)让 cx_Oracle 正确获取客户端。
  • 请联系 MWAA 支持人员进行检查。正如我所说,这不是气流问题,MWAA 有其自身的一些限制,包括可以安装的内容。请参阅mailing thread 了解它,包括 MWAA 团队。

标签: oracle airflow amazon mwaa


【解决方案1】:

我已经通过关注this instruction解决了这个问题

  1. 下载Oracle Instant Client 并将其放入plugins 文件夹中。
  2. 执行以下 Docker 命令(我在 Windows 上使用的是 Docker Desktop)
docker pull amazonlinux
docker run -it amazonlinux:latest /bin/bash
yum -y install libaio
cd /lib64
rm libaio.so.1
ln -s ./libaio.so.1.0.1 libaio.so.1 # This is critical for me to change the symbol link to relative path
  1. 从 Powershell 执行以下命令(因为我在 Windows 上使用 Docker Desktop)
docker container ls # copy the container ID that you created on step#2
docker cp {docker ID}:/lib64/libaio.so.1 C:\dir\of\oracle\instant\client\under\plugins
docker cp {docker ID}:/lib64/libaio.so.1.0.0 C:\dir\of\oracle\instant\client\under\plugins
docker cp {docker ID}:/lib64/libaio.so.1.0.1 C:\dir\of\oracle\instant\client\under\plugins
  1. 在 plugins 文件夹下创建 __ init __.py,或者如果您已经有,请附加以下代码
from airflow.plugins_manager import AirflowPlugin
import os
# the [instantclient] below depends on your folder structure
os.environ["LD_LIBRARY_PATH"]='/usr/local/airflow/plugins/instantclient'
os.environ["DPI_DEBUG_LEVEL"]="64"

class EnvVarPlugin(AirflowPlugin):                
    name = 'env_var_plugin' 

  1. 将插件压缩到 plugins.zip
  2. 将 plugins.zip 上传到 S3
  3. 更新 MWAA 以使用更新后的 plugins.zip

完成~

【讨论】:

    【解决方案2】:

    这个问题可以通过使用oracle客户端构建airflow docker来解决。请查看thread

    【讨论】:

    • 我正在使用 MWAA,这导致我无法控制在配置工作人员时要使用的 docker 映像。
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2013-10-21
    • 2018-06-20
    • 2012-09-17
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多