调度dag在Airflow中运行

时间:2018-05-30 18:09:47

标签: airflow airflow-scheduler

对Airflow进行了一般性查询

是否可以根据另一个dag文件的时间表安排dag文件。

例如,如果我有2个dag,即dag1和dag2。我试图看看每次dag1成功时我是否可以运行dag2,否则dag2不会运行。这在Airflow中是否可行。

3 个答案:

答案 0 :(得分:4)

您需要在#include<iostream> #include<cstdio> #include<vector> #include<cstring> #include<stack> using namespace std; vector<pair<int, int> > graph[30009]; vector<pair<int, int> >:: iterator it; long long int far; int visit[30001], last; void DFS(int vertex, long long int edge) { if(edge > far){ far = edge; last = vertex; } /*for(int i = 0; i < graph[vertex].size(); i++){ int node = graph[vertex][i].first; int weight = graph[vertex][i].second; if(visit[node] == 0){ visit[node] = 1; DFS(node, edge+weight); } }*/ for(it = graph[vertex].begin(); it != graph[vertex].end(); it++){ int node = it->first; int weight = it->second; if(visit[node] == 0){ visit[node] = 1; DFS(node, edge+weight); } } return; } int main() { int T, n,u,v,w; scanf("%d", &T); for(int i = 1; i <= T; i++){ far = 0; memset(visit, 0, sizeof(visit)); scanf("%d", &n); for(int j = 0; j < 30001; j++) graph[j].clear(); for(int j = 1; j < n; j++){ scanf("%d%d%d", &u, &v, &w); graph[u].push_back(make_pair(v,w)); graph[v].push_back(make_pair(u,w)); } visit[0] = 1; DFS(0, 0); memset(visit, 0, sizeof(visit)); visit[last] = 1; DFS(last, 0); printf("Case %d: %lld\n", i, far); } return 0; } 的末尾添加TriggerDagRunOperator,并将dag1的时间表设置为dag2

此外,如果要处理None输出的多个案例,可以添加BranchPythonOperator以根据其输出创建多个路径。例如,您可以将其设置为在成功时执行TriggerDagRunOperator,或者松弛“警告!DAG1中的任务失败!”如果抛出错误(或者你想要构建的任何其他逻辑),则使用SlackAPIPostOperator

如果您不关心多种结果,您也可以在TriggerDagRunOperator之前使用ShortCircuitOperator,以防止它根据dag1输出运行。

答案 1 :(得分:3)

是。您应该使用TriggerDagRunOperator在dag1的末尾包含一个任务。确保此任务具有trigger rule,只有在上游所有其他任务都成功时才允许它运行。

另一个答案建议使用子标记,这些子标记可能会在复杂的Airflow环境中使其不太理想。

答案 2 :(得分:3)

必须将DAG schedule interval定义为以下之一:

  • cron schedule
  • 预设,例如'@once''@hourly'
  • None *

*对于null计划用例,DAG不会自动运行,必须以某种方式触发。

触发DAG的一种方法是通过SubDagOperator使用SubDAGs。我认为SubDAG可能是您用例的最佳选择,因为您希望第一个DAG成功后触发第二个DAG。如文档中所述,SubDAG存在一些细微差别。

如果任务前面的任务成功,SubDAG会自动运行,如果前面的任务失败则会跳过/跳过假设您使用ALL_SUCCESSONE_SUCCESS作为trigger rule

[这种方法有点类似于TriggerDagRunOperator运算符,这是@ andscoop答案中详述的另一个选项。]

触发DAG的另一种方法是使用external trigger。在this answer

中更详细地讨论了这个想法