मैंने पिछले कार्यों के परिणाम के आधार पर वर्कफ़्लो बनाने का एक तरीका निकाला है।
मूल रूप से आप जो करना चाहते हैं, उसमें निम्न के साथ दो उप-खंड हैं:
- XCOM एक सूची धक्का (test1.py देख subdag कि पहले निष्पादित हो जाता है में (या कभी क्या आप गतिशील कार्यप्रवाह बाद में बनाने की जरूरत)
def return_list()
)
- अपने दूसरे सबडैग के पैरामीटर के रूप में मुख्य डैग ऑब्जेक्ट को पास करें
- अब यदि आपके पास मुख्य डैग ऑब्जेक्ट है, तो आप इसका उपयोग इसके कार्य उदाहरणों की सूची प्राप्त करने के लिए कर सकते हैं। कार्य इंस्टेंसेस की उस सूची से, आप वर्तमान रन के किसी कार्य को उपयोग करके फ़िल्टर कर सकते हैं
parent_dag.get_task_instances(settings.Session, start_date=parent_dag.get_active_runs()[-1])[-1]
), कोई शायद यहाँ और अधिक फ़िल्टर जोड़ सकता है।
- उस कार्य के उदाहरण के साथ, आप पहले subdag में से एक में dag_id निर्दिष्ट करके मूल्य की आवश्यकता के लिए xcom पुल का उपयोग कर सकते हैं:
dag_id='%s.%s' % (parent_dag_name, 'test1')
- अपने कार्यों को गतिशील बनाने के लिए सूची / मूल्य का उपयोग करें
अब मैंने अपने स्थानीय एयरफ़्लो इंस्टॉलेशन में इसका परीक्षण किया है और यह ठीक काम करता है। मुझे नहीं पता कि अगर xcom पुल के हिस्से में कोई समस्या है, अगर एक ही समय में चल रहे डेग के एक से अधिक उदाहरण हैं, लेकिन तब आप शायद या तो एक अनोखी कुंजी का उपयोग करेंगे या कुछ ऐसा होगा जो विशिष्ट रूप से xcom की पहचान करेगा मूल्य आप चाहते हैं वर्तमान मुख्य डाग का एक विशिष्ट कार्य प्राप्त करने के लिए 100% सुनिश्चित होने के लिए कोई भी 3. कदम का अनुकूलन कर सकता है, लेकिन मेरे उपयोग के लिए यह पर्याप्त रूप से अच्छा प्रदर्शन करता है, मुझे लगता है कि एक को xcom_pull का उपयोग करने के लिए केवल एक कार्य_बिनेंस ऑब्जेक्ट की आवश्यकता है।
इसके अलावा मैं हर निष्पादन से पहले पहले सबडैग के लिए एक्सकॉम को साफ करता हूं, बस यह सुनिश्चित करने के लिए कि मुझे गलती से कोई गलत मूल्य नहीं मिलता है।
मैं समझाने में बहुत बुरा हूँ, इसलिए मुझे आशा है कि निम्नलिखित कोड सब कुछ स्पष्ट कर देगा:
test1.py
from airflow.models import DAG
import logging
from airflow.operators.python_operator import PythonOperator
from airflow.operators.postgres_operator import PostgresOperator
log = logging.getLogger(__name__)
def test1(parent_dag_name, start_date, schedule_interval):
dag = DAG(
'%s.test1' % parent_dag_name,
schedule_interval=schedule_interval,
start_date=start_date,
)
def return_list():
return ['test1', 'test2']
list_extract_folder = PythonOperator(
task_id='list',
dag=dag,
python_callable=return_list
)
clean_xcoms = PostgresOperator(
task_id='clean_xcoms',
postgres_conn_id='airflow_db',
sql="delete from xcom where dag_id='{{ dag.dag_id }}'",
dag=dag)
clean_xcoms >> list_extract_folder
return dag
test2.py
from airflow.models import DAG, settings
import logging
from airflow.operators.dummy_operator import DummyOperator
log = logging.getLogger(__name__)
def test2(parent_dag_name, start_date, schedule_interval, parent_dag=None):
dag = DAG(
'%s.test2' % parent_dag_name,
schedule_interval=schedule_interval,
start_date=start_date
)
if len(parent_dag.get_active_runs()) > 0:
test_list = parent_dag.get_task_instances(settings.Session, start_date=parent_dag.get_active_runs()[-1])[-1].xcom_pull(
dag_id='%s.%s' % (parent_dag_name, 'test1'),
task_ids='list')
if test_list:
for i in test_list:
test = DummyOperator(
task_id=i,
dag=dag
)
return dag
और मुख्य कार्य:
test.py
from datetime import datetime
from airflow import DAG
from airflow.operators.subdag_operator import SubDagOperator
from subdags.test1 import test1
from subdags.test2 import test2
DAG_NAME = 'test-dag'
dag = DAG(DAG_NAME,
description='Test workflow',
catchup=False,
schedule_interval='0 0 * * *',
start_date=datetime(2018, 8, 24))
test1 = SubDagOperator(
subdag=test1(DAG_NAME,
dag.start_date,
dag.schedule_interval),
task_id='test1',
dag=dag
)
test2 = SubDagOperator(
subdag=test2(DAG_NAME,
dag.start_date,
dag.schedule_interval,
parent_dag=dag),
task_id='test2',
dag=dag
)
test1 >> test2