Airflow 如何将变量从一个操作符任务传递到另一个操作符任务
我正试图找出将变量从一个BashOperator任务传递到另一个任务的最通用/有效的方法。我提出了一个解决方案,将第一个BashOperator任务的输出推送到xcom。然后,PythonOperator任务将该字符串解析为键值对,然后将键值对推送到xcom。最后,这些k-v对可以被第二个bash操作符任务提取和使用 我想听听更有经验的气流用户的意见,这种方法是过于复杂还是可以Airflow 如何将变量从一个操作符任务传递到另一个操作符任务,airflow,apache-airflow-xcom,Airflow,Apache Airflow Xcom,我正试图找出将变量从一个BashOperator任务传递到另一个任务的最通用/有效的方法。我提出了一个解决方案,将第一个BashOperator任务的输出推送到xcom。然后,PythonOperator任务将该字符串解析为键值对,然后将键值对推送到xcom。最后,这些k-v对可以被第二个bash操作符任务提取和使用 我想听听更有经验的气流用户的意见,这种方法是过于复杂还是可以 from airflow import DAG from airflow.operators.bash_operato
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
import datetime as dt
from airflow.utils.dates import days_ago
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': dt.datetime(2019,10,14,10,0),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': dt.timedelta(minutes=1),
}
dag = DAG('communication-between-tasks-v1',
catchup=False,
default_args=default_args,
schedule_interval='*/5 * * * *')
def parse_function(**context):
ti = context['ti']
msg = ti.xcom_pull('start_task')
parsed_output_parameters = dict([x.split('=') for x in msg.split()])
# Option1: Dictionary parsed from the string is pushed to xcom
ti.xcom_push(key='parameters', value=parsed_output_parameters)
# Option2: We can push every key value separately
for k, v in parsed_output_parameters.items():
ti.xcom_push(key=k, value=v)
start_task = BashOperator(
task_id='start_task',
bash_command='echo "FILE1=file1.h5 FILE2=file2.txt VARIABLE=400"',
xcom_push=True,
dag=dag)
parse = PythonOperator(
task_id='parse',
python_callable=parse_function,
provide_context=True,
dag=dag
)
end_task = BashOperator(
task_id='end_task',
bash_command='echo start_task params: {{ ti.xcom_pull(task_ids="parse",
key="parameters")["FILE1"] }} \
{{ ti.xcom_pull(task_ids="parse", key="FILE2") }}',
dag=dag
)
start_task >> parse >> end_task
Xcom在传递的数据量非常小的情况下工作得最好&应该节约使用(因为所有数据都写入数据库)
如果您有两个不同的BashOperator任务&您希望将数据从一个任务传递到另一个任务,为什么不在第一个任务中将输出写入文件,然后在第二个任务中将其读入?(您可以在第二个BashOperator任务中包含一行,用于在读取文件内容后验证文件是否包含数据&
rm
该文件。)Xcom最适合于传输的数据量非常小的情况,并且应谨慎使用(因为它都写入了数据库)
如果您有两个不同的BashOperator任务&您希望将数据从一个任务传递到另一个任务,为什么不在第一个任务中将输出写入文件,然后在第二个任务中将其读入?(您可以在第二个BashOperator任务中包含一行,用于在读取文件内容后验证文件是否包含数据&rm
文件。)