محتويات الدورة

Apache Airflow / المتوسط: عمل التشغيل والتحكم وميزانيات الموارد / الدرس 8

التفرع وقواعد التشغيل وضم الفروع

مطابقة المسارات الشرطية والضم لمعنى النجاح والتجاوز والفشل.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • شرح التفرع كقرار حالات مهام لا تحكم Python عادي.
  • اختيار قاعدة ضم تقبل التجاوز المقصود دون إخفاء الفشل.

اختيار المسار وقت تنفيذ المهمة

تختار مهمة التفرع معرفات مهام لاحقة وقت التشغيل، وتتسبب في تجاوز المسارات غير المختارة وفق قواعد Airflow. أما if أثناء تعريف DAG فتختار بناء المخطط وفق معلومات متاحة عند التحليل. استخدم تفرع التشغيل إذا اعتمد القرار على بيانات الفترة الحالية المتحقق منها. يجب أن تطابق القيمة المعادة معرفات لاحقة فعلية، بما فيها بادئة المجموعة؛ فلا تكفي archive إذا كان المعرف group.archive. اجعل القرار صغيراً وحتمياً، وسجل سبب مطابقة المسار المختار سياسة العمل لهذه التشغيلة.

يغير الفرع المتجاوز سلوك الضم الافتراضي

تتطلب all_success الافتراضية نجاح جميع المهام السابقة المباشرة. بعد فرع حصري، يتجاوز شقيق عمداً؛ لذا قد تتجاوز مهمة الضم الافتراضية أيضاً بدلاً من إنتاج النتيجة النهائية المطلوبة. قد تناسب none_failed_min_one_success شرط نجاح مسار مختار واحد على الأقل وغياب أي فشل. وهي تختلف عن all_done التي تنتظر الحالات النهائية وقد تعمل رغم الفشل. اختر وفق عقد العمل الفعلي، لا وفق القاعدة التي تجعل الرسم أخضر. يجب أن يظل فشل التحقق ظاهراً حتى إذا سمح لمهمة تنظيف أو إشعار بالتنفيذ.

مقارنة قراري ضم مفاهيميين

يقارن النموذج المحلي حالتين نهائيتين اصطناعيتين: success وskipped. يفشل شرط نجاح الجميع، ويصح شرط غياب الفشل مع نجاح واحد. هذه مقارنة مفاهيمية ضيقة، لا مقيّم كامل لقواعد تشغيل Airflow. فالحالات الفعلية تشمل upstream_failed وسلوك المهام الموزعة، ويؤثر توقيت المجدول أيضاً. يضيف التأكيد الثاني failed ليوضح وجوب رفض فشل حقيقي رغم قبول التجاوز المقصود. احتفظ بالحالات السلبية في المراجعة، كي لا تتوسع قاعدة الضم تدريجياً حتى تخفي العطل التجاري المطلوب إظهاره.

python مقارنة ضم مفاهيمية محلية
states = ['success', 'skipped']
all_success = all(state == 'success' for state in states)
join_ok = not any(state in {'failed', 'upstream_failed'} for state in states) and 'success' in states
assert not all_success
assert join_ok
failed_states = ['success', 'failed']
assert any(state == 'failed' for state in failed_states)
print(all_success, join_ok)
الناتج المتوقع
False True

توضح التسميات ضماً يقبل التجاوز؛ وليست تنفيذاً كاملاً لقواعد المجدول.

قراءة قرار بسيط دون تشغيل Airflow

يعيد جزء دالة الفرع publish فقط إذا كان عدد الصفوف المتحقق منه موجباً، وإلا يعيد record_empty. يفترض المثال وجود المهمتين خيارين لاحقين مباشرين صالحين في DAG المحيط. وهو غير قابل للتنفيذ لغياب ذلك المخطط وبيئته. لا تساوِ مجموعة بيانات فارغة بمصدر غير متاح، إلا إذا نصت سياسة العمل صراحة على ذلك. تحقق من إتاحة المصدر أولاً، ثم قرر معنى الصفر. أعد هويات مهام فعلية وراجع قاعدة الضم مستقلة؛ فلا تحدد دالة الفرع وحدها حالة DAG النهائية.

python جزء تفرع وقت تشغيل توضيحي
from airflow.sdk import task

@task.branch
def choose_path(validated_row_count):
    return 'publish' if validated_row_count > 0 else 'record_empty'

يجب أن يعرف المخطط المهمتين وقاعدة الضم المقصودة؛ ولا ينفذ فرع.

مراجعة الحالة النهائية من مراحل العمل

تعتمد حالة تشغيلة DAG على نسخ المهام الطرفية وقواعد حالات Airflow. قد تجعل مهمة طرفية ذات all_done تنجح دائماً الحالة العامة مضللة إذا فشلت مرحلة تجارية سابقة. يجب أن يعمل التنظيف والإشعار بموثوقية دون إعادة تعريف نجاح التقرير. صمم مهمة قبول أو بنية مخطط تحفظ إشارة الفشل المطلوبة، ثم تحقق من نجاح فرع واحد وتجاوز جميع المسارات وفشل مهمة سابقة. لا يشغل المحتوى مشغل تفرع ولا يمسح حالة ولا يغير قاعدة في نظام مضبوط؛ وينفذ النموذج المنطقي المحلي فقط.

الأخطاء الشائعة وإصلاحها

تجاوز الضم بعد نجاح الفرع المختار.

لماذا يحدث؟
طلب all_success نجاح الشقيق المتجاوز عمداً.
كيف تصلحه؟
اختر قاعدة موثقة توافق التجاوز وتمنع الفشل.
كيف تتجنب تكراره؟
اختبر مصفوفة حالات الفرع والضم.

إرجاع الفرع معرفاً لا يطابق عقدة لاحقة.

لماذا يحدث؟
إهمال البادئات أو الهويات.
كيف تصلحه؟
أعد معرفات لاحقة فعلية مدعومة.
كيف تتجنب تكراره؟
ثبت الهويات وافحص التعريف.

إخفاء مهمة all_done نهائية لفشل عمل سابق.

لماذا يحدث؟
السماح لنجاح التنظيف بتحديد القبول.
كيف تصلحه؟
احفظ إشارة الفشل المطلوبة في المخطط والقبول.
كيف تتجنب تكراره؟
راجع الحالات الطرفية مع فشل سابق.

اختبر فهمك

1. ما نتيجة الضم المناسبة لحالتي success وskipped إذا كان المطلوب نجاح مسار مختار واحد؟

اعرض الحل المشروح

يمكن أن تتابع قاعدة تشترط غياب فشل سابق ونجاح مهمة واحدة على الأقل. لا يتحقق all_success لأن skipped ليست success. راجع قاعدة الإصدار المنشور الدقيقة، وأدرج حالة فشل فعلية كي لا يتحول السماح بالتجاوز المقصود إلى السماح بفشل التحقق.

2. هل ينبغي أن يختار غياب ملف المصدر تلقائياً مسار التقرير الطبيعي ذي صفر صف؟

اعرض الحل المشروح

لا. قد يعني الغياب نقص المدخلات أو عطل تبعية، لا فترة فارغة صالحة. أثبت إتاحة المصدر والبيان المتوقع أولاً، ثم فسر عدداً متحققاً مقداره صفر. قد ينشر خلط المعنيين تقريراً فارغاً زائفاً ويخفي انقطاعاً خلف قرار تفرع يبدو مقصوداً.

أهم ما تعلمته

  • ترمز قواعد التشغيل لقبول الحالات السابقة لا التوقيت فقط.
  • افصل تنفيذ التنظيف عن دليل نجاح العمل.

المراجع الرسمية