פתרון בעיות שקשורות להפעלת 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, שמופיע גם בלוח הבקרה של המעקב בסביבה שלכם. כל טריגר יוצר משאבים מסוימים, כמו חיבורים למשאבים חיצוניים, שצורכים זיכרון.

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

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

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

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

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

קריסה של Airflow worker במהלך ביצוע של callback

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

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

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

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

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

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

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.

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

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

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

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