Airflow 气流:如何模板化或将Python可调用函数的输出作为参数传递给其他任务?
我不熟悉气流,正在努力使我的ETL管道更加可重用。最初,我有几行顶级代码,可以根据几个用户输入参数确定作业的开始,但通过多次搜索,我发现这会触发,在截断表时会导致一些不必要的行为 现在,我正在研究将这个顶级代码包装到一个Python可调用代码中,这样在刷新时它是安全的,但是我不确定将输出传递给其他任务的最佳方式。我的代码要点如下:Airflow 气流:如何模板化或将Python可调用函数的输出作为参数传递给其他任务?,airflow,apache-airflow-xcom,Airflow,Apache Airflow Xcom,我不熟悉气流,正在努力使我的ETL管道更加可重用。最初,我有几行顶级代码,可以根据几个用户输入参数确定作业的开始,但通过多次搜索,我发现这会触发,在截断表时会导致一些不必要的行为 现在,我正在研究将这个顶级代码包装到一个Python可调用代码中,这样在刷新时它是安全的,但是我不确定将输出传递给其他任务的最佳方式。我的代码要点如下: def get_job_dts(): #Do something to determine the appropriate job_start_dt a
def get_job_dts():
#Do something to determine the appropriate job_start_dt and job_end_dt
#Package up as a list as inputs to other PythonCallables using op_args
job_params = [job_start_dt, job_end_dt]
return job_params
t0 = PythonOperator(
task_id = 'get_dates'
python_callable = get_job_dts
dag=dag
)
t1 = PythonOperator(
task_id = 'task_1'
,python_callable=first_task
,op_args=job_params #<-- How do I send job_params to op_args??
,dag=dag
)
t0 >> t1
def get_job_dts():
#做点什么来确定合适的作业开始和结束
#使用op_args打包为列表,作为其他pythonCallable的输入
作业参数=[作业开始,作业结束]
返回作业参数
t0=蟒蛇算子(
任务\u id='获取\u日期'
python\u callable=get\u job\u dts
dag=dag
)
t1=蟒蛇算子(
task_id='task_1'
,python_callable=第一个任务
,op_args=job_params#>t1
我到处搜索,听到有人提到jinja模板、变量或XCom,但我对如何实现它还不清楚。有没有人能举个例子,让我看看如何将该列表保存到一个变量中,以供我的其他任务使用?最好的方法是在get\u job\u dts中将您的值推送到XCom中,然后从m Xcom在第一个任务中
def get_job_dts(**kwargs):
#Do something to determine the appropriate job_start_dt and job_end_dt
#Package up as a list as inputs to other PythonCallables using op_args
job_params = [job_start_dt, job_end_dt]
# Push job_params into XCom
kwargs['ti'].xcom_push(key='job_params', value=job_params)
return job_params
def first_task(ti, **kwargs):
# Pull job_params into XCom
job_params = ti.xcom_pull(key='job_params')
# And then do the rest
t0 = PythonOperator(
task_id = 'get_dates'
python_callable = get_job_dts
dag=dag
)
t1 = PythonOperator(
task_id = 'task_1',
provide_context=True,
python_callable=first_task,
op_args=job_params,
dag=dag
)
t0 >> t1
如前所述,XCOM是一个不错的选择。我的实现是面向教程的,在教程中,我隐式地从PythonCallable中的返回值自动执行推送
我仍然对传入(ti,**kwargs)和使用(**上下文)到正在拉取的函数的区别感到困惑。另外,“ti”从何而来
请澄清
def get_job_dts(**kwargs):
#Do something to determine the appropriate job_start_dt and job_end_dt
#Package up as a list as inputs to other PythonCallables using op_args
job_params = [job_start_dt, job_end_dt]
# Automatically pushes to XCOM, refer to: Airflow XCOM tutorial: https://airflow.apache.org/concepts.html?highlight=xcom#xcoms
return job_params
def first_task(**context):
# Change task_ids to whatever task pushed the XCOM vars you need, rest are standard notation
job_params = job_params = context['task_instance'].xcom_pull(task_ids='get_dates')
# And then do the rest
t0 = PythonOperator(
task_id = 'get_dates'
python_callable = get_job_dts
dag=dag
)
t1 = PythonOperator(
task_id = 'task_1',
provide_context=True,
python_callable=first_task,
dag=dag
)
t0 >> t1
正如您提到的动态更改任务开始时间和结束时间,我认为您需要的是创建动态dag,而不仅仅是将参数传递给dag。特别是,在不更改dag名称的情况下更改开始时间和间隔将导致意外的结果,强烈建议不要这样做。因此,您可以参考这一点来查看此策略是否正确可以帮忙。谢谢您的回复!您能解释一下“ti”在哪里吗来自?我也看到人们使用**上下文作为参数,**kwargs==**context?最后,所有实现XCOM的DAG(无论是拉还是推)都需要providecontext=True吗?还是只有DAG才需要拉?这段代码在语法上不正确且不可复制,你能提供一个完整的示例吗?我认为你不能通过我的任务nstance明确表示,但您应该使用
**kwargs
或**context
(这是相同的,context只是kwargs的另一个名称)与provide_context=True
保持一致。有关上下文的结构,请参见。Airflow在其github上有一些很好的示例。我相信您的回答是正确的。