【问题标题】:How to have dbt run with log error FileNotFound to trigger an exit code that isn't 0?如何使用日志错误 FileNotFound 运行 dbt 以触发不为 0 的退出代码?
【发布时间】:2020-08-24 17:35:12
【问题描述】:

我们正在运行 dbt 版本 0.16.1。我们已经将数据管道设置为在 Airflow 中运行,并设置了一个库来映射每个 dbt 模型在 Airflow 上它自己的 bash 运算符中运行。

dbt执行的运行命令如下:

cd /usr/local/airflow/models/[PACKAGE_NAME] && dbt --log-format json run --models [MODEL_NAME]--no-version-check --profiles-dir=/usr/local/airflow/dags/dags-enterprise-model/enterprise_model/include --target=[TARGET] --profile=[PROFILE]

有时(可能同时运行两个模型时),Airflow 会在 dbt run 命令中显示以下消息:

INFO - FileNotFoundError: [Errno 2] 没有这样的文件或目录:'logs/dbt.log' -> 'logs/dbt.log.1'

这是有问题的,因为日志文件没有得到更新,但任务的退出代码被列为 0:

命令以返回码 0 退出

这会导致 Airflow 将任务标记为成功;但是,日志没有打印成功。

我的问题:

  1. 有没有办法将这些错误作为实际错误提出?
  2. 如果做不到这一点,有没有办法指定一个唯一的日志文件?

我不确定这是否是我理解上的差距,dbt 的日志记录中的错误,或者两者兼而有之?

【问题讨论】:

    标签: dbt


    【解决方案1】:

    听起来这绝对是同时多次调用 dbt 的结果,同时让它写入相同的文件。这不是 dbt 错误,因为我们不打算同时调用 dbt;单个调用可以通过线程处理并发模型运行。日志冲突是将 dbt 的模型 DAG 重新实现为 Airflow DAG 的风险之一。

    这些都是公平的问题:

    1. 历史上,dbt 只使用两个日志级别:debuginfo。请参阅有关相关问题的评论:dbt#2680。我非常欣赏 Airflow 和其他编排工具在呈现不同日志级别时具有明确定义的通知行为。一位社区成员实际上只是打开了一个 PR 以添加错误级别的日志记录 (dbt#2723)。

    2. 可以使用dbt_project.yml (docs) 中的log-path 配置为dbt 调用设置自定义日志路径

    【讨论】:

    • 感谢您的回复!是的,我想我不认为其中的“多次 dbt 运行”是一个错误;我建议dbt shell 退出状态更接近一个错误——当运行中有错误时,状态为 0 是否有目的?如果我们可以将 API 调用作为后挂钩执行,我不确定我们是否需要这种解决方法;)
    • 这很公平。如果你在 Snowflake 上,你可以看看 external functions...
    • 遗憾的是,我们在 Netezza 上运行,但目前还没有明确的迁移到云的路线图(可能还需要几年时间)。再次感谢您的回复。我们喜欢 dbt(一个多月前,我们将最核心的分析项目转移到在生产中使用 dbt,我们喜欢它!
    猜你喜欢
    • 2014-04-25
    • 2021-11-06
    • 2019-05-14
    • 2021-10-17
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    相关资源
    最近更新 更多