我是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吗?
谢谢
答案 0 :(得分:2)
我可以想到3种可能的方式(为避免与Airflow's concept of Variable
混淆,我将要在任务之间共享的数据称为value
s)
Airflow XCOM
s:Push来自AUTHENTICATE_USER
任务的值,pull来自您的CALCULATIONS
任务。您可以分别发布和访问每个值,也可以将它们全部包装到Python dict或列表中(最好是减少数据库读写)。
外部系统:将第一个任务的值持久化到某些外部系统(例如数据库,文件或S3对象)中,并在需要时从下游任务访问它们
Airflow Variable
s:这是上面第(2)点的一种特殊情况(因为变量存储在Airflow的后端meta-db中)。您可以通过利用基础的SQLAlchemy
模型来以编程方式创建,修改或删除变量。有关提示,请参见this。