对Airflow进行了一般性查询
是否可以根据另一个dag文件的时间表安排dag文件。
例如,如果我有2个dag,即dag1和dag2。我试图看看每次dag1成功时我是否可以运行dag2,否则dag2不会运行。这在Airflow中是否可行。
答案 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定义为以下之一:
'@once'
,'@hourly'
等None
* *对于null计划用例,DAG不会自动运行,必须以某种方式触发。
触发DAG的一种方法是通过SubDagOperator
使用SubDAGs。我认为SubDAG可能是您用例的最佳选择,因为您希望第一个DAG成功后触发第二个DAG。如文档中所述,SubDAG存在一些细微差别。
如果任务前面的任务成功,SubDAG会自动运行,如果前面的任务失败则会跳过/跳过假设您使用ALL_SUCCESS
或ONE_SUCCESS
作为trigger rule。
[这种方法有点类似于TriggerDagRunOperator运算符,这是@ andscoop答案中详述的另一个选项。]
触发DAG的另一种方法是使用external trigger。在this answer。
中更详细地讨论了这个想法