एक वायुप्रवाह कार्य को कैसे ट्रिगर किया जाए, जब अजगर में डीएजी का उपयोग करके एडब्ल्यूएस एथेना टेबल में एविएबल में नया विभाजन / डेटा?


9

मेरे पास नीचे की तरह एक scenerio है:

  1. ट्रिगर ए Task 1और Task 2केवल जब नया डेटा स्रोत तालिका (एथेना) में उनके लिए उपलब्ध है। टास्क 1 और टास्क 2 के लिए ट्रिगर तब होना चाहिए जब एक दिन में एक नया डेटा समतल हो।
  2. Task 3के पूरा होने पर ही ट्रिगर Task 1औरTask 2
  3. Task 4के पूरा होने पर ही ट्रिगरTask 3

यहां छवि विवरण दर्ज करें

मेरा कोड

from airflow import DAG

from airflow.contrib.sensors.aws_glue_catalog_partition_sensor import AwsGlueCatalogPartitionSensor
from datetime import datetime, timedelta

from airflow.operators.postgres_operator import PostgresOperator
from utils import FAILURE_EMAILS

yesterday = datetime.combine(datetime.today() - timedelta(1), datetime.min.time())

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': yesterday,
    'email': FAILURE_EMAILS,
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5)
}

dag = DAG('Trigger_Job', default_args=default_args, schedule_interval='@daily')

Athena_Trigger_for_Task1 = AwsGlueCatalogPartitionSensor(
    task_id='athena_wait_for_Task1_partition_exists',
    database_name='DB',
    table_name='Table1',
    expression='load_date={{ ds_nodash }}',
    timeout=60,
    dag=dag)

Athena_Trigger_for_Task2 = AwsGlueCatalogPartitionSensor(
    task_id='athena_wait_for_Task2_partition_exists',
    database_name='DB',
    table_name='Table2',
    expression='load_date={{ ds_nodash }}',
    timeout=60,
    dag=dag)

execute_Task1 = PostgresOperator(
    task_id='Task1',
    postgres_conn_id='REDSHIFT_CONN',
    sql="/sql/flow/Task1.sql",
    params={'limit': '50'},
    trigger_rule='all_success',
    dag=dag
)

execute_Task2 = PostgresOperator(
    task_id='Task2',
    postgres_conn_id='REDSHIFT_CONN',
    sql="/sql/flow/Task2.sql",
    params={'limit': '50'},
    trigger_rule='all_success',
    dag=dag
)



execute_Task3 = PostgresOperator(
    task_id='Task3',
    postgres_conn_id='REDSHIFT_CONN',
    sql="/sql/flow/Task3.sql",
    params={'limit': '50'},
    trigger_rule='all_success',
    dag=dag
)

execute_Task4 = PostgresOperator(
    task_id='Task4',
    postgres_conn_id='REDSHIFT_CONN',
    sql="/sql/flow/Task4",
    params={'limit': '50'},
    dag=dag
)



execute_Task1.set_upstream(Athena_Trigger_for_Task1)
execute_Task2.set_upstream(Athena_Trigger_for_Task2)

execute_Task3.set_upstream(execute_Task1)
execute_Task3.set_upstream(execute_Task2)

execute_Task4.set_upstream(execute_Task3)

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है?


क्या आपको इस समाधान से कोई समस्या है?
बर्नार्डो स्टर्न्स ने

@ Bernardostearnsreisen, कभी कभी Task1और Task2पाश में चला जाता है। मेरे लिए एथेना सोर्स टेबल 10 एएम सीईटी में डेटा लोड हो जाता है।
पंकज

एक पाश पर जा रहे हैं, जिसका मतलब है कि airflow कई बार टास्क 1 और टास्क 2 को रिट्रीट करता है जब तक कि वह आगे नहीं बढ़ जाता है?
बर्नार्डो स्टर्न्स

@ बर्नार्डोस्ट्रैरेसेन, यूप बिल्कुल
पंकज

1
@Bernardostearnsreisen, मुझे पता नहीं कैसे इनाम देने के लिए :) :)
पंकज

जवाबों:


1

मेरा मानना ​​है कि आपका प्रश्न दो प्रमुख समस्याओं का समाधान करता है:

  1. schedule_intervalएक स्पष्ट तरीके से कॉन्फ़िगर करने के लिए भूलना इसलिए @daily कुछ ऐसा सेट कर रहा है जिसकी आप अपेक्षा नहीं कर रहे हैं।
  2. जब आप निष्पादन को पूरा करने के लिए किसी बाहरी घटना पर निर्भर होते हैं, तो डाग के निष्पादन को ठीक से ट्रिगर और फिर से कैसे करें

संक्षिप्त उत्तर: समय-समय पर जांच करने के लिए क्रोन जॉब फॉर्मेट के साथ अपना शेड्यूल_ इन्टरवल सेट करें और सेंसर ऑपरेटर्स का उपयोग करें

default_args={
        'retries': (endtime - starttime)*60/poke_time
}
dag = DAG('Trigger_Job', default_args=default_args, schedule_interval='0 10 * * *')
Athena_Trigger_for_Task1 = AwsGlueCatalogPartitionSensor(
     ....
    poke_time= 60*5 #<---- set a poke_time in seconds
    dag=dag)

जहां startimeकिस समय अपने दैनिक कार्य शुरू कर देंगे है, endtimeदिन के पिछली बार जब आप की जाँच करनी चाहिए अगर एक घटना के रूप में असफल रहे और पर चिह्नित करने से पहले किया गया था क्या है poke_timeअंतराल अपने है sensor_operatorअगर घटना हुआ की जाँच करेगा।

जब भी आप अपना डेग सेट करना चाहते हैं तो क्रोन जॉब को स्पष्ट रूप से कैसे संबोधित करें@daily :

dag = DAG('Trigger_Job', default_args=default_args, schedule_interval='@daily')

से डॉक्स , आप देख सकते हैं आप वास्तव में कर रहे हैं: @daily - Run once a day at midnight

जो अब समझ में आता है कि आपको टाइमआउट त्रुटि क्यों हो रही है, और 5 मिनट के बाद विफल हो जाता है क्योंकि आप सेट करते हैं 'retries': 1और 'retry_delay': timedelta(minutes=5)। तो यह आधी रात को डाग चलाने की कोशिश करता है, यह विफल रहता है। 5 मिनट बाद पुन: प्रयास करता है और फिर से विफल हो जाता है, इसलिए यह विफल हो जाता है।

तो मूल रूप से @daily रन की एक अंतर्निहित क्रॉन नौकरी स्थापित कर रहा है:

@daily -> Run once a day at midnight -> 0 0 * * *

क्रोन जॉब फॉर्मेट नीचे दिए गए फॉर्मेट का है और *जब भी आप "ऑल" कहना चाहते हैं, आप वैल्यू सेट कर देते हैं।

Minute Hour Day_of_Month Month Day_of_Week

इसलिए @ डेली मूल रूप से यह कह रही है कि हर दिन: मिनट 0 घंटे 0 सभी दिनों का_of_month के सभी महीनों के सभी दिन_of_week

तो आपका मामला यह चलता है: मिनट 0 घंटे 10 सभी दिनों का_of_month सभी दिनों के सभी_मैंट्स_ऑफ_वीक। यह क्रोन जॉब फॉर्मेट में अनुवाद करता है:

0 10 * * *

जब आप निष्पादन को पूरा करने के लिए किसी बाहरी घटना पर निर्भर होते हैं, तो डाग के निष्पादन को ठीक से ट्रिगर और फिर से कैसे करें

  1. आप कमांड का उपयोग करके किसी बाहरी ईवेंट से एयरफ्लो में डैग को ट्रिगर कर सकते हैं airflow trigger_dag। यह संभव होगा अगर कुछ आप अपने एयरफ्लो उदाहरण को लक्षित करने के लिए एक लैम्ब्डा फ़ंक्शन / पायथन स्क्रिप्ट को कैसे ट्रिगर कर सकते हैं।

  2. यदि आप डाग को बाहरी रूप से ट्रिगर नहीं कर सकते हैं, तो ओपी किया जैसे एक सेंसर ऑपरेटर का उपयोग करें, इसे एक poke_time सेट करें और उचित उच्च संख्या में रीट सेट करें।


इसके लिए धन्यवाद। इसके अलावा, यदि मैं समय के बजाय ईवेंट पर आधारित कार्यों को ट्रिगर करना चाहता हूं तो जैसे ही नया डेटा विभाजन स्रोत में उपलब्ध है `एडब्ल्यूएस एथेना टेबल्स` अगला कार्य ट्रिगर होना चाहिए। फिर मैं कैसे शेड्यूल करूं। क्या मेरा वर्तमान कोड पर्याप्त है?
पंकज

@ पंकज, मुझे केवल दो विकल्प दिखाई देते हैं। मुझे अक्स एथेना के बारे में ज्यादा जानकारी नहीं है, लेकिन आप कमांड का उपयोग करके किसी बाहरी घटना से एयरफ्लो में एक डाग को ट्रिगर कर सकते हैं airflow trigger_dag। यह संभव होगा अगर कुछ आप अपने एयरफ्लो उदाहरण को लक्षित करने के लिए एक लैम्ब्डा फ़ंक्शन / पायथन स्क्रिप्ट को कैसे ट्रिगर कर सकते हैं।
बर्नार्डो स्टर्न्स ने

अन्य विकल्प कम या ज्यादा आप क्या कर रहे हैं, क्योंकि आपके पास एक घटना आधारित ट्रिगर नहीं है जो आपको समय-समय पर जांचने की आवश्यकता है कि क्या यह घटना हुई है। इसलिए इस वर्तमान समाधान के उपयोग से कई घंटों के
अंतराल में ड्रोन को

@ बर्नैडो, मैंने विभाजन से बाहर निकलने के लिए AwsGlueCatalogPartitionSensorएयरफ्लो कमांड के साथ एयरफ्लो में पैकेज तैयार किया {{ds_nodash}}है। मेरा सवाल तो यह कैसे शेड्यूल करने के लिए।
पंकज

@ बेनाडो, क्या आप मेरे कोड को देख सकते हैं, जहां मैंने उपर्युक्त चेक को लागू किया है और आपके इनपुट दे सकते हैं
पंकज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.