פתרון בעיות שקשורות להפעלת Airflow

Managed Airflow (דור 3) | Managed Airflow (דור 2) | Managed Airflow (דור 1 מדור קודם)

בדף הזה מפורטים שלבים לפתרון בעיות נפוצות שקשורות להפעלת Airflow.

חסימת פעולות בטריגר

יכול להיות שמשימות אסינכרוניות ייחסמו מדי פעם בטריגרים. ברוב המקרים, הבעיות נובעות ממקורות לא מספיקים של מפעילים או מבעיות בקוד של אופרטורים אסינכרוניים בהתאמה אישית.

יומני הפעלה מציגים הודעות אזהרה שיכולות לעזור לכם לזהות את הסיבות הבסיסיות לירידה בביצועים של הפעלת הטריגר. יש שתי אזהרות חשובות שכדאי לשים לב אליהן.

  1. השרשור האסינכרוני נחסם:

    Triggerer's async thread was blocked for 1.2 seconds, likely due to the
    highly utilized environment.
    

    האזהרה הזו מצביעה על בעיות בביצועים בגלל נפח גבוה של משימות אסינכרוניות.

    פתרון: כדי לפתור את הבעיה:

    • משנים את הפרמטרים של מפעילים כדי להקצות יותר משאבים למפעילים או להגדיל את מספר המפעילים בסביבה שלכם.
    • להקטין את מספר המשימות שמושהות ומופעלות בו-זמנית.

    למרות שהטריגרים מטפלים במשימות שניתן לדחות, עובדי Airflow אחראים להתחלה ובסופו של דבר להשלמה של כל משימה. אם אתם משנים את מספר הטריגרים, כדאי גם להגדיל את מספר המופעים של העובדים.

  2. משימה ספציפית חסמה את השרשור האסינכרוני:

    WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done,
    defined at /opt/***/***/jobs/example.py:609> result=None> took 0.401
    second
    

    האזהרה הזו מצביעה על קטע ספציפי של קוד אופרטור שמופעל על ידי Managed Service for Apache Airflow. הטריגרים מבוססים על ספריית asyncio כדי להפעיל פעולות ברקע. הטמעה מותאמת אישית של טריגר עלולה לא לעמוד בדרישות של חוזי asyncio (לדוגמה, בגלל שימוש שגוי במילות המפתח await ו-async בקוד Python).

    פתרון: בודקים את הקוד שדווח באזהרה ומוודאים שהפעולה האסינכרונית הוטמעה בצורה תקינה.

יותר מדי טריגרים

מספר המשימות שההפעלה שלהן נדחתה מופיע במדד task_count, שמוצג גם בלוח הבקרה Monitoring של הסביבה שלכם. כל טריגר יוצר משאבים מסוימים, כמו חיבורים למשאבים חיצוניים, שצורכים זיכרון.

משימות שנדחו שמוצגות בלוח הבקרה של המעקב
איור 1. משימות שנדחו מוצגות בלוח הבקרה 'מעקב' (לחיצה להגדלה)

גרפים של צריכת הזיכרון והמעבד מצביעים על כך שאין מספיק משאבים, ולכן המערכת מופעלת מחדש כי בדיקת הפעילות נכשלת בגלל חוסר פעימות לב:

הטריגר מופעל מחדש בגלל מחסור במשאבים
איור 1. הטריגר מופעל מחדש בגלל חוסר משאבים (לחצו כדי להגדיל)

פתרון: כדי לפתור את הבעיה:

  • משנים את הפרמטרים של מפעילים כדי להקצות יותר משאבים למפעילים או להגדיל את מספר המפעילים בסביבה שלכם.
  • להקטין את מספר המשימות שמושהות ומופעלות בו-זמנית.

קריסה של Airflow worker במהלך ביצוע של קריאה חוזרת

אחרי שהטריגר מסיים את ההפעלה, השליטה חוזרת לעובד של Airflow, שמפעיל שיטת קריאה חוזרת באמצעות משבצת ביצוע. השלב הזה מנוהל על ידי Celery Executor, ולכן חלות עליו המגבלות המתאימות של התצורה והמשאבים (כמו parallelism או worker_concurrency).

אם שיטת הקריאה החוזרת נכשלת בתהליך העבודה של Airflow, התהליך נכשל או שהתהליך שמריץ את השיטה מופעל מחדש, המשימה מסומנת כFAILED. במקרה הזה, הפעולה של הניסיון החוזר מפעילה מחדש את כל המשימה, ולא רק את שיטת הקריאה החוזרת.

לולאה אינסופית בטריגר

אפשר להטמיע אופרטור טריגר בהתאמה אישית כך שהוא יחסום לחלוטין את הלולאה הראשית של הטריגר, כדי שרק הטריגר הפגום יופעל באותו זמן. במקרה כזה, נוצרת אזהרה ביומנים של הגורם המפעיל אחרי שהגורם המפעיל הבעייתי מסיים את הפעולה.

לא נמצאה מחלקת טריגר

מכיוון שהתיקייה DAGs לא מסונכרנת עם מפעיל Airflow, קוד ההפעלה המוטמע חסר כשההפעלה מתבצעת. השגיאה נוצרת ביומנים של המשימה שנכשלה:

ImportError: Module "PACKAGE_NAME" does not define a "CLASS_NAME" attribute/
class

פתרון: מייבאים את הקוד החסר מ-PyPI.

הודעת אזהרה לגבי הגורם להפעלת התהליך בממשק המשתמש של Airflow

במקרים מסוימים, אחרי השבתת הגורם המפעיל, יכול להיות שתופיע הודעת האזהרה הבאה בממשק המשתמש של Airflow.

The triggerer does not appear to be running. Last heartbeat was received
4 hours ago. Triggers will not run, and any deferred operator will remain
deferred until it times out or fails.

יכול להיות שההודעה הזו תוצג ב-Airflow כי יש טריגרים לא שלמים במסד הנתונים של Airflow. ההודעה הזו בדרך כלל מופיעה אם ההפעלה הושבתה לפני שכל הטריגרים בסביבה שלכם הושלמו.

כדי לראות את כל הטריגרים שפועלים בסביבה, אפשר לעבור לדף Triggers (טריגרים) דרך Browse (עיון) > בממשק המשתמש של Airflow. נדרש התפקיד Admin.

פתרונות:

המשימות נשארות במצב 'נדחה' אחרי שהגורם המפעיל מושבת

כשמשביתים את מפעיל הטריגר, משימות שכבר נמצאות במצב 'השהיה' יישארו במצב הזה עד שיסתיים הזמן הקצוב לתפוגה. הזמן הקצוב לתפוגה יכול להיות אינסופי, בהתאם להגדרות של Airflow ו-DAG.

אפשר לנסות את אחד מהפתרונות הבאים:

  • מסמנים ידנית את המשימות כנכשלות.
  • הפעלת ההרשאה למי שהפעיל את הטריגר להשלמת המשימות.

מומלץ להשבית את מפעיל הטריגר רק אם בסביבה שלכם לא מופעלים אופרטורים או משימות שמושהים, וכל המשימות המושהות הושלמו.

המאמרים הבאים