确定DAG是否正在执行

时间:2018-08-03 20:38:33

标签: airflow directed-acyclic-graphs

我正在使用带有自定义SFTPOperator的Airflow 1.9.0。我的DAG中包含用于轮询SFTP站点以查找新文件的代码。如果找到任何文件,那么我将为动态创建的任务创建自定义任务ID,并检索/删除文件。

directory_list = sftp_handler('sftp-site', None, '/', None, SFTPToS3Operation.LIST) for file_path in directory_list: ... SFTP code that GET's the remote files

那部分工作正常。似乎气流Web服务器和气流调度程序都每秒对所有DAG进行一次迭代,并实际上在运行检索directory_list的代码。这意味着我要大约2秒钟访问SFTP站点以进行身份​​验证并提取文件列表。我希望有一些条件代码仅在DAG实际上正在运行时才能执行。

当SFTP站点使用密码身份验证时,我连接的次数确实不是问题。一个站点需要密钥认证,并且如果在短时间内认证失败太多,则该帐户将被锁定。在我的测试过程中,由于我仍在努力寻找原因,这似乎偶尔会发生。

但是,如果仅在安排DAG执行或手动执行时进行身份验证,则不会有问题。在没有计划的情况下,花大量时间连接到SFTP站点似乎也很浪费。

我看过一篇可以检查任务是否正在执行的帖子,但这并不理想,因为我不得不创建一个长时间运行的任务,用掉我不需要的资源,仅执行该任务测试。关于如何实现这一目标有什么想法?

1 个答案:

答案 0 :(得分:1)

您有一个很好的Airflow用例(从SFTP到_____批处理作业),但是Airflow在您尝试使用动态DAG时并不适用。

顶级DAG代码和计划程序循环

正如您所注意到的,DAG中的任何顶级代码都是在每个调度程序循环中执行的。换句话说,每次调度程序循环处理DAG目录中的文件时,它都会解释DAG文件中的所有代码。任务或操作员中没有的任何内容都将立即被解释/执行。这会对调度程序以及您要调用的任何外部系统造成不必要的压力。

动态DAG和Airflow用户界面

Airflow无法很好地通过UI处理动态DAG。这主要是因为气流DAG状态未存储在数据库中。 DAG视图和历史记录是根据在任何给定时刻已解释的DAG文件中存在的内容呈现的。我个人希望以后通过某种形式的DAG版本控制看到这种变化。

在动态DAG中,您可以从DAG中添加和删除任务。

动态添加任务

在为DAG运行添加任务时,将使其(在UI中)显示所有DAG 在该任务从未执行完所有任务之前运行。将具有None状态 并且DAG运行将根据结果设置为successfailed DAG运行的时间。

动态删除任务

如果动态DAG曾经删除任务,那么您将无法查看DAG的历史记录。例如,如果在前20个DAG运行中使用task_x运行DAG,但随后将其删除,则它将在UI中显示,直到将其重新添加到DAG中。

幂等和气流 当DAG运行为idempotent时,气流最有效。这意味着无论您何时运行DAG Run,或运行多少次,重新运行DAG Run都应具有相同的影响。气流中的动态DAG通过向先前的DAG运行中添加和删除任务来打破幂等性,因此重新运行的结果不相同。

解决方案

前进至少有两个选择

1。)继续动态地构建SFTP DAG,但是创建另一个DAG,将可用的SFTP文件写入本地文件(如果使用分布式执行程序,则为 not )(或使用Variable) (这将导致对Airflow DB的更多读取),并从中动态构建DAG。

2。)重载SFTPOperator以获取文件列表,以便在单个任务运行中处理存在的每个文件。这将使DAG成为幂等,并且您将通过日志维护准确的历史记录。

对于扩展的解释,我深表歉意,但是您谈到的是Airflow的一个粗糙之处,我认为对当前问题进行概述是适当的。

相关问题