气流DAG从哪里获得依赖关系?

时间:2019-08-09 15:51:09

标签: import dependencies airflow

我正在努力用Airflow执行一些非常简单的任务。

对于上下文,我使用docker-compose通过Airflow和Postgres运行docker容器。 (https://github.com/puckel/docker-airflow

我正在尝试测试我们内部图书馆之一与Airflow的集成。我用来快速测试的一种不太干净的方法是将docker exec放入气流容器并pip安装适当的库(通过主机以只读模式通过Docker卷与主机共享)。

一切都已通过pip正确安装,并且在运行虚拟Python脚本时可以使用我的库。

但是,当我在DAG python文件中集成相同的逻辑时,出现错误“损坏的dag,没有名为inhouse_lib的模块。

起初,我以为Airflow是在相对于Python版本的特定pip目录中选择依赖项,并且我将该库安装在另一个pip目录中。

但是对于所有使用Python二进制文件的人,它们都使用Python 3.7。

对于在创建点列表时我拥有的所有pip二进制文件(pip,pip3,pip3.7),我都可以找到我的内部库。

我不明白我应该如何部署我的库,以便Airflow可以接管它们。任何见解都将不胜感激。

感谢您的帮助。

修改 为了阐明我的工作意图,下面提供了一些详细信息。在我的DAG中,我想使用一个自定义的Python库(将其称为尚未实现的myLib功能。实现后,我想将此最新版本的myLib部署到气流容器中。

我将docker-compose.yml更新为一个卷,该卷将我的主机目录与容器气流主目录上的myLib映射。

# Go in the container
docker exec -it <airflow docker container ID> bash

# Install myLib to Python environment
pip install myLib

# Check the installation
pip list | grep myLib # output myLib

# Check the import in Python REPL
python
import myLib # No Python error

相同的导入在我的Airflow DAG中不起作用。检查容器日志时,出现以下错误:

[2019-08-30 15:14:30,499] {{__init__.py:51}} INFO - Using executor LocalExecutor
[2019-08-30 15:14:30,894] {{dagbag.py:90}} INFO - Filling up the DagBag from /usr/local/airflow/dags
[2019-08-30 15:14:30,897] {{dagbag.py:205}} ERROR - Failed to import: /usr/local/airflow/dags/mydag.py
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/airflow/models/dagbag.py", line 202, in process_file
    m = imp.load_source(mod_name, filepath)
  File "/usr/local/lib/python3.7/imp.py", line 171, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 696, in _load
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/local/airflow/dags/mydag.py", line 7, in <module>
    import myLib
ModuleNotFoundError: No module named 'myLib'
[2019-08-30 15:14:31 +0000] [167] [INFO] Handling signal: ttou
[2019-08-30 15:14:31 +0000] [11446] [INFO] Worker exiting (pid: 11446)

2 个答案:

答案 0 :(得分:0)

对于每个dag,您需要先对其进行测试,然后再运行。

您可以使用以下cli命令来检查环境和代码逻辑:

airflow list dags
airflow test [dag_name] [task_name] [date]

根据您的问题,您应该面对环境依赖性方面的问题。您可以通过docker容器中的气流列表dags进行检查。为了解决您的问题,我们有两种方法:   1.在airflow.cfg文件中设置dags文件夹,将模块文件放入dags文件夹中。

  1. 检查气流环境中的python路径,确保您的模块可以访问。

========================== 更新1: 为了检查模块是否正确安装,可以使用以下命令:

  1. docker图片| grep [您的气流图像名称]
  2. 找到容器ID
  3. docker运行[container id] python
  4. 在docker python环境中
  5. 检查您的模型是否正确安装。像:import os如果有任何错误信息,您 需要doubleck,您可以通过pip进行模块化安装。

更新2: 为了检查您的依赖度,您可以: 编写一个简单的dag,然后使用气流测试[dag_name] [dag_task_name] [date]来查看工作是否正常。

据我所知,您可能会尝试从零开始构建气流图像,这可能效果很好。泊坞窗容器可能会提供一些环境。和用户实例。

如果您希望继续使用网络构成的容器,则可以在登录并尝试安装python lib时尝试切换为相同的使用ID。就像跟随模式

docker exec -u [用户名,您可以找到您所使用的dockerfile] [container_id]。

别忘了将所有更改提交到新映像ID并从新映像ID加载容器,否则每次运行

都可能丢失更改

答案 1 :(得分:0)

使用以下命令构建puckel dockerfile:

docker build --rm --build-arg PYTHON_DEPS="flask_oauthlib>=0.9" -t puckel/docker-airflow .

PYTHON_DEPS变量中将要通过pip安装的Python依赖项列表添加为逗号分隔的列表。

这将在安装了依赖项的情况下构建映像,然后您可以仅使用import yourpackage在dag中使用它。