على مدى أكثر من عقد، كان Apache Airflow هو الملك غير المتنازع عليه لتنسيق البيانات. ومع ذلك، مع تطور أكوام البيانات من المعالجة الدفعية البسيطة إلى التدفقات الفورية ومخازن الميزات ومعماريات Lakehouse، غالباً ما يبدو نموذج DAG التقليدي القائم على "المهام" متحجراً. تبحث العديد من فرق الهندسة الآن إلى الجيل التالي من أدوات التنسيق، وتحديداً Dagster وPrefect. كلاهما يوفر واجهات حديثة، وقدرات سحابية أصلية، وانحيازاً نحو سير عمل مركزية على الأصول. لكن أيهما يناسب احتياجات فريقك؟ يغوص هذا المنشور في الاختلافات المعمارية، ونماذج البرمجة، والتبعات العملية لاختيار أحد هذين النجمين الصاعدين.
التحول في النموذج: المهام مقابل الأصول
المُفرِّق الأساسي بين هذه الأدوات الحديثة وAirflow هو التحول من المهام إلى الأصول. في Airflow، تُعرّف خط الأنابيب كسلسلة من العمليات (المهام) التي تحول البيانات. وغالباً ما تكون البيانات نفسها منتجاً ثانوياً ضمنياً. في Dagster، ومع ذلك، فإن الأصل (Asset) هو وحدة التعريف الأساسية. تصف البيانات التي تريد إنتاجها (مثلاً، sales_by_region)، ويحدد الإطار كيفية حسابها وإدارة حداثتها.
يتبع Prefect نهجاً مشابهاً لكنه مختلف قليلاً، مع التركيز على التدفقات (flows) والمهام (tasks)، ولكن مع نموذج تنفيذ أكثر مرونة وقرباً من لغة بايثون يدعم التنفيذ الهجين (محلي وسحابي) ويتكامل بسلاسة مع مكتبات مثل pandas وSQL وSpark دون أغلفة صارمة.
Dagster: النهج الذي يضع الأصل أولاً
تم تصميم Dagster للمؤسسات التي تريد تتبع بيانات صارم ومراقبة. يسمح لك نموذجها القائم على الأصول بتصور بالضبط أي الأصول قديمة، وأيها حديثة، وكيف تعتمد على بعضها البعض، بغض النظر عن عدد خطوط الأنابيب التي تنتجها.
إليك مثالاً بسيطاً على تعريف أصل في Dagster:
import pandas as pd
import dagster as dg
@dg.asset
def raw_sales_csv() -> str:
# Simulates fetching raw data
return "s3://bucket/raw_sales.csv"
@dg.asset
def cleaned_sales_df(raw_sales_csv: str) -> pd.DataFrame:
# Dagster automatically passes the output of raw_sales_csv
# as an argument if the names match or via InputContext
df = pd.read_csv(raw_sales_csv)
return df.dropna()
@dg.asset
def sales_by_region(cleaned_sales_df: pd.DataFrame) -> pd.DataFrame:
return cleaned_sales_df.groupby('region').sum()
لاحظ كيف لا نحدد الاعتماديات صراحةً. يستنتج Dagster نسب البيانات بناءً على معاملات الدالة. هذا يجعل إعادة هيكلة خطوط الأنابيب أسهل بشكل كبير لأنك تفصل الحساب عن بنية البيانات.
Prefect: المرونة وتجربة المطور
يعطي Prefect الأولوية لتجربة المطور والمرونة. يعمل بشكل أفضل عندما تريد إبقاء كودك بسيطاً وبايثونياً قياسي. يسمح محرك "fluvio" في Prefect بالتوازي المتقدم ومعالجة الأخطاء بشكل افتراضي. كما يركز بقوة على التنفيذ الهجين، مما يعني أنه يمكنك تشغيل منطق التنسيق الخاص بك في Prefect Cloud بينما يحدث الحساب الفعلي على بنيتك التحتية الخاصة.
إليك كيف يبدو المنطق نفسه في Prefect:
import pandas as pd
from prefect import flow, task
from prefect.filesystems import S3
@task
def fetch_raw_sales() -> str:
return "s3://bucket/raw_sales.csv"
@task
def clean_sales(file_path: str) -> pd.DataFrame:
df = pd.read_csv(file_path)
return df.dropna()
@task
def aggregate_sales(df: pd.DataFrame) -> pd.DataFrame:
return df.groupby('region').sum()
@flow(name="Sales Pipeline")
def sales_pipeline():
file_path = fetch_raw_sales()
cleaned_df = clean_sales(file_path)
result = aggregate_sales(cleaned_df)
return result
واجهة برمجة التطبيقات (API) الخاصة بـ Prefect بديهية للغاية للمطورين المعتادين على سكربتات بايثون القياسية. تقدم إدارة حالة قوية وإعادة محاولات دون فرض سجل أصول صارم.
اعتبارات رئيسية للاختيار
- نسب البيانات والحوكمة: اختر Dagster إذا كنت بحاجة إلى فهرسة بيانات على مستوى المؤسسات، وفحوصات حداثة تلقائية، وحل اعتماديات معقدة عبر فرق متعددة.
- المرونة والسرعة: اختر Prefect إذا كان فريقك يقدّر النماذج الأولية السريعة، ومنطق بايثون المعقد، أو يحتاج إلى تنسيق مهام غير بيانات (مثلاً، استنتاج التعلم الآلي، استدعاءات API) إلى جانب خطوط أنابيب البيانات.
- التكامل مع النظام البيئي: لدى Dagster تكاملات أصلية أعمق مع dbt ومستودعات البيانات. لدى Prefect تكاملات ممتازة مع أدوات MLOps ومزودي السحابة.
الخلاصة
الانتقال إلى ما بعد Airflow ليس مجرد تغيير في الأدوات؛ بل هو تحول في نموذجك الذهني. إذا كان مصدر ألمك هو "لا أعرف أي البيانات قديمة أو كيف تم إنتاجها"، فمن المرجح أن يوفر لك النهج القائم على الأصول في Dagster وقتاً كبيراً. إذا كان مصدر ألمك هو "Airflow صارم للغاية لسير عمل بايثون المعقدة لدي"، فإن Prefect يوفر بديلاً أخف وأكثر مرونة. كلاهما خياران ممتازان للهندسة الحديثة للبيانات، ويعتمد القرار في النهاية على ما إذا كنت تعطي الأولوية لنسب البيانات (Dagster) أو مرونة المطور (Prefect).