我们有一个DAG,它的第一个任务是将表(A)聚合到暂存表(B)中。 之后,有一个任务将从暂存表(B)读取,然后写入另一个表(C)。
但是,第二个任务在完全更新之前从聚合表(B)中读取,这导致表C具有旧数据或有时为空。气流仍然记录一切成功。
Updating table B is done as (pseudo):
delete all rows;
insert into table b
select xxxx from table A;
Task Concurrency is set as 10
pool size: 5
max_overflow: 10
Using local executor
Redshift似乎有一个提交队列。当提交实际上仍在队列中时,是否可以通过redshift告知其已提交的气流,从而在真正的提交发生之前读取下一个任务?
我们尝试将表B的更新包装在一个事务中为(伪):
begin
delete all rows;
insert into table b
select xxxx from table A;
commit;
但是即使那样也不行。由于某种原因,气流会在第一个任务没有完全完成之前设法启动第二个任务。
更新
事实证明,依赖性存在错误。下游任务正在等待不正确的任务完成。
为将来参考,请不要百分百确定您已检查所有内容。检查并重新检查整个流程。
答案 0 :(得分:0)
您可以通过将-
设置为wait_for_downstream
来实现此目标。
来自https://airflow.apache.org/docs/stable/_api/airflow/operators/index.html:
设置为true时,任务X的实例将等待任务 紧接任务X的上一个实例的下游以完成 成功运行。
您可以在default_dag_args级别或任务(操作员)级别设置此参数。
True