DAG在Web-UI中不可见。

40

我对Airflow还不熟悉。我正在跟随教程并编写以下代码。

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta
from models.correctness_prediction import CorrectnessPrediction

default_args = {
    'owner': 'abc',
    'depends_on_past': False,
    'start_date': datetime.now(),
    'email': ['abc@xyz.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5)
}

def correctness_prediction(arg):
    CorrectnessPrediction.train()

dag = DAG('daily_processing', default_args=default_args)

task_1 = PythonOperator(
    task_id='print_the_context',
    provide_context=True,
    python_callable=correctness_prediction,
    dag=dag)

在运行脚本时,没有显示任何错误,但是当我在Web-UI中检查dags时,它没有出现在菜单->DAGs下。

enter image description here

但是我可以在“菜单”->“浏览”->“作业”下看到已安排的任务

enter image description here

我也无法在$AIRFLOW_HOME/dags中看到任何内容。这是正常的吗?有人可以解释一下吗?

在您的主项目目录中创建一个名为 dags 的子目录,并将您的 DAG 移动到该目录中。然后刷新 Airflow UI,您应该能够看到它。请注意,AIRFLOW_HOME 应设置为您的主项目目录。 - tsveti_iko
你不应该使用 datetime.now() 来进行调度。 - Phd. Burak Öztürk
15个回答

33

运行 airflow dags list(或 Airflow 1.x 的 airflow list_dags)来检查 DAG 文件是否正确地位于其中。

由于某些原因,在执行此操作之前,我在浏览器 UI 中看不到我的 DAG。可能是浏览器缓存或其他问题。

如果这样做不起作用,您应该使用 airflow webserver -p 8080 -D 重新启动 Web 服务器。


你知道如何修复浏览器的UI问题吗? - Eric Bellet
@EricBellet 对我来说,airflow list_dags 是一个快速解决方法,我不知道这个问题的根本原因。 - samu
3
是的。使用airflow webserver -p 8080 -D重新启动UI,这是另一个快速修复方案。 - Eric Bellet
3
有时候这需要一些时间才能生效。刚刚我有一个经历,按照这个答案中的所有说明执行完了,但是新的 DAG 在界面上出现大约还需要 3 分钟的时间。也许我会在某个时间点挖掘配置设置,看看是否可以调整刷新频率。 - Stephen
我有一个DAG出现了错误,但是错误没有传播到UI,而是DAG根本没有显示出来。运行airflow list_dags命令可以让我看到错误并进行调试。我正在使用较旧版本的Airflow。 - ChristopherTull
16
尝试使用Airflow 2时,请尝试运行airflow dags list命令。 - Requin

24

我有同样的问题。为了解决,我需要运行调度程序。

airflow scheduler

如果没有这个命令,我看不到我的新DAG。 顺便说一下:UI显示了与该问题相关的警告:

调度程序似乎未运行。 上次收到心跳信号是9秒钟前。 DAG列表可能不会更新,并且新任务将不会被安排。


23
我们需要澄清几件事情:
  1. 你绝不需要自己运行DAG文件(除非你正在为语法错误测试它)。这是调度程序/执行程序的工作。
  2. 要使DAG文件可被调度程序(以及Web服务器)看到,您需要将其添加到dags_folder中(在airflow.cfg中指定。默认情况下,它是$AIRFLOW_HOME/dags子文件夹)。

Airflow Scheduler默认每5分钟检查一次dags_folder以获取新的DAG文件(由airflow.cfg中的dag_dir_list_interval控制)。因此,如果您刚刚添加了一个新文件,则有两个选项:

  1. 重启调度程序
  2. 等待当前调度程序进程捕获新的DAG。

1
对我来说,问题就在这里——我没有运行调度程序来获取新的DAG。谢谢! - Doug F

13
你在作业页面看到的ScheduleJob是计划程序的入口,而不是被调度的dag。
奇怪的是你的$AIRFLOW_HOME/dags目录是空的。所有的dag必须存放在$AIRFLOW_HOME/dags目录中(特别是在你的airflow.cfg文件中配置的dags目录中)。看起来你没有将实际的dag存储在正确的目录(即dags目录)中。
另外,有时候你也需要重启Web服务器才能显示dag(尽管这似乎不是这里的问题)。

1
我需要在$AIRFLOW_HOME/dags文件夹中运行问题中提到的脚本吗? - Rusty
是的,没错。所有的DAG定义(Python文件初始化DAG - 在上面的例子中,dag = DAG(...)这一行)应该在airflow.cfg文件中配置的DAGs目录的全局范围内。 - Vineet Goel

8

请检查 airflow.cfg 文件中的 dags_folder 变量。如果您使用了虚拟环境,则需要在主项目目录下运行命令 export AIRFLOW_HOME=$(pwd)。请注意,运行 export AIRFLOW_HOME=$(pwd) 命令时,您的 DAG 必须位于项目目录下的 dags 子目录中。


执行 export AIRFLOW_HOME=/absolute/path/to/airflow,然后运行 airflow dags list-import-errors 命令,发现在 airflow v2.4.0 上有一个 Python 语法错误导致我的 DAG 没有出现在列表中。 - Nicholas Hansen-Feruch

2

我刚遇到了同样的问题。Airflow 建议我使用以下命令来评估我的 DAG:

Error: Failed to load all files. For details, run `airflow dags list-import-errors`

这只是我路上的一个逗号 :)


1
在我的情况下,DAG恰好是我复制并粘贴以检查docker-compose安装中正确的卷映射的默认DAG之一。事实证明,虽然Web界面没有显示错误,但命令行airflow dag list返回错误:Error: Failed to load all files. For details, run airflow dags list-import-errors. 这就是解决方案的关键:
  • DAG未被添加,因为它是已经加载的DAG的副本。

1

我遇到了同样的问题。我下载了两次Airflow,一次没有使用sudo,一次使用了sudo。我正在使用sudo版本,在该版本中,目录位于我的用户路径下。我只需运行airflow命令:export AIRFLOW_HOME =〜/ airflow


1
Airflow使用启发式算法预检查Python文件是否包含图定义。它会检查文件中是否存在字符串“DAG”和“airflow”。如果文件不包含这些单词,Airflow将忽略它。在“Core Concepts / DAGs /”文档的Loading DAGs section中记录了这一点。
自Airflow 2以来,检查是不区分大小写的。自Airflow 1.10.3以来,可以通过dag-discovery-safe-mode配置变量关闭此行为。

0

我遇到了同样的问题。在我的情况下,新DAG的权限不正确。

运行ls -l查看新DAG的权限。对我来说,所有者被列为我自己,而不是默认的airflow用户(在我的情况下应该是root)。

一旦我改变了权限(chown root:root <file_name>),文件立即出现在Web UI中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接