我在Airflow 1.9上具有以下代码:
import_op = MySqlToGoogleCloudStorageOperator(
task_id='import',
mysql_conn_id='oproduction',
google_cloud_storage_conn_id='gcpm',
provide_context=True,
approx_max_file_size_bytes = 100000000, #100MB per file
sql = 'import.sql',
params={'next_to_import': NEXT_TO_IMPORT, 'table_name' : TABLE_NAME},
bucket=GCS_BUCKET_ID,
filename=file_name_orders,
dag=dag)
为什么会产生:
/usr/local/lib/python2.7/dist-packages/airflow/models.py:2160: PendingDeprecationWarning:无效的参数传递给 MySqlToGoogleCloudStorageOperator。支持传递此类参数 将在Airflow 2.0中删除。无效的参数为: *参数:() ** kwargs:{'provide_context':True} category = PendingDeprecationWarning
provide_context
有什么问题?据我所知,params
的使用是必需的。
答案 0 :(得分:3)
provide_context
对于params
不需要。
params
参数(dict
类型)可以传递给任何运算符。
您通常将provide_context
与PythonOperator
,BranchPythonOperator
一起使用。一个很好的例子是https://airflow.readthedocs.io/en/latest/howto/operator.html#pythonoperator。
MySqlToGoogleCloudStorageOperator
没有参数provide_context
,因此它在**kwargs
中传递,您会收到“弃用”警告。
如果您检查PythonOperator
的文档字符串中是否有provide_context
:
如果设置为true,Airflow将传递一组关键字参数,这些参数可以 在您的功能中使用。这套kwarg完全对应于 您可以在Jinja模板中使用的内容。为此,您需要 在函数头中定义
**kwargs
。
如果您检查源代码,它具有以下代码:
if self.provide_context:
context.update(self.op_kwargs)
context['templates_dict'] = self.templates_dict
self.op_kwargs = context
因此,简单来说,它将带有templates_dict
的以下字典传递给python_callable
中的函数传递:
{
'END_DATE': ds,
'conf': configuration,
'dag': task.dag,
'dag_run': dag_run,
'ds': ds,
'ds_nodash': ds_nodash,
'end_date': ds,
'execution_date': self.execution_date,
'latest_date': ds,
'macros': macros,
'params': params,
'run_id': run_id,
'tables': tables,
'task': task,
'task_instance': self,
'task_instance_key_str': ti_key_str,
'test_mode': self.test_mode,
'ti': self,
'tomorrow_ds': tomorrow_ds,
'tomorrow_ds_nodash': tomorrow_ds_nodash,
'ts': ts,
'ts_nodash': ts_nodash,
'yesterday_ds': yesterday_ds,
'yesterday_ds_nodash': yesterday_ds_nodash,
}
因此可以在函数中使用它,如下所示:
def print_context(ds, **kwargs):
pprint(kwargs)
ti = context['task_instance']
exec_date = context['execution_date']
print(ds)
return 'Whatever you return gets printed in the logs'
run_this = PythonOperator(
task_id='print_the_context',
provide_context=True,
python_callable=print_context,
dag=dag,
)