以前的Python运算符的气流访问变量

时间:2019-08-15 15:35:47

标签: airflow

我是Airflow的新手,目前正在构建一个DAG,它将执行一个PythonOperator,一个BashOperator,然后执行另一个结构如下的PythonOperator:

def authenticate_user(**kwargs):
    ...
    list_prev = [...]

AUTHENTICATE_USER = PythonOperator(
        task_id='AUTHENTICATE_USER',
        python_callable=authenticate_user,
        provide_context=True,
        dag=dag)

CHANGE_ROLE = BashOperator(
        task_id='CHANGE_ROLE',
        bash_command='...',
        dag=dag)

def calculations(**kwargs):
    list_prev
    ...

CALCULATIONS = PythonOperator(
    task_id='CALCULATIONS',
    python_callable=calculations,
    provide_context=True,
    dag=dag)

我的问题是,我在执行BashOperator(CHANGE_ROLE)之后在第一个PythonOperator(AUTHENTICATE_USER)中创建一个变量列表,稍后在第二个PythonOperator(CALCULATIONS)中使用。我有办法将创建的列表结转到当前DAG中的其他PythonOperators吗?

谢谢

1 个答案:

答案 0 :(得分:2)

我可以想到3种可能的方式(为避免与Airflow's concept of Variable混淆,我将要在任务之间共享的数据称为value s)

  1. Airflow XCOMsPush来自AUTHENTICATE_USER任务的值,pull来自您的CALCULATIONS任务。您可以分别发布和访问每个值,也可以将它们全部包装到Python dict或列表中(最好是减少数据库读写)。

  2. 外部系统:将第一个任务的值持久化到某些外部系统(例如数据库,文件或S3对象)中,并在需要时从下游任务访问它们

  3. Airflow Variables:这是上面第(2)点的一种特殊情况(因为变量存储在Airflow的后端meta-db中)。您可以通过利用基础的SQLAlchemy模型来以编程方式创建,修改或删除变量。有关提示,请参见this