0

我目前正在使用 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. 上传包含instant_client_12_1目录的plugins.zip,覆盖OracleHook的get_conn函数,执行init_oracle_client函数,指定instant_client_12_1目录

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 之类的环境变量,有什么想法吗?谢谢。

4

2 回答 2

1

我已经按照这个说明解决了这个问题

  1. 下载 Oracle 即时客户端并将其放入 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

完成~

于 2021-06-24T00:55:22.693 回答
0

该问题可以通过使用 oracle 客户端构建气流 docker 来解决。请检查线程

于 2021-09-09T14:59:05.433 回答