通过 Docker Operator 在 Airflow 中运行 DBT

问题描述

How to run DBT in airflow without copying our repo 上构建我的问题,我目前正在运行气流并通过 git 同步 dag。我正在考虑在我的工作流程中包含 DBT 的不同选项。 louis_guitton 的一项建议是将 DBT 项目 Docker 化,并通过 Docker Operator 在 Airflow 中运行它。

我之前没有在 Airflow 或一般 DBT 中使用 Docker Operator 的经验。我想知道是否有人尝试过或者可以提供一些关于他们在整合该工作流程方面的经验的见解,我的主要问题是:

  1. DBT 作为一个整体项目应该作为一个 Docker 容器运行,还是应该分解? (例如:测试是否作为独立于 dbt 任务的容器运行?)
  2. 通过 Docker Operator 运行时,DBT 的日志和 UI 是否可访问和/或仍然有用?
  3. 如何运行部分管道? (例如:只想运行管道的一部分)

解决方法

从您的问题来看,您将受益于尝试独立于气流独立于 dockerise dbt。你的很多问题都会消失。但无论如何,这是我的答案。

  1. DBT 作为一个整体项目应该作为一个 Docker 容器运行,还是应该分解? (例如:测试是否作为独立于 dbt 任务的容器运行?)

我建议你为整个项目构建一个 docker 镜像。 docker 镜像可以基于 python 镜像,因为 dbt 是一个 python CLI 工具。然后,您可以使用 docker 映像的 CMD 参数来运行您将在 docker 之外运行的任何 dbt 命令。 请记住 docker run 的语法(与 dbt 无关):您可以指定在调用时要运行的任何命令

$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

此外,“docker dbt”在 Google 上的第一个点击是 this dockerfile,可以帮助您入门

  1. 通过 Docker Operator 运行时,DBT 的日志和 UI 是否可访问和/或仍然有用?

同样,这不是 dbt 问题,而是 docker 问题或气流问题。

在使用 DockerOperator 时,您能在气流 UI 中看到日志吗?是的,see this how to blog post with screenshots

您可以从 docker 容器访问日志吗?是的,Docker 容器将日志发送到 stdoutstderr 输出流(您可以在气流中看到,因为气流会接收到它)。但是日志也存储在主机上的文件夹 /var/lib/docker/containers/ 中的 JSON 文件中。如果您有任何高级需求,可以使用工具(或简单的 BashOperator 或 PythonOperator)获取这些日志,然后用它做您需要的事情。

  1. 如何运行部分管道? (例如:只想运行管道的一部分)

请参阅答案 1,您将使用命令运行 docker dbt 映像

$ docker run my-dbt-image dbt run -m stg_customers