Airflow 以编程方式将任务实例状态设置为已跳过
我有一个循环创建任务的列表。列表的大小是静态的Airflow 以编程方式将任务实例状态设置为已跳过,airflow,Airflow,我有一个循环创建任务的列表。列表的大小是静态的 for counter, account_id in enumerate(ACCOUNT_LIST): task_id = f"bash_task_{counter}" if account_id: trigger_task = BashOperator( task_id=task_id,
for counter, account_id in enumerate(ACCOUNT_LIST):
task_id = f"bash_task_{counter}"
if account_id:
trigger_task = BashOperator(
task_id=task_id,
bash_command="echo hello there",
dag=dag)
else:
trigger_task = BashOperator(
task_id=task_id,
bash_command="echo hello there",
dag=dag)
trigger_task.status = SKIPPED # is there way to somehow set status of this to skipped instead of having a branch operator?
trigger_task
我手动尝试了此操作,但无法跳过此任务:
start = DummyOperator(task_id='start')
task1 = DummyOperator(task_id='task_1')
task2 = DummyOperator(task_id='task_2')
task3 = DummyOperator(task_id='task_3')
task4 = DummyOperator(task_id='task_4')
start >> task1
start >> task2
try:
start >> task3
raise AirflowSkipException
except AirflowSkipException as ase:
log.error('Task Skipped for task3')
try:
start >> task4
raise AirflowSkipException
except AirflowSkipException as ase:
log.error('Task Skipped for task4')
是,您需要
提出气流SkipException
从airflow.exceptions导入airflowskipeexception
上升气流速度异常
有关更多信息,请参见是,您需要
提出气流SkipException
从airflow.exceptions导入airflowskipeexception
上升气流速度异常
有关更多信息,请参见“每个DAG有固定数量的任务要执行”。这真的很好,而且还计划了在不降低下游系统性能的情况下,您的系统应该处理多少最大并行任务。此外,拥有固定数量的任务使其在web UI中可见,并指示它们是执行还是跳过 在下面的代码中,我用
None
项初始化了列表,然后根据数据库返回的数据用值更新列表。在python\u callable
函数中,检查account\u id
是否为None
,然后引发airflowskipeexception
,否则执行该函数。在UI中,任务是可见的,并指示是执行还是跳过(意味着没有帐户\u id
)
每个DAG有固定数量的任务要执行。这真的很好,而且还计划了在不降低下游系统性能的情况下,您的系统应该处理多少最大并行任务。此外,拥有固定数量的任务使其在web UI中可见,并指示它们是执行还是跳过 在下面的代码中,我用
None
项初始化了列表,然后根据数据库返回的数据用值更新列表。在python\u callable
函数中,检查account\u id
是否为None
,然后引发airflowskipeexception
,否则执行该函数。在UI中,任务是可见的,并指示是执行还是跳过(意味着没有帐户\u id
)
这不起作用。请参阅手动添加任务的更新问题Shi alltej。。。当您将所使用的代码置于DAG级别时,它不会被气流执行。在执行的
task_实例
期间,需要内联raise AirflowSkipException
或执行代码的一部分。因此,它应该在您打算跳过的任务的操作员执行方法中。这不起作用。请参阅手动添加任务的更新问题Shi alltej。。。当您将所使用的代码置于DAG级别时,它不会被气流执行。在执行的task_实例
期间,需要内联raise AirflowSkipException
或执行代码的一部分。因此,它应该在您要跳过的任务的操作员执行方法中。@alltej您混淆了它<代码>气流SkipeException必须在操作员代码中提出(而不是在您的DAG
定义代码中提出)。你想在这里做什么还不清楚;但也不可能(在DAG定义期间不能标记任务的状态,因为它尚未运行)。要以预定义的方式跳过任务,您可以[1](更容易)创建并有条件地将它们连接在一起[2],或者使用BranchPythonOperator
/ShortCircuitOperator
您有代码示例吗?我正试图避免使用BranchOperator,因为它看起来太像了overkill@alltej你把它弄糊涂了<代码>气流SkipeException必须在操作员代码中提出(而不是在您的DAG
定义代码中提出)。你想在这里做什么还不清楚;但也不可能(在DAG定义期间不能标记任务的状态,因为它尚未运行)。要以预定义的方式跳过任务,您可以[1](更容易)创建并有条件地将它们连接在一起[2],或者使用BranchPythonOperator
/ShortCircuitOperator
您有代码示例吗?我试图避免使用BranchOperator,因为它看起来太过复杂了
def execute(account_id):
if account_id:
print(f'************Executing task for account_id:{account_id}')
else:
raise AirflowSkipException
def create_task(task_id, account_id):
return PythonOperator(task_id=task_id,
python_callable=execute,
op_args=[account_id])
list_from_dbhook = [1, 2, 3] # dummy list. Get records using DB Hook
# Need to have some fix size. Need to allocate fix resources or # of tasks.
# Having this fixed number of tasks will make this tasks to be visible in UI instead of being purely dynamic
record_size_limit = 5
ACCOUNT_LIST = [None] * record_size_limit
for index, account_id_val in enumerate(list_from_dbhook):
ACCOUNT_LIST[index] = account_id_val
for idx, acct_id in enumerate(ACCOUNT_LIST):
task = create_task(f"task_{idx}", acct_id)
task