Apache Airflow / الأساسي: التعريفات والفترات وتنفيذ المهام الآمن / الدرس 3
تشغيلات DAG وفترات البيانات واللحاق
اختيار جدول وعقد فترة يصحان عند تأخر التشغيلة أو إعادتها.
في هذه الصفحة
أهداف الدرس
- تمييز التاريخ المنطقي وفترة البيانات ووقت البداية الفعلي.
- شرح اللحاق دون افتراض تقسيم المدخلات تلقائياً.
تعالج التشغيلة فترة معلنة
في جدول يومي قائم على الفترات، تمثل التشغيلة عادة فترة بيانات مكتملة، لا اليوم الذي يبدأ فيه العامل عرضاً. يعرف التاريخ المنطقي سياق الجدولة ولا يرادف وقت التنفيذ الفعلي. قد يبدأ تقرير الأول من أكتوبر في الثالث، ويظل محتاجاً مدخلات الأول. استخدم data_interval_start وdata_interval_end وفق الجدول المختار، واعتمد فترة نصف مفتوحة عندما يتطلب عقد العمل ذلك. قد تختلف دلالات الجداول والتشغيلات اليدوية والمحفزة بأصل؛ فلا تستنتج كل فترة من تسمية تشغيلة تبدو تاريخاً.
اختبار عضوية حدود الفترة محلياً
يعرف المثال المحلي يوم UTC واحداً ويفحص سجلاً عند بدايته، وآخر قبل نهايته مباشرة، وثالثاً عند بداية اليوم التالي. ينتمي الثالث إلى الفترة التالية، كي لا يعد مرتين عند جمع تقارير متجاورة. تمنع القيم الواعية بالمنطقة الاعتماد على توقيت جهاز العامل. لا ينفذ الحساب جدول Airflow أو سلوك التوقيت الصيفي. تحتاج التقارير التقويمية في منطقة محلية مسماة اختبارات حدود مستقلة، خصوصاً حول تغير الإزاحة. احفظ المنطقة التجارية ضمن عقد البيانات، ولا تحول متطلب تقويم إلى حساب أربع وعشرين ساعة بصمت.
from datetime import datetime, timedelta, timezone
start = datetime(2026, 10, 1, tzinfo=timezone.utc)
end = start + timedelta(days=1)
points = [start, end - timedelta(seconds=1), end]
inside = [point for point in points if start <= point < end]
assert len(inside) == 2
print(len(inside))
2
يستبعد حد النهاية؛ ولا ينفذ جدول Airflow.
تحدد start_date أهلية الجدولة
تمثل start_date حد أهلية للجدولة، لا أمراً بالبدء فور تلك اللحظة الجدارية. في جداول الفترات الشائعة، تتبع الأهلية اكتمال الفترة والقيود الأخرى. يحدد catchup إنشاء الفترات الفائتة وفق القواعد، لكنه لا يعيد كتابة المهمة لقراءة الأقسام التاريخية. قد تنتج مهمة تقرأ latest دائماً نتائج خاطئة لكل تشغيلات اللحاق. اختر حداً ثابتاً واعياً بالمنطقة وسياسة صريحة. تجنب start_date متحركة مبنية على now تتغير مع التحليل المتكرر، وتجعل أول فترة مقصودة صعبة الفهم.
قراءة تعريف يومي صريح بتوقيت UTC
يختار التعريف غير المنفذ CronDataIntervalTimetable صراحة بحد يومي UTC وتعطيل catchup. قد تستخدم افتراضيات cron في Airflow 3 جداول مبنية على لحظة التحفيز؛ لذا نختار دلالات الفترة ولا نفترضها. لا يطلب التعريف إنشاء كل تشغيلة يومية تاريخية فائتة، لكنه لا يمنع تشغيلاً يدوياً أو ملئاً تاريخياً مصرحاً مستقلاً. تعيد المهمة الصغيرة تسمية ليكون التعريف التوضيحي كاملاً، لا نقاط حذف غامضة. ليست التسمية عقد قسم بيانات بذاتها؛ فالتقرير الحقيقي يستخرج الفترة من سياق التشغيل ويستخدمها باتساق لاختيار المصدر وهوية الوجهة.
from datetime import datetime, timezone
from airflow.sdk import dag, task
from airflow.timetables.interval import CronDataIntervalTimetable
@dag(schedule=CronDataIntervalTimetable('0 0 * * *', timezone='UTC'), start_date=datetime(2026, 10, 1, tzinfo=timezone.utc), catchup=False)
def lab_daily_report():
@task
def identify():
return 'interval-bound-report'
identify()
lab_daily_report()
الجدول تصريحي وغير منفذ؛ ولا تختار التسمية صفوف المصدر.
تمييز تأخر التشغيلة عن تأخر البيانات
يختلف تأخر التشغيلة بسبب السعة عن وصول سجل مصدر بعد إغلاق فترته المقصودة. قد يعالج الأول بتنفيذ القسم الحتمي نفسه لاحقاً، بينما يحتاج الثاني سياسة تصحيح أو علامة اكتمال أو إعادة معالجة تناسب المصدر. لا تقرر جدولة Airflow وحدها أن التقرير مكتمل بما يكفي للنشر التجاري. سجل إتاحة المدخلات المتوقعة وكيف يستبدل التصحيح المتأخر الناتج أو يعدله. تحقق من غياب تداخل أو فجوات غير مقصودة بين الفترات. ينفذ المقرر حساب حدود محلياً فقط، ولا ينشئ تشغيلات أو يغير جدولاً أو يطلق catchup.
الأخطاء الشائعة وإصلاحها
قراءة التشغيلة المتأخرة بيانات اليوم لا فترتها.
- لماذا يحدث؟
- استبدال فترة البيانات بوقت الآن.
- كيف تصلحه؟
- مرر الحدود الصريحة لاختيار المصدر وهوية الناتج.
- كيف تتجنب تكراره؟
- اختبر تشغيلة تاريخية تنفذ بتاريخ لاحق.
كتابة تشغيلات اللحاق كلها للقسم الأحدث نفسه.
- لماذا يحدث؟
- عدم مراعاة المهمة للفترة.
- كيف تصلحه؟
- اجعل كل فترة تختار قسمها التجاري وتستبدله.
- كيف تتجنب تكراره؟
- راجع منطق الأقسام قبل تفعيل اللحاق.
عد سجل الحد مرتين في تقريرين متجاورين.
- لماذا يحدث؟
- شمول طرفي الفترتين معاً.
- كيف تصلحه؟
- استخدم قاعدة نصف مفتوحة موثقة أو قاعدة صريحة تمنع التداخل.
- كيف تتجنب تكراره؟
- احتفظ ببيانات الحدود الدقيقة في الاختبارات.
اختبر فهمك
1. إذا بدأ تقرير الأول من أكتوبر في الثالث، فأي زمن ينبغي أن يحدد قسم مصدره؟
اعرض الحل المشروح
استخدم فترة البيانات المعلنة للتقرير، لا تاريخ بدء العامل الفعلي. يجب أن يظل قسم المصدر وهوية الناتج مرتبطين بنطاق العمل المقصود. وإذا وجدت تصحيحات متأخرة، فطبق سياستها الموثقة بدلاً من توسيع الفترة بصمت إلى أحدث ما يتوفر.
2. هل يثبت catchup=False استحالة إعادة معالجة تاريخية بأي وسيلة؟
اعرض الحل المشروح
لا. يضبط لحاق المجدول، لا كل تشغيل يدوي أو ملء تاريخي أو تعاف. قد تطلب معالجة قديمة صراحة عبر مسار مدعوم مصرح به. لذلك يجب أن توثق المهام الفترات التي تعالجها بأمان، وهل يستبدل تكرار التنفيذ الناتج أم يضيف أثراً آخر.
أهم ما تعلمته
- لزمن الجدولة المنطقي وزمن التنفيذ الفعلي معنيان مختلفان.
- يكون اللحاق آمناً عندما تحترم المدخلات والمخرجات الفترات المعلنة.