气流未在 /usr/local/airflow/dags 中加载 dag

Posted

技术标签:

【中文标题】气流未在 /usr/local/airflow/dags 中加载 dag【英文标题】:Airflow not loading dags in /usr/local/airflow/dags 【发布时间】:2018-01-14 00:42:16 【问题描述】:

Airflow 似乎跳过了我添加到 /usr/local/airflow/dags 的 dags。

当我跑步时

airflow list_dags

输出显示

[2017-08-06 17:03:47,220] models.py:168 INFO - Filling up the DagBag from /usr/local/airflow/dags


-------------------------------------------------------------------
DAGS
-------------------------------------------------------------------
example_bash_operator
example_branch_dop_operator_v3
example_branch_operator
example_http_operator
example_passing_params_via_test_command
example_python_operator
example_short_circuit_operator
example_skip_dag
example_subdag_operator
example_subdag_operator.section-1
example_subdag_operator.section-2
example_trigger_controller_dag
example_trigger_target_dag
example_xcom
latest_only
latest_only_with_trigger
test_utils
tutorial

但这不包括 /usr/local/airflow/dags 中的 dags

ls -la /usr/local/airflow/dags/
total 20
drwxr-xr-x 3 airflow airflow 4096 Aug  6 17:08 .
drwxr-xr-x 4 airflow airflow 4096 Aug  6 16:57 ..
-rw-r--r-- 1 airflow airflow 1645 Aug  6 17:03 custom_example_bash_operator.py
drwxr-xr-x 2 airflow airflow 4096 Aug  6 17:08 __pycache__

气流是否需要满足其他条件才能识别 DAG 并加载它?

【问题讨论】:

【参考方案1】:

在列出 dag 之前尝试 airflow db init。这是因为 airflow list_dags 列出了数据库中存在的所有 dag(而不是在您提到的文件夹中)。 Airflow initdb 将在数据库中为这些 dag 创建条目。

确保您已将环境变量 AIRFLOW_HOME 设置为 /usr/local/airflow。如果未设置此变量,则气流会在主气流文件夹中查找 dag,在您的情况下该文件夹可能不存在。

【讨论】:

【参考方案2】:

您需要先设置气流并初始化数据库

export AIRFLOW_HOME=/myfolder
mkdir /myfolder/dags
airflow db init

你也需要创建一个用户

 airflow users create \
          --username admin \
          --firstname FIRST_NAME \
          --lastname LAST_NAME \
          --role Admin \
          --email admin@example.org

如果您正确完成了操作,您应该会在您的文件夹中看到airflow.cfg。在那里你会找到dags_folder,它显示了 dags 文件夹。

如果您已将 dag 保存在此文件夹中,您应该会在 dag 列表中看到它

airflow dags list

,或使用 UI 与

airflow webserver --port 8080

否则,再次运行airflow db init

【讨论】:

【参考方案3】:

在我的例子中,dag 文件中的print(something) 阻止在命令行上打印 dag 列表。

如果上述解决方案不起作用,请检查您的 dag 中是否有打印行。

【讨论】:

【参考方案4】:

如果airflow.cfg 配置指向不正确的路径,就会出现这种情况。

第 1 步: 转到 basepath/src/config/

第 2 步:打开airflow.cfg 文件

第 3 步:检查它应该指向您创建的 dags 文件夹的路径

dags_folder = /usr/local/airflow/dags

【讨论】:

【参考方案5】:

可能有两个问题: 1.查看DAG python程序中创建DAG对象时给出的Dag名称

dag = DAG(
dag_id='Name_Of_Your_DAG', 
....)

请注意,在很多情况下,给出的名称可能与 DAG 列表中已经存在的名称相同(因为如果您复制了 DAG 代码)。如果不是这种情况,那么 2. 检查在 Airflow 的配置文件中设置为 DAG 文件夹的路径。 您可以在系统上的任何位置创建 DAG 文件,但您需要在 Airflow 的配置文件中设置该 DAG 文件夹/目录的路径。

例如,我在主目录中创建了我的 DAG 文件夹,然后我必须在终端中使用以下命令编辑气流.cfg 文件:

在主目录或根目录创建 DAG 文件夹

$mkdir ~/DAG

在我安装了气流的气流目录中编辑气流.cfg

 ~/$cd airflow
 ~/airflow$nano airflow.cfg

在此文件中,将 dags_folder 路径更改为我们创建的 DAG 文件夹。

如果您仍然遇到问题,请重新安装 Airflow 并参考此link 以安装 Apache Airflow。

【讨论】:

这对我有帮助!我已将 DAG 复制到新文件中,但忘记更改 id。【参考方案6】:

当我对 dags 文件夹中的 dag 进行更改时,我发现我必须重新启动 UI 的调度程序才能获取新的 dags。我发现当我更新 dag 时,它们会在我运行 airflow list_dags 时出现在列表中,只是在我重新启动调度程序之前不会出现在 UI 中。

首先尝试运行:

airflow scheduler

【讨论】:

【参考方案7】:

示例文件不在 /usr/local/airflow/dags 中。您可以通过编辑airflow.cfg(通常在~/airflow 中)简单地将它们静音。在“核心”部分设置load_examples = False

有几个错误可能会导致您的 DAG 未在 list_dags 中列出。

    您的 DAG 文件存在语法问题。要检查这一点,只需运行 python custom_example_bash_operator.py 并查看是否有任何问题。 查看文件夹是否为默认dag加载路径。对于一只新鸟,我建议只需创建一个新的 .py 文件并从这里 https://airflow.incubator.apache.org/tutorial.html 复制样本,然后查看测试 dag 是否出现。 确保 dag 文件中有 dag = DAG('dag_name', default_args=default_args)

【讨论】:

【参考方案8】:

您能分享custom_example_bash_operator.py 中的内容吗? Airflow 扫描文件中的某些魔法以确定是否是 DAG。它会扫描airflowDAG

此外,如果您对 DAG 使用重复的 dag_id,它将被覆盖。正如您似乎源自示例 bash 运算符,您是否保留了 DAG example_bash_operator 的名称?尝试重命名它。

【讨论】:

这就是我的收获。我以为它会扫描 DAG 对象,但实际上它首先会扫描文件中的字符串 DAGairflow,然后再尝试解析它。【参考方案9】:

是你的

custom_example_bash_operator.py

DAG 名称与其他名称不同吗? 如果是,请尝试重新启动调度程序甚至 resetdb。我通常将文件名也误认为是 dag 名称,因此最好将它们命名为相同的名称。

【讨论】:

【参考方案10】:

尝试重新启动调度程序。当需要向 DAG Bag 添加新的 DAGS 时,需要重启调度器

【讨论】:

这不是真的。调度器在 dag bag 中获取新的 dag。【参考方案11】:
dag = DAG(
    dag_id='example_bash_operator', 
    default_args=args,
    schedule_interval='0 0 * * *',
    dagrun_timeout=timedelta(minutes=60))

当一个 DAG 被实例化时,它会以您在 dag_id 属性中指定的名称弹出。 dag_id 用作 DAG 的唯一标识符

【讨论】:

【参考方案12】:

正在加载我的 dag,但我输入了错误的 DAG 名称。我期望 dag 由文件命名,但名称由 DAG 构造函数的第一个参数确定

dag = DAG(
    'tutorial', default_args=default_args, schedule_interval=timedelta(1))

【讨论】:

是的,第一个元素是DAG id,可以看到变量列表here 各位大神,谢谢。我遇到了同样的问题 谢谢,我也犯了同样的错误,这个答案对我有帮助。 感谢您的回答,您节省了我下午剩下的时间!

以上是关于气流未在 /usr/local/airflow/dags 中加载 dag的主要内容,如果未能解决你的问题,请参考以下文章

气流:一次运行气流子项的模式

气流.providers 和气流.contrib 之间的差异

部署气流代码库

气流测试模式 xcom 拉/推不工作

如何使用气流检查长时间运行的 http 任务的状态?

如何使用apache气流调度谷歌云bigquery存储过程