即使 DAG 未运行,气流变量也会更新

时间:2021-07-05 14:19:28

标签: python variables operators airflow directed-acyclic-graphs

我正在从气流变量中读取一个整数变量,然后每次 DAG 运行时将该值递增 1 并再次将其设置为该变量。

但是在下面的代码之后,每次刷新页面左右时,UI 中的变量都会发生变化。 知道是什么导致了这种行为

/leaders

1 个答案:

答案 0 :(得分:4)

Airflow 每 30 秒处理一次 DAG 文件(min_file_process_interval 设置的默认值)这意味着您拥有的任何顶级代码每 30 秒运行一次,因此 Variable.set("counter", int(counter) + 1) 将导致变量计数器每 30 秒增加 1。

在顶级代码中与变量交互是一种不好的做法(无论值是否增加)。它每 30 秒打开一个到 Metastore 数据库的连接,这可能会导致严重的问题并使数据库不堪重负。

要获取变量的值,您可以使用 Jinja:

e = BashOperator(
    task_id='echo_end_variable',
    bash_command='echo {{ var.value.counter }}',
    dag=dag,
)

这是一种使用变量的安全方式,因为只有在执行操作符时才会检索值。

如果您想将变量的值增加 1,请使用 PythonOpeartor

def increase():
    counter = Variable.get('counter')
    Variable.set("counter", int(counter) + 1)

increase_op = PythonOperator(
    task_id='increase_task',
    python_callable=increase,
    dag=dag)

python callable 只会在 operator 运行时执行。