python - 如何使用 Apache Airflow 中的 DockerOperator
问题描述
这个问题与理解有关 DockerOperator 和 Apache Airflow 的概念有关,所以我不确定这个站点是否正确。如果没有,请让我知道我可以在哪里发布它。
情况如下:我正在使用一台 Windows 笔记本电脑,我开发了一个非常基本的 ETL 管道,该管道从某些服务器中提取数据,并使用 Apache-Airflow 定期将未处理的数据写入 MongoDB。我有一个docker-compose.yml
包含三个服务的文件:用于 MongoDB 的 mongo 服务、作为 MongoDB 管理工具的 mongo-express 服务、用于 Apache-Airflow 的网络服务器服务和作为 Apache-Airflow 数据库后端的 postgres 服务。
到目前为止,我已经在函数中开发了一些 Python 代码,这些函数由 Airflow 实例使用 PythonOperator 调用。由于使用 PythonOperator 进行调试非常困难,所以我现在想尝试使用 DockerOperator。我一直在关注本教程,该教程声称使用 DockerOperator,您可以开发独立于操作系统的源代码,由于 Docker 的“构建一次,到处运行”的概念,代码稍后将在其上执行。
我的问题是我没有完全理解使用 DockerOperator 运行代码所需的所有必要步骤。在本教程中,我有以下关于任务开发和部署的问题:
- 将工件与所有依赖项一起打包到 Docker 映像中。==> 这是否意味着我必须为每个任务创建一个 Dockerfile,然后使用这个 Dockerfile 构建一个映像?
- 从容器中公开一个入口点,以使用 DockerOperator 调用和参数化任务。==> 你是怎么做到的?
感谢您的宝贵时间,我非常感谢!
解决方案
通常,您将拥有一个处理一种任务的 Docker映像。因此,对于任何一个管道,您可能会使用各种不同的 Docker 映像,每一步都有一个不同的映像。
关于您的问题,这里有几个考虑因素,特别是关于部署的问题。
- 您需要创建一个 Docker 映像。您可能希望为此添加标签,因为您需要对图像进行版本控制。
DockerOperator
默认为图像上的标签latest
。 - 该图像需要可用于您部署的 Airflow 实例。如果您想在本地运行 Airflow,它们可以构建在您运行 Airflow 的机器上。如果您已在某处在线部署 Airflow,则更常见的做法是将它们推送到云服务。您可以使用许多提供程序(Docker Hub、Amazon ECR 等)。
从容器中公开一个入口点,以使用 DockerOperator 调用和参数化任务。==> 你是怎么做到的?
如果您已经构建了映像,并且可用于 Airflow,您只需要使用以下命令创建一个任务DockerOperator
:
dag = DAG(**kwargs)
task_1 = DockerOperator(
dag=dag,
task_id='docker_task',
image='dummyorg/dummy_api_tools:v1',
auto_remove=True,
docker_url='unix://var/run/docker.sock',
command='python extract_from_api_or_something.py'
)
我建议花一些时间来了解 Docker。一开始有点难以理解,但它是一个非常有价值的工具,尤其是对于像 Airflow 这样的系统。
推荐阅读
- python - 如果我已经安装了 python 扩展,如何将 VS Code 中的路径更改为扩展以及 autopep8 的正确路径是什么?
- java - Java 8 Lambdas flatmapping、groupingBy 和 mapping 以获取 T 和 List 的 Map
- javascript - Discord.JS EmbedMessage 与收集器
- elasticsearch - 使用 Node client.update() 处理外部版本控制的正确方法
- python - 如何将 2D numpy 数组转换为 Cython 中的指针数组?
- .net - 从 .Net Framework 4.6 升级到 .Net Framework 4.8 后无法访问 Web 应用程序
- python - 有没有办法解决由 Windows 文件名中的无效字符产生的这些转义序列?
- javascript - 迭代嵌套数组以同时从所有对象中获取相同的索引值
- javascript - 如何为画布转换延迟加载
- ruby-on-rails - 如何在Ruby on Rails中出现错误时回滚事务块中的所有事务