Apache Airflow / المتوسط: عمل التشغيل والتحكم وميزانيات الموارد / الدرس 7
توزيع المهام الديناميكي ومجموعات المهام
توسيع عمل التشغيل المحدود بعناية مع وضوح التجميع والهوية ودلالات الاختزال.
في هذه الصفحة
أهداف الدرس
- تمييز التوزيع وقت التشغيل من حلقة Python أثناء البناء.
- شرح expand وpartial وكلفة جمع نتائج المهام الموزعة.
قد يعتمد عدد المهام على ناتج سابق
يسمح توزيع المهام الديناميكي لمهمة سابقة بإعادة قائمة أو قاموس محدود يحدد نسخ المهام وقت التشغيل. أما حلقة Python داخل ملف DAG فتبني عقداً معروفة أثناء التحليل. يهم هذا الفرق عندما يتطلب اكتشاف أقسام المدخلات وصولاً خارجياً؛ فمكان الاكتشاف مهمة، لا استيراد وحدة يتكرر. المرونة وقت التشغيل لا تعني عدداً غير محدود. حدد أقصى عناصر العمل المتوقعة وسياسة المدخل الفارغ ومعرفات العناصر الثابتة. قد ترهق مليون مهمة صغيرة كلفة التنسيق رغم رخص كل عملية؛ لذا اختر وحدة عمل ذات معنى.
فصل المدخلات الموزعة عن الثوابت
يوزع DAG التوضيحي process على معرفي مستودعين اصطناعيين، مع تثبيت multiplier عبر partial. تقبل expand معاملات مسماة، وتشكل القوائم المستقلة المتعددة تراكيب بدلاً من اقتران العناصر المتقابلة تلقائياً. إذا كان المطلوب أزواجاً، فابن سجلاتها أو استخدم الربط الموثق. ليس ترتيب التوزيع ضمان تسلسل تجاري. ينبغي أن تشتق المهمة هوية الوجهة من مفتاح عنصر ثابت والفترة، لا من ترتيب عرضه المفترض في الواجهة. لا يستورد المثال أو ينفذ، ولا يجدول أي قسم فعلياً.
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_depot_map():
@task
def process(depot, multiplier):
return {'depot': depot, 'units': multiplier * 2}
process.partial(multiplier=3).expand(depot=['D1', 'D2'])
lab_depot_map()
تحدد المدخلات نسختين بست وحدات لكل منهما؛ ولا تختبر بيئة Airflow.
تنظم المجموعة ولا تعزل التنفيذ
توفر مجموعة المهام تنظيماً منطقياً ونطاق أسماء في المخطط. ولا تنشئ معاملة واحدة أو عاملاً واحداً أو دليلاً محلياً مشتركاً لمهامها. قد يعبر توزيع المجموعة عن سير فرعي متكرر باعتمادات موثقة، لكن تبقى لكل مهمة حالة وحدود فشل مستقلة. تفيد معرفات المجموعة والمهام الثابتة لاستمرار التشخيص عبر تغير التعريف. لا تجعل التعشيق المرئي يوحي بنسخ البيانات أو توريث الصلاحيات تلقائياً. وثق مرور مفتاح العنصر بكل مرحلة، وكيف يؤثر فشل عنصر في التجميع أو النشر اللاحق.
حساب التراكيب قبل التوسيع
ينتج الضرب المحلي لمستودعين وثلاثة تواريخ ستة عناصر عمل، مقابل زوجين عند zip الذي يتوقف عند المدخل الأقصر. هذه دلالات Python لتوضيح العدد، وليست تنفيذاً لمجدول Airflow. قد يضاعف ضرب غير مقصود الكلفة ويكرر المخرجات لتراكيب لم يطلبها العمل. تحقق من مجموعة العناصر المتوقعة صراحة قبل التوزيع، وارفض المفاتيح المنطقية المكررة إذا تصادمت في الوجهة. قد يكون الضرب صحيحاً تماماً لمصفوفة أقسام فعلية؛ المقصود اختياره عمداً، لا استنتاج الاقتران من مواضع القوائم.
from itertools import product
depots = ['D1', 'D2']
dates = ['2026-10-01', '2026-10-02', '2026-10-03']
combinations = list(product(depots, dates))
pairs = list(zip(depots, dates))
assert len(combinations) == 6
assert len(pairs) == 2
print(len(combinations), len(pairs))
6 2
تختلف ستة تراكيب عن زوجين؛ فاختر مجموعة العمل صراحة.
جمع النتائج بميزانية موارد
قد تمثل مخرجات المهام الموزعة بتسلسل كسول لا بقائمة محملة كاملة. يؤدي تحويل النتائج كلها إلى list إلى تحميلها، وقد يثقل الذاكرة أو XCom. فضل ملخصات صغيرة لكل عنصر واستراتيجية تجميع تناسب المقياس المعلن. قد يتجاوز التوزيع الفارغ وفق السلوك الموثق؛ لذلك يجب أن تفسر قاعدة المهمة النهائية هذا المعنى عمداً. راجع حدود التوزيع وتزامن المهام بوصفها إعدادات نشر، ولا ترفعها عميانياً بعد فشل. يختبر المقرر العدد محلياً فقط، ولا يشغل توزيع Airflow أو يعدل إعداداً.
الأخطاء الشائعة وإصلاحها
إنشاء تراكيب كثيرة غير متوقعة.
- لماذا يحدث؟
- افتراض اقتران القوائم المستقلة حسب الموضع.
- كيف تصلحه؟
- ابن سجلات الأزواج أو استخدم الربط الموثق.
- كيف تتجنب تكراره؟
- أكد العدد والهويات قبل التوسيع.
توقع مشاركة المجموعة دليلاً محلياً واحداً.
- لماذا يحدث؟
- اعتبار التجميع المرئي تجاوراً تنفيذياً.
- كيف تصلحه؟
- استخدم مؤشرات آثار تصل إليها كل مهمة.
- كيف تتجنب تكراره؟
- راجع عزل العمال مستقلاً عن التعشيق.
نفاد ذاكرة مهمة الجمع لكل النتائج.
- لماذا يحدث؟
- تحميل النتائج الكسولة دون ميزانية حجم.
- كيف تصلحه؟
- اجمع ملخصات صغيرة أو أعد تصميم حجم العمل.
- كيف تتجنب تكراره؟
- حدد حجم التوزيع وحمولات نتائجه معاً.
اختبر فهمك
1. إذا مرر مستودعان وثلاثة تواريخ كقوائم مستقلة للتوزيع، فهل يصح توقع عنصرَي عمل فقط؟
اعرض الحل المشروح
لا. قد ينتج التوسيع المستقل حاصل ضرب من ستة تراكيب. إذا قصد زوجان محددان من مستودع وتاريخ، فمثلهما بسجلات صريحة، وافحص أي تاريخ لم يستخدم وسبب ذلك. يكشف اختبار العدد الخطأ قبل أن تنشئ الجدولة عملاً غير مقصود أو مخرجات تتصادم في الوجهة.
2. لماذا لا ينبغي أن يصبح map_index تلقائياً مفتاح الأثر التجاري؟
اعرض الحل المشروح
يعرف map_index موضع تنفيذ موزع، بينما ينبغي ثبات هوية العمل عند تغير ترتيب المدخلات أو اختلاف التشغيلة. استخدم مفتاح مستودع أو قسم أو سجل صريحاً مع الفترة ونطاق العملية. احتفظ بالفهرس في التشخيص كسياق تنفيذ، ولا تعتبره معرف المجال التجاري.
أهم ما تعلمته
- يغير التوزيع عدد النسخ، ويغير التجميع تنظيم المخطط.
- حدد عناصر العمل وجمع النتائج قبل الجدولة.