[英]Airflow backfills and new dag runs
我有一個DAG,自2015年1月1日至今,每天都有“DAG運行”。 DAG中的任務不是“過去依賴”,這意味着在回填期間它們可以按任何日期順序執行。
如果我需要在DAG中回填任務,我使用UI清除所有任務實例(從今天到過去),然后所有DAG運行切換到“運行”狀態,任務從2015年1月1日開始回填到今天。 任務非常耗時,因此即使由多個線程/工作人員並行執行,回填也只能在幾天內完成。
問題是,在回填完成之前,調度程序不會添加明天,后天等新的“DAG運行”,因此我們無法按時計算新天數據。 是否有任何方法可以確定新時代的任務優先級,並在新的一天任務結束后繼續回填?
PS回填也可以使用“氣流回填”CLI完成,但這種方法有其自身的問題,所以現在我對上述回填技術感興趣。
與您的問題的評論類似,我在回填大型數據庫時解決這個問題的方法是讓dag生成器根據connection_created_on
和start_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.