为PythonOperator任务导入外部包



我正试图将pyodbc包导入我的Airflow任务中,这样我就可以创建一个到SQL数据库的连接对象——然而Airflow说"ModuleNotFoundError:没有名为"pyodbc"的模块;。

我在Docker容器中运行Airflow 2.1.2,我尝试打开一个交互式终端并运行:"pip-install-pydbc",但我从容器中得到一个错误:"error:Failed building wheel for pyodbc"。

将软件包安装到Airflow以便任务可以参考它们的最佳做法是什么?

感谢

您需要构建自己的自定义映像。

我们有一整套关于它的文件

在大多数情况下,当你只想添加一个PyPI包时;延伸";图像将起作用。

但在您的情况下,您需要添加一些适当的依赖项和";自定义";因为pyodbc显然需要";构建必需品";(编译器(和一些附加的";apt";依赖关系。

这比扩展图像要复杂一点,并且需要使用整个气流源(就目前而言,未来会更好(。然而,你会得到的结果将是高度优化的尺寸,生产准备好的图像定制的方式,你需要它-几乎相同的图像Airflow社区建立和测试,但与";odbc";额外安装。

参见";延伸";与自定义相比。此外,我在2020年气流峰会上的演讲可能有助于理解这两种方法。

文档中有许多示例可供参考。

只是为了解释你的特殊情况。对于odbc,您需要获得:

  • unixodbc-dev作为附加的dev-apt-deps(用于编译odbc包(
  • odbc作为额外气流(见下文解释(
  • unixodbc作为额外的运行时apt-dep(具有odbc库的运行时版本(

关于附加功能-Airflow有一组附加功能,可以与此处的主气流包附加功能一起安装-它将带来";金色";版本(Airflow CI系统测试的版本(所需的一组依赖项,以及2.1.2发布时发布的odbc提供程序包。provider包包含ODBC的所有运算符/传感器/钩子,您可能会发现这些操作符/传感器/挂钩有助于构建DAG。

我刚刚测试了这个命令(你需要获得最新的气流源(,它对我有效:

docker build . 
​--build-arg PYTHON_BASE_IMAGE="python:3.6-slim-buster" 
​--build-arg AIRFLOW_VERSION="2.1.2" 
--build-arg ADDITIONAL_AIRFLOW_EXTRAS="odbc" 
​--build-arg ADDITIONAL_DEV_APT_DEPS="unixodbc-dev" 
​--build-arg ADDITIONAL_RUNTIME_APT_DEPS="unixodbc" 
​--tag "myodbc-airflow:2.1.2"

然后,您可以在docker compose/k8s或您使用的任何部署中使用myodbc-airflow:2.1.2而不是apache/airflow:2.1.2

同样的方法可以用于任何其他需要编译和一些额外的"依赖"的依赖;apt";依赖项-您可以通过这种方式指定多个附加项和多个依赖项,甚至是Airflow附加项无法预见的新python依赖项。

最新更新