气流过时警告传递了无效的参数

时间:2018-11-11 12:27:56

标签: airflow

我在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的使用是必需的。

1 个答案:

答案 0 :(得分:3)

provide_context对于params不需要。

params参数(dict类型)可以传递给任何运算符。

您通常将provide_contextPythonOperatorBranchPythonOperator一起使用。一个很好的例子是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,
)