【问题标题】:Airflow not loading dags in /usr/local/airflow/dags气流未在 /usr/local/airflow/dags 中加载 dag
【发布时间】: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 并加载它?

【问题讨论】:

    标签: airflow


    【解决方案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 中列出。

              1. 您的 DAG 文件存在语法问题。要检查这一点,只需运行 python custom_example_bash_operator.py 并查看是否有任何问题。
              2. 查看文件夹是否为默认dag加载路径。对于一只新鸟,我建议只需创建一个新的 .py 文件并从这里 https://airflow.incubator.apache.org/tutorial.html 复制样本,然后查看测试 dag 是否出现。
              3. 确保 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
                    • 各位大神,谢谢。我遇到了同样的问题
                    • 谢谢,我也犯了同样的错误,这个答案对我有帮助。
                    • 感谢您的回答,您节省了我下午剩下的时间!
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-08-05
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-11-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多