অজগরের ডিএজি ব্যবহার করে কেবল এডাব্লুএস অ্যাথেনা টেবিলের নতুন পার্টিশন / ডেটা যখন অবিচ্ছিন্নভাবে এয়ারফ্লো টাস্কটি ট্রিগার করতে পারে?


9

আমার নীচের মতো একটি দৃশ্য আছে:

  1. ট্রিগার একটি Task 1এবং Task 2শুধুমাত্র যখন নতুন তথ্য উৎস সারণী (গ্রীক পুরাণের দেবী) তাদের জন্য avialable হয়। একদিনে নতুন ডেটা পার্টিশন করার সময় টাস্ক 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)

এটি অর্জনের সর্বোত্তম সর্বোত্তম উপায় কী?


এই সমাধান নিয়ে আপনার কোন সমস্যা হচ্ছে?
বার্নার্ডো

@ বার্নার্ডোস্টের্নস্রেইজন, কখনও কখনও Task1এবং Task2লুপে যান। আমার জন্য ডেথগুলি এথেনার উত্স টেবিল 10 এএম সিইটিতে লোড করা হবে।
পঙ্কজ

আপনি বলতে চাইছেন যে লুপটি চলছে, এয়ারফ্লোটি টাস্ক 1 এবং টাস্ক 2 বহুবার পুনরায় চেষ্টা করবে যতক্ষণ না এটি সফল না হয়?
বার্নার্ডো

@ বার্নার্ডোস্টের্নস্রেইজন, হুবহু
পঙ্কজ

1
@ বার্নার্ডোস্টের্নস্রেইসেন, আমি কীভাবে এই
অনুগ্রহটি

উত্তর:


1

আমি বিশ্বাস করি আপনার প্রশ্ন দুটি প্রধান সমস্যার সমাধান করে:

  1. schedule_intervalএকটি সুস্পষ্ট উপায়ে কনফিগার করতে ভুলে যাচ্ছেন যাতে @ ডেইলি এমন কিছু সেট আপ করে যা আপনি প্রত্যাশা করছেন না।
  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 -> Run once a day at midnight -> 0 0 * * *

ক্রোন জব ফর্ম্যাটটি নীচের বিন্যাসের এবং আপনি *যখনই "সমস্ত" বলতে চান তখন মান নির্ধারণ করেন ।

Minute Hour Day_of_Month Month Day_of_Week

সুতরাং @ ডেইলি মূলত এইটি চালাচ্ছেন: সমস্ত দিনের মিনিট 0 ঘন্টা 0_ সমস্ত দিনের সমস্ত মাসের_মো_মুঠ

সুতরাং আপনার কেস এই প্রতি চালানো হয়: সমস্ত দিন 1 মিনিট 0 ঘন্টা 10_ সমস্ত দিন_আমকের সমস্ত_মিনিথ_আম_উইক। এটি ক্রোন জব ফর্ম্যাটটিতে অনুবাদ করে:

0 10 * * *

যখন আপনি এক্সিকিউশনটি সম্পন্ন করতে কোনও বহিরাগত ইভেন্টের উপর নির্ভর করেন তখন ডাগের কার্যকরভাবে কীভাবে ট্রিগার এবং পুনরায় চেষ্টা করবেন

  1. আপনি কমান্ডটি ব্যবহার করে একটি বহিরাগত ইভেন্ট থেকে এয়ারফ্লোতে একটি ডাগকে ট্রিগার করতে পারেন airflow trigger_dag। আপনার বায়ু প্রবাহের উদাহরণটি লক্ষ্য করতে আপনি যদি কোনও ল্যাম্বদা ফাংশন / পাইথন স্ক্রিপ্টকে ট্রিগার করতে পারেন তবে এটি সম্ভব হবে।

  2. আপনি যদি ছিনতাকে বাহ্যিকভাবে ট্রিগার করতে না পারেন তবে ওপির মতো সেন্সর অপারেটর ব্যবহার করুন, এতে একটি পোকে টাইম সেট করুন এবং যুক্তিসঙ্গত উচ্চ সংখ্যক পুনরায় চেষ্টা করুন।


এর জন্য ধন্যবাদ. এছাড়াও যদি আমি সময়ের পরিবর্তে ইভেন্টের উপর ভিত্তি করে কাজগুলি ট্রিগার করতে চাই তবে শীঘ্রই উত্স-এডাব্লুএস অ্যাথেনা টেবিলস-এ নতুন ডেটা পার্টিশনটি অবিচলযোগ্য হয় পরবর্তী কাজটি ট্রিগার করা উচিত। তারপরে কীভাবে শিডিউল করব। আমার বর্তমান কোডটি যথেষ্ট?
পঙ্কজ

@ পঙ্কজ, আমি কেবল দুটি বিকল্প দেখতে পাচ্ছি। আমি অ্যাথেনা সম্পর্কে খুব বেশি কিছু জানি না, তবে আপনি কমান্ডটি ব্যবহার করে একটি বহিরাগত ইভেন্ট থেকে এয়ারফ্লোতে একটি ডাগকে ট্রিগার করতে পারেন airflow trigger_dag। আপনার বায়ু প্রবাহের উদাহরণটি লক্ষ্য করতে আপনি যদি কোনও ল্যাম্বদা ফাংশন / পাইথন স্ক্রিপ্টকে ট্রিগার করতে পারেন তবে এটি সম্ভব হবে।
বার্নার্ডো

অন্য বিকল্পটি আপনি যা করছেন তা কমবেশি, কারণ আপনার ইভেন্ট ভিত্তিক ট্রিগার নেই কারণ আপনার এই ঘটনাটি ঘটেছে কিনা তা পর্যায়ক্রমে পরীক্ষা করা উচিত। সুতরাং এই বর্তমান সমাধানটি ব্যবহারের ফলে কয়েক মিনিটের জন্য উচ্চতর ফ্রিকোয়েন্সিতে ছিনতাই চালানোর জন্য ক্রোন জব সেট করা হবে ... অনেকে ব্যর্থ হবে তবে ঘটনাটি ঘটার পরে এটি বেশ দ্রুতই ধরতে সক্ষম হবে
বার্নার্ডো স্টার্নস রিজেন

@ বার্নাডো, আমি এয়ারফ্লোতে প্যাকেজটি বের করেছি এবং পার্টিশনটি প্রস্থান করার জন্য AwsGlueCatalogPartitionSensorএয়ারফ্লো কমান্ড সহ ডেকে আছি {{ds_nodash}}। আমার প্রশ্ন তারপর কিভাবে এই সময়সূচী।
পঙ্কজ

@ বেনাডো, আপনি কি আমার কোডটি দেখতে পারেন যেখানে আমি উপরে বর্ণিত চেকটি প্রয়োগ করেছি এবং আপনার ইনপুটগুলি দিতে পারি
পঙ্কজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.