Workflow Automation

Windmill لهندسة البيانات: بناء سكربتات ETL قابلة للتكرار باستخدام Python و SQL

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

لماذا تختار Windmill لخطوط أنابيب ETL؟

تُعاني أدوات ETL التقليدية غالبًا من عيبين رئيسيين: منحنى تعلم حاد يتضمن واجهات رسومية مملوكة، أو هشاشة السكربتات المستقلة التي تفتقر إلى التحكم في الإصدارات والمراقبة. يحل Windmill كلا المشكلتين من خلال معاملة سير العمل كأكواد. فهو يوفر واجهة منخفضة الكود/بدون كود للتنسيق، مع السماح بتخصيص عميق من خلال خطوات الكود. يضمن هذا النهج الهجين أن يتمكن مهندسو البيانات من بناء نماذج أولية بسرعة باستخدام SQL و Python، بينما يمكن لفِرق DevOps إدارة النشر عبر Git.

تشمل الفوائد الرئيسية ما يلي:

  • نهج يركز على الكود: كل خطوة هي سكربت أو استدعاء لواجهة برمجة التطبيقات (API)، مما يسهل التكامل مع خطوط CI/CD الحالية.
  • دعم أصلي لـ Python و SQL: وصول مباشر إلى مخازن بياناتك دون اعتماد على مكتبات SDK الثقيلة.
  • قابلية التكرار: يتم تسجيل معاملات الإدخال الدقيقة وإصدارات الكود لكل تنفيذ، مما يضمن قدرتك على تصحيح الأخطاء السابقة.
  • أمان الاستضافة الذاتية: احتفظ ببياناتك وأكوادك ضمن حدود بنيتك التحتية.

تصميم سير عمل ETL قابل للتكرار

عادةً ما يتكون سير عمل ETL قابل للتكرار في Windmill من ثلاث مراحل رئيسية: الاستخراج، والتحويل، والتحميل. المكوّن الحاسم لقابلية التكرار هو التحقق من صحة المدخلات وإدارة التكوين. من خلال تعريف مدخلات مُنمطة في Windmill، تضمن أن كل تشغيل للخط يعرف بالضبط المعاملات التي يجب استخدامه، مما يقضي على سيناريوهات "يعمل على جهازى فقط".

الخطوة 1: استخراج البيانات باستخدام SQL

يتيح لك Windmill الاتصال مباشرة بقاعدة البيانات الخاصة بك (PostgreSQL، MySQL، إلخ) وتنفيذ استعلامات SQL كخطوات في سير العمل. هذا مثالي لمرحلة الاستخراج. فكر في استعلام بسيط لجلب بيانات الطلبات الخام.


# خطوة Windmill: استعلام SQL
# الاتصال بمثيل PostgreSQL الخاص بك

def extract_raw_orders(conn, start_date: str, end_date: str):
    query = f"""
        SELECT 
            order_id, 
            customer_id, 
            amount, 
            created_at 
        FROM 
            public.orders 
        WHERE 
            created_at BETWEEN '{start_date}' AND '{end_date}'
    """
    return conn.execute(query).fetchall()

الخطوة 2: التحويل باستخدام Python

بمجرد استخراج البيانات، تتألق خطوات Python في مرحلة التحويل. يدعم وقت تشغيل Python في Windmill المكتبات القياسية وحتى pandas للعمليات الأكثر تعقيدًا. لضمان قابلية التكرار، تجنّب الترميز الثابت للمنطق؛ وبدلاً من ذلك، قم بتمرير كائنات التكوين أو استخدام مكتبات مُدارة بالإصدارات.


# خطوة Windmill: تحويل Python

import pandas as pd
from datetime import datetime

def transform_orders(raw_data: list[dict]):
    df = pd.DataFrame(raw_data)
    
    # حساب المقاييس المشتقة
    df['order_year'] = df['created_at'].dt.year
    df['is_high_value'] = df['amount'] > 100
    
    # تنظيف البيانات: إزالة القيم الفارغة في الحقول الحرجة
    df = df.dropna(subset=['order_id', 'customer_id'])
    
    return df.to_dict('records')

الخطوة 3: التحميل باستخدام سكربتات مُدارة بالإصدارات

بالنسبة لمرحلة التحميل، تنص أفضل الممارسات على استخدام عمليات قوية (Idempotent). في Windmill، يمكنك كتابة خطوة Python تقوم بإدراج أو تحديث البيانات (Upsert) في مستودع البيانات الخاص بك (مثل Snowflake أو BigQuery). يضمن استخدام الـ Upsert أن إعادة تشغيل الخط لنفس النطاق التاريخي لن تنشئ نسخًا مكررة، وهو جانب أساسي من قابلية التكرار.


# خطوة Windmill: تحميل Python (Upsert قوي)

import sqlalchemy

def load_orders(transformed_data: list[dict], warehouse_conn):
    engine = sqlalchemy.create_engine(warehouse_conn.url)
    for record in transformed_data:
        stmt = sqlalchemy.dialects.postgresql.upsert('analytics.orders', record)
        with engine.begin() as conn:
            conn.execute(stmt)

أفضل الممارسات لقابلية التكرار

  1. التحكم في إصدارات المدخلات: استخدم مخططات المدخلات في Windmill لتعريف المعاملات المطلوبة. سجّل هذه المدخلات جنبًا إلى جنب مع بيانات وصفية تشغيل سير العمل.
  2. تثبيت الاعتماديات: في خطوات Python، استخدم `requirements.txt` المُدار بواسطة Windmill للتأكد من استخدام نفس إصدارات المكتبات عبر البيئات المختلفة.
  3. أنماط البيانات غير القابلة للتغيير: كلما أمكن ذلك، استخدم الجداول المقسمة أو استراتيجيات اللقطات (Snapshots) في قاعدة البيانات الوجهة للحفاظ على حالات البيانات التاريخية.
  4. الاختبار محليًا أولاً: يدعم Windmill التنفيذ المحلي للخطوات. اختبر دائمًا تحويلات Python على بيانات عينة قبل نشر سير العمل الكامل.

الخلاصة

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

Share: