Apache Airflow - 完成时触发/计划DAG重新运行(文件传感器)

时间:2017-06-26 23:22:34

标签: triggers airflow directed-acyclic-graphs

早上好。

我也试图设置DAG

  1. 观看/感知文件以点击网络文件夹
  2. 处理文件
  3. 归档文件
  4. 使用在线教程和stackoverflow我已经能够找到成功实现目标的以下DAG和运算符,但是我希望DAG重新安排或在完成时重新运行,以便开始观察/感知另一个文件

    我尝试设置变量public int maxProfit(int[] prices, int fee) {} 然后设置max_active_runs:1这是重新安排DAG但是开始排队任务并锁定文件。

    欢迎关于如何在archive_task之后重新运行DAG的任何想法?

    由于

    DAG代码

    schedule_interval: timedelta(seconds=5)

    文件传感器操作员

    from airflow import DAG
    from airflow.operators import PythonOperator, OmegaFileSensor, ArchiveFileOperator
    from datetime import datetime, timedelta
    from airflow.models import Variable
    
    default_args = {
        'owner': 'glsam',
        'depends_on_past': False,
        'start_date': datetime.now(),
        'provide_context': True,
        'retries': 100,
        'retry_delay': timedelta(seconds=30),
        'max_active_runs': 1,
        'schedule_interval': timedelta(seconds=5),
    }
    
    dag = DAG('test_sensing_for_a_file', default_args=default_args)
    
    filepath = Variable.get("soucePath_Test")
    filepattern = Variable.get("filePattern_Test")
    archivepath = Variable.get("archivePath_Test")
    
    sensor_task = OmegaFileSensor(
        task_id='file_sensor_task',
        filepath=filepath,
        filepattern=filepattern,
        poke_interval=3,
        dag=dag)
    
    
    def process_file(**context):
        file_to_process = context['task_instance'].xcom_pull(
            key='file_name', task_ids='file_sensor_task')
        file = open(filepath + file_to_process, 'w')
        file.write('This is a test\n')
        file.write('of processing the file')
        file.close()
    
    
    proccess_task = PythonOperator(
        task_id='process_the_file', 
        python_callable=process_file,
        provide_context=True,
        dag=dag
    )
    
    archive_task = ArchiveFileOperator(
        task_id='archive_file',
        filepath=filepath,
        archivepath=archivepath,
        dag=dag)
    
    sensor_task >> proccess_task >> archive_task
    

2 个答案:

答案 0 :(得分:7)

Dmitris方法运作良好。

我也在我的阅读设置schedule_interval=None中找到了,然后使用TriggerDagRunOperator同样工作

trigger = TriggerDagRunOperator(
    task_id='trigger_dag_RBCPV99_rerun',
    trigger_dag_id="RBCPV99_v2",
    dag=dag)

sensor_task >> proccess_task >> archive_task >> trigger

答案 1 :(得分:4)

设置schedule_interval=None并使用airflow trigger_dag中的BashOperator命令在上一个完成时启动下一个执行。

trigger_next = BashOperator(task_id="trigger_next", 
           bash_command="airflow trigger_dag 'your_dag_id'", dag=dag)

sensor_task >> proccess_task >> archive_task >> trigger_next

您可以使用相同的airflow trigger_dag命令手动开始首次运行,然后trigger_next任务将自动触发下一个。我们现在在生产中使用它已经好几个月了,它运行得很好。