簡體   English   中英

氣流回填和新的dag運行

[英]Airflow backfills and new dag runs

我有一個DAG,自2015年1月1日至今,每天都有“DAG運行”。 DAG中的任務不是“過去依賴”,這意味着在回填期間它們可以按任何日期順序執行。

如果我需要在DAG中回填任務,我使用UI清除所有任務實例(從今天到過去),然后所有DAG運行切換到“運行”狀態,任務從2015年1月1日開始回填到今天。 任務非常耗時,因此即使由多個線程/工作人員並行執行,回填也只能在幾天內完成。

問題是,在回填完成之前,調度程序不會添加明天,后天等新的“DAG運行”,因此我們無法按時計算新天數據。 是否有任何方法可以確定新時代的任務優先級,並在新的一天任務結束后繼續回填?

PS回填也可以使用“氣流回填”CLI完成,但這種方法有其自身的問題,所以現在我對上述回填技術感興趣。

與您的問題的評論類似,我在回填大型數據庫時解決這個問題的方法是讓dag生成器根據connection_created_onstart_date值創建三個dag(兩個回填和一個正在進行)。

正在進行的dag每小時運行一次,並在connection_created_on值的同一天午夜開始。 然后兩個回填每天從當月的第一個月開始,然后從start_date的第一個月開始每月。 在這種情況下,我知道我們總是希望在本月的第一天開始,並且范圍內長達一個月的數據小到可以拉到一起,所以為了方便起見,我將它分成這三種dag類型。

def create_dag(dag_id,
           schedule,
           db_conn_id,
           default_args,
           catchup=False,
           max_active_runs=3):

    dag = DAG(dag_id,
              default_args=default_args,
              schedule_interval=schedule,
              catchup=catchup,
              max_active_runs=max_active_runs
              )
    with dag:
        kick_off_dag = DummyOperator(task_id='kick_off_dag')

    return dag

db_conn_id = 'my_first_db_conn'
connection_created_on = '2018-05-17 12:30:54.271Z'

hourly_id = '{}_to_redshift_hourly'.format(db_conn_id)
daily_id = '{}_to_redshift_daily_backfill'.format(db_conn_id)
monthly_id = '{}_to_redshift_monthly_backfill'.format(db_conn_id)

start_date = '2005-01-01 00:00:00.000Z'
start_date = datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S.%fZ')
start_date = datetime(start_date.year, start_date.month, 1)

cco_datetime = datetime.strptime(connection_created_on, '%Y-%m-%dT%H:%M:%S.%fZ')
hourly_start_date = datetime(cco_datetime.year, cco_datetime.month, cco_datetime.day)
daily_start_date = hourly_start_date - timedelta(days=(cco_datetime.day-1))
daily_end_date = hourly_start_date - timedelta(days=1)
monthly_start_date = start_date if start_date else hourly_start_date - timedelta(days=365+cco_datetime.day-1)
monthly_end_date = daily_start_date

globals()[hourly_id] = create_dag(hourly_id,
                                  '@hourly',
                                  db_conn_id,
                                  {'start_date': hourly_start_date,
                                   'retries': 2,
                                   'retry_delay': timedelta(minutes=5),
                                   'email': [],
                                   'email_on_failure': True,
                                   'email_on_retry': False},
                                  catchup=True,
                                  max_active_runs=1)

globals()[daily_id] = create_dag(daily_id,
                                 '@daily',
                                 db_conn_id,
                                 {'start_date': daily_start_date,
                                  'end_date': daily_end_date,
                                  'retries': 2,
                                  'retry_delay': timedelta(minutes=5),
                                  'email': [],
                                  'email_on_failure': True,
                                  'email_on_retry': False},
                                 catchup=True)

globals()[monthly_id] = create_dag(monthly_id,
                                   '@monthly',
                                   db_conn_id,
                                   {'start_date': monthly_start_date,
                                    'end_date': monthly_end_date,
                                    'retries': 2,
                                    'retry_delay': timedelta(minutes=5),
                                    'email': [],
                                    'email_on_failure': True,
                                    'email_on_retry': False},
                                   catchup=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM