如何使用Airflow在Python函数内部触发运算符?

时间:2018-10-21 13:14:29

标签: airflow

我有以下代码:

def chunck_import(**kwargs):
    ...
    for i in range(1, num_pages + 1):
        start = lower +  chunks * i
        end = start + chunks
        if i>1:
             start = start + 1
        logging.info(start, end)
        if end > max_current:
            end = max_current
        where = 'where orders_id between {0} and {1}'.format(start,end)
        logging.info(where)
        import_orders_products_op = MySqlToGoogleCloudStorageOperator(
            task_id='import_orders_and_upload_to_storage_orders_products_{}'.format(i),
            mysql_conn_id='mysql_con',
            google_cloud_storage_conn_id='gcp_con',
            provide_context=True,
            approx_max_file_size_bytes = 100000000, #100MB per file
            sql = 'import_orders.sql',
            params={'WHERE': where},
            bucket=GCS_BUCKET_ID,
            filename=file_name_orders_products,
            dag=dag)

    start_task_op = DummyOperator(task_id='start_task', dag=dag)

    chunck_import_op = PythonOperator(
        task_id='chunck_import',
        provide_context=True,
        python_callable=chunck_import,
        dag=dag)

    start_task_op >>  chunck_import_op

此代码使用PythonOperator计算MySqlToGoogleCloudStorageOperator所需的运行次数,并创建SQL的WHERE集群,然后需要执行它。

问题是MySqlToGoogleCloudStorageOperator未被执行。

我实际上不能做

chunck_import_op >> import_orders_products_op

如何使MySqlToGoogleCloudStorageOperatorPythonOperator内部执行?

1 个答案:

答案 0 :(得分:1)

我认为在您的for循环结束时,您可能想调用import_orders_products_op.execute(context=kwargs),然后再调用import_orders_products_op.pre_execute(context=kwargs)。这有点复杂,因为它跳过了render_templates()的{​​{1}}调用,并且实际上,如果您改为使用task_instance来放置所有这些任务,则可以调用{{1 }}或task_instance代替,但它们都需要来自dagrun的信息(您可以在python可调用对象的上下文中,例如run中获得这些信息)

查看传递给运算符的内容,就像原样一样,您需要模板化步骤来加载_raw_run_task文件并填写kwargs['dag_run']参数。另外,也可以在可调用函数本身中将文件加载到字符串中,在没有Jinja2的情况下手动替换import_orders.sql部分(及其他任何部分)(或者您可以花时间找出正确的jinja2调用),然后设置WHERE,然后再调用{{ params.WHERE }}import_orders_products_op.sql=the_string_you_loaded