如何在airflow的S3KeySensor中动态添加bucket_key值

时间:2018-02-08 17:16:09

标签: python sensor airflow directed-acyclic-graphs

我试图根据dagrun输入变量设置S3KeySensor的bucket_key。 我有一个dag" dag_trigger"使用TriggerDagRunOperator为dag触发dagrun" dag_triggered"。我试图扩展示例https://github.com/apache/incubator-airflow/blob/master/airflow/example_dags/example_trigger_target_dag.py

所以我想将一个变量发送给触发的dag,并根据变量的值我想在S3KeySensor任务中设置backet_key值。我知道如何在PythonOperator可调用函数中使用sent变量,但我不知道如何在传感器对象上使用它。

dag_trigger dag:

import datetime

from airflow import DAG
from airflow.operators.dagrun_operator import TriggerDagRunOperator


default_args = {
    'owner': 'airflow',
    'start_date': datetime.datetime.now()}

dag = DAG('dag_trigger', default_args=default_args, schedule_interval="@hourly")

def task_1_run(context, dag_run_object):
    sent_variable = '2018_02_19' # not important
    dag_run_object.payload = {'message': sent_variable}
    print "DAG dag_trigger triggered with payload: %s" % dag_run_object.payload)
    return dag_run_object

task_1 = TriggerDagRunOperator(task_id="task_1",
                               trigger_dag_id="dag_triggered",
                               provide_context=True,
                               python_callable=task_1_run,
                               dag=dag)

dag_triggered dag:

import datetime

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.operators.sensors import S3KeySensor


default_args = {
    'owner': 'airflow',
    'start_date': datetime.datetime.now()
}

dag = DAG('dag_triggered', default_args=default_args, schedule_interval=None)

wait_files_to_arrive_task = S3KeySensor(
    task_id='wait_file_to_arrive',
    bucket_key='file_%s' % '', # Here I want to place conf['sent_variable']
    wildcard_match=True,
    bucket_name='test-bucket',
    s3_conn_id='test_s3_conn',
    timeout=18*60*60,
    poke_interval=120,
    dag=dag)

我试图使用dag.get_dagrun获取从DAG对象()的值CONF [' sent_variable&#39]。但是我有疑问如何设置dagrun CREATE_DATE变量(dag_trigger将触发dag_triggered每隔一小时和dag_triggered可以等待更长时间的文件)。

我还尝试创建了wait_files_to_arrive_task上游的P​​ythonOperator。可调用的python函数可以获取有关sent_variable的信息。之后我尝试为bucket_key设置值,如bucket_key = callable_function() - 但我的参数有问题。

而且我也认为全局变量不是好的解决方案。

也许有人有想法可行。

1 个答案:

答案 0 :(得分:2)

无法直接在DAG文件中获取DAG运行conf中的值。如果没有DAG运行它的上下文,这是无法确定的。考虑它的一种方法是当您运行python my_dag.py来测试您的DAG文件是否编译时,它必须初始化所有这些运算符而无需指定执行日期。因此,任何可能因DAG运行而不同的内容都无法直接引用。

因此,您可以将其作为模板值传递,以后在实际运行任务时使用上下文进行渲染。

wait_files_to_arrive_task = S3KeySensor(
    task_id='wait_file_to_arrive',
    bucket_key='file_{{ dag_run.conf["message"] }}',
    ...)

请注意,只会呈现运算符的template_fields中列出的参数。幸运的是有人预料到这一点,bucket_key确实是一个模板字段。