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

Apache Airflow / الأساسي: التعريفات والفترات وتنفيذ المهام الآمن / الدرس 2

TaskFlow والاعتمادات وسياق التنفيذ

بناء مخطط مهام تصريحي صغير مع إبقاء الحساب الفعلي داخل تنفيذ المهمة.

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

أهداف الدرس

  • شرح معنى استدعاء مهمة مزينة أثناء بناء DAG.
  • استخدام سياق المهمة دون استيراد تفاصيل تشغيل داخلية.

تصف الاستدعاءات العمل قبل تنفيذه

داخل تعريف DAG، ينشئ استدعاء دالة مزينة بـTaskFlow علاقة مهمة ومؤشر ناتج، بدلاً من تنفيذ دالة العمل فوراً كاستدعاء Python عادي. ينشئ تمرير المؤشر لمهمة أخرى اعتماداً وعقد بيانات. لذلك لا تعرض طباعته أثناء التعريف القيمة التي ستحسب لاحقاً. اجعل بناء المخطط رخيصاً وحتمياً. ضع تنزيل الملفات واستعلامات القواعد والحساب المكلف داخل التنفيذ، لا عند استيراد الوحدة. فقد يتكرر التحليل، وينتج استدعاء علوي يبدو بسيطاً آثاراً متكررة قبل وجود أي تشغيلة مجدولة.

قراءة DAG توضيحي كامل

يعرف المثال تقريراً يطلق يدوياً بمهمتين. تعيد manifest وزنين اصطناعيين، وتستهلك total ناتجها المعلن وتجمعهما. تأتي استيرادات التأليف في 3.1 من airflow.sdk، وتستدعى دالة إنشاء DAG حتى يتاح التعريف للاكتشاف. الإجمالي المتوقع خمسة وفق هذه البيانات، لكن برنامج الإطار لا ينفذ في المقرر. يحتاج تحقق الجدولة وXCom تثبيت Airflow متوافقاً وحالة تنسيق وبيئة تشغيل مهام. لا يتضمن المثال اتصالاً خارجياً أو بيانات حقيقية أو إعداد نشر، ولذلك وسم صراحة بأنه غير قابل للتنفيذ.

python تعريف TaskFlow توضيحي في Airflow 3.1
from datetime import datetime, timezone
from airflow.sdk import dag, task

@dag(schedule=None, start_date=datetime(2026, 1, 1, tzinfo=timezone.utc), catchup=False)
def lab_weight_report():
    @task
    def manifest():
        return [2, 3]

    @task
    def total(weights):
        return sum(weights)

    total(manifest())

lab_weight_report()

الإجمالي المعلن 5؛ ولا يستورد Airflow أو ينفذ هنا.

قراءة السياق حيث يوجد فقط

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

اختبار الحساب منفصلاً عن التنسيق

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

python فحص محلي لمنطق مهمة خالص
def total_weight(weights_g):
    return sum(weights_g)

assert total_weight([2, 3]) == 5
assert total_weight([]) == 0
print(total_weight([2, 3]))
الناتج المتوقع
5

يتحقق من الجمع فقط، مستقلاً عن TaskFlow واتصال المهام.

استخدام الاعتمادات للشروط الفعلية

يعني سهم الاعتماد أن المهمة اللاحقة تنتظر وفق trigger rule الخاصة بها، ولا ينسخ متغيرات محلية اعتباطية أو يحجز العامل نفسه. يجمع تمرير ناتج TaskFlow الاعتماد ومؤشر القيمة، لكنه يظل يستخدم اتصال مهام لا مكدس Python واحداً. استخدم هويات ثابتة ودوالاً صغيرة مسماة كي يعكس المخطط مراحل العمل. تجنب مخططات هائلة لمهام حسابية تافهة؛ فلكل مهمة كلفة جدولة وسجل ومحاولة. وبالمقابل قد تخفي مهمة عملاقة حدود تعاف مفيدة. اختر وحدات ذات مدخلات ومخرجات وسلوك إعادة ذي معنى.

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

تنفيذ طلب شبكة كلما حلل DAG.

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

اعتبار ناتج المهمة المزينة قيمة Python فورية.

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

فشل طلب السياق أثناء الاستيراد.

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

اختبر فهمك

1. لماذا يجب استدعاء دالة إنشاء DAG المزينة في المثال؟

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

ينشئ الاستدعاء تعريف سير العمل الذي يستطيع Airflow اكتشافه. تعريف الدالة وحده يبقي دالة قابلة للاستدعاء ولا يبني المخطط. هذا إنشاء وقت التعريف، وليس تنفيذ manifest وtotal. وضح الفرق عند مراجعة الشفرة العلوية بحثاً عن آثار خارجية عرضية.

2. هل يثبت اختبار الدالة الخالصة إمكان نقل نتيجتها عبر XCom في النشر المختار؟

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

لا. يثبت العقد الحسابي لقيم Python عادية فقط. تبقى سلسلة XCom وخلفيته وتنفيذ المهام أمور تكامل مستقلة. احتفظ باختبار الدالة لعزل منطق العمل، ثم استخدم اختبارات إطار مصرحاً بها إذا احتجت ادعاء يتعلق بالنشر الفعلي.

أهم ما تعلمته

  • تبني استدعاءات TaskFlow العلاقات، ثم ينفذ العمال المنطق.
  • تجعل الدوال الخالصة اعتماد الزمن والهوية واضحاً.

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