התאמה אוטומטית לעומס של עומס עבודה resource_allocation_properties

במאמר הזה מוסבר על שינוי גודל אוטומטי בשירות מנוהל ל-Apache Spark. כששולחים את עומס העבודה של Spark, ‏ Managed Service for Apache Spark יכול לשנות באופן דינמי את גודל המשאבים של עומס העבודה, כמו מספר תהליכי הביצוע, כדי להריץ את עומס העבודה בצורה יעילה. התנהגות ברירת המחדל של Managed Service for Apache Spark היא שימוש בהתאמת קנה מידה אוטומטית, והיא מבוססת על הקצאת משאבים דינמית של Spark כדי לקבוע אם, איך ומתי להתאים את קנה המידה של עומס העבודה.

‫Managed Service for Apache Spark autoscaling V2

גרסה 2 (V2) של Managed Service for Apache Spark עם שינוי גודל אוטומטי מוסיפה תכונות ושיפורים לגרסה 1 (V1) שמוגדרת כברירת מחדל, כדי לעזור לכם לנהל את עומסי העבודה של Managed Service for Apache Spark, לשפר את הביצועים של עומסי העבודה ולחסוך בעלויות:

  • הקטנת קנה מידה אסינכרונית של צמתים: ב-Autoscaling V2, הקטנת קנה מידה אסינכרונית מחליפה את הקטנת קנה מידה סינכרונית של V1. באמצעות הקטנת קנה מידה אסינכרונית, Managed Service for Apache Spark מקטין את קנה המידה של משאבי עומס העבודה בלי לחכות שכל הצמתים יסיימו את ההעברה של הנתונים. המשמעות היא שצמתי זנב ארוך שמתכווצים לאט לא יחסמו את ההגדלה.
  • בחירה חכמה של צמתים להקטנת קנה המידה: ב-Autoscaling V2, במקום בחירה אקראית של צמתים כמו ב-V1, נעשה שימוש באלגוריתם חכם שמזהה את הצמתים הכי טובים להקטנת קנה המידה. האלגוריתם הזה לוקח בחשבון גורמים כמו גודל הנתונים של ערבוב הצמתים וזמן ההמתנה שלהם.
  • התנהגות ניתנת להגדרה של השבתה הדרגתית של Spark והעברת shuffle: ב-Autoscaling V2 אפשר להשתמש במאפייני Spark רגילים כדי להגדיר השבתה הדרגתית של Spark והעברת shuffle. התכונה הזו יכולה לעזור לכם לשמור על תאימות להעברה עם נכסי Spark מותאמים אישית.

תכונות של התאמה אוטומטית לעומס (autoscaling) ב-Managed Service for Apache Spark

תכונה ‫Managed Service for Apache Spark Autoscaling V1 Managed Service for Apache Spark Autoscaling V2
הורדת עומס בצומת סינכרוני אסינכרוני
בחירת צומת להקטנת הקיבולת אקראי חכם
צמצום הדרגתי של כמות השרתים של Spark והעברה של נתונים לא ניתן להגדרה ניתן להגדרה

מאפייני הקצאה דינמית ב-Spark

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

מאפיין (property) תיאור ברירת מחדל
spark.dataproc.scaling.version גרסת ההתאמה האוטומטית לעומס (autoscaling) של Managed Service for Apache Spark. מציינים את הגרסה 1 או 2. 1
spark.dynamicAllocation.enabled האם להשתמש בהקצאת משאבים דינמית, שמגדילה או מקטינה את מספר תהליכי הביצוע בהתאם לעומס העבודה. הגדרת הערך ל-false משביתה את שינוי הגודל האוטומטי של עומס העבודה. ברירת מחדל: true. true
spark.dynamicAllocation.initialExecutors מספר המבצעים הראשוני שהוקצה לעומס העבודה. אחרי שהעומס מתחיל, יכול להיות שהשינוי האוטומטי של קנה המידה ישנה את מספר המבצעים הפעילים. הערך המינימלי הוא 2, והערך המקסימלי הוא 2000. 2
spark.dynamicAllocation.minExecutors המספר המינימלי של תהליכי הפעלה שאליו אפשר לצמצם את עומס העבודה. הערך המינימלי הוא 2. 2
spark.dynamicAllocation.maxExecutors המספר המקסימלי של מנועי ביצוע שאליהם אפשר להגדיל את עומס העבודה. הערך המקסימלי הוא 2000. 1000
spark.dynamicAllocation.executorAllocationRatio התאמה אישית של הגדלת נפח העבודה של Spark. אפשר להזין ערך בין 0 לבין 1. הערך 1.0 מספק יכולת מקסימלית להרחבת קנה המידה ועוזר להשיג מקסימום מקביליות. הערך 0.5 מגדיר את היכולת להרחבת קנה מידה ואת המקביליות למחצית מהערך המקסימלי. 0.3
spark.dynamicAllocation.diagnosis.enabled כש-true, פרטי האבחון נרשמים ביומן אם מספר המפעילים הפעילים חורג ממספר המפעילים המקסימלי הנדרש לתקופה שצוינה על ידי spark.dynamicAllocation.diagnosis.interval. האבחון כולל סיכום של מנוע ההפעלה עם מספר מנועי הפעלה בלי פעילות ואחוזונים של זמן ההמתנה, חלוקת משימות פעילות, גודל נתוני הערבוב וגודל ה-RDD שנשמר במטמון. משתמשים ב-spark.dynamicAllocation.diagnosis.logLevel כדי לשלוט ברמת היומן של הפלט. false
spark.dynamicAllocation.profile מגדירים את הערך performance או cost כדי להחיל קבוצה מוגדרת מראש של הגדרות שעברו אופטימיזציה לביצועים או ליעילות מבחינת עלות. מאפיינים שהוגדרו על ידי המשתמש משנים את ברירות המחדל של הפרופיל. פרטים נוספים זמינים במאמר בנושא פרופילים של הקצאה דינמית ב-Spark. none
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled כשמגדירים את true, מופעל חישוב דינמי של זמן קצוב לתהליך עבור רכיבי Executor שמחזיקים נתונים של ערבוב. במקום להשתמש בערך הסטטי spark.dynamicAllocation.shuffleTracking.timeout, זמן הקצוב לתפוגה מחושב על סמך כמות הנתונים של הערבוב שמאוחסנים ב-executor. כך אפשר לשחרר מהר יותר תהליכי הפעלה עם ערבובים קטנים, ולהשאיר תהליכי הפעלה עם ערבובים גדולים פעילים למשך זמן ארוך יותר. false
spark.reducer.fetchMigratedShuffle.enabled אם ההגדרה היא true, המערכת מאפשרת לאחזר את מיקום הפלט של הערבוב ממנהל ההתקן של Spark אחרי שאחזור נכשל מ-executor שהוצא משימוש בגלל הקצאה דינמית של Spark. כך מצטמצמות שגיאות ExecutorDeadException שנגרמות מהעברת בלוקים אקראית משרתי ביצוע שהוצאו משימוש לשרתי ביצוע פעילים, וגם מצטמצמים הניסיונות החוזרים של שלבים שנגרמים משגיאות FetchFailedException (ראו FetchFailedException caused by ExecutorDeadException). המאפיין הזה זמין ב-Managed Service for Apache Spark בגרסאות של זמן הריצה של Spark 1.1.12 ואילך ו-2.0.20 ואילך. false
spark.scheduler.excludeShuffleSkewExecutors כש-true, הוא נמנע מתזמון משימות ב-executors עם הטיה של shuffle, שהם executors עם כמות גדולה של נתוני shuffle או מספר גדול של משימות map שהושלמו. כך אפשר לשפר את הביצועים על ידי צמצום ההטיה של ערבוב הנכסים. false

פרופילים של הקצאה דינמית ב-Spark

אתם יכולים להגדיר את המאפיין spark.dynamicAllocation.profile לערך performance או cost כדי להחיל קבוצה מוגדרת מראש של הגדרות Spark שעברו אופטימיזציה לביצועים או ליעילות מבחינת עלות. אם מגדירים מאפייני Spark בנוסף להגדרת המאפיין spark.dynamicAllocation.profile, ההגדרות האלה יחליפו את הגדרות ברירת המחדל של הפרופיל עבור המאפיינים האלה.

ביצועים: הפרופיל הזה מותאם לזמן ביצוע מינימלי על ידי החלת הגדרות ברירת המחדל הבאות:

  • spark.scheduler.excludeShuffleSkewExecutors: true
  • spark.dynamicAllocation.executorIdleTimeout: ‏300s
  • spark.dynamicAllocation.initialExecutors: 10

cost: הפרופיל הזה מבצע אופטימיזציה לצמצום צריכת המשאבים על ידי החלת הגדרות ברירת המחדל הבאות:

  • spark.dynamicAllocation.executorIdleTimeout: 120s
  • spark.dynamicAllocation.cachedExecutorIdleTimeout: ‏120s
  • spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled: ‏true
  • spark.dynamicAllocation.diagnosis.enabled: true

מדדים של הקצאה דינמית ב-Spark

עומסי עבודה של Spark batch יוצרים את המדדים הבאים שקשורים להקצאת משאבים דינמית של Spark (למידע נוסף על מדדים של Spark, ראו מעקב וניתוח).

מדד תיאור
maximum-needed המספר המקסימלי של תהליכי הפעלה שנדרשים בעומס הנוכחי כדי לבצע את כל המשימות הפעילות והממתינות.
running מספר המבצעים הפעילים שמבצעים משימות.

בעיות בהקצאה דינמית ב-Spark ופתרונות

  • FetchFailedException caused by ExecutorDeadException

    הסיבה: כש-Spark dynamic allocation מצמצם את גודל המבצע, קובץ ה-shuffle מועבר למבצעים פעילים. עם זאת, מכיוון שמשימת ה-reducer של Spark ב-executor מאחזרת את הפלט של ה-shuffle מהמיקום שהוגדר על ידי ה-driver של Spark כשהמשימה התחילה, אם קובץ ה-shuffle מועבר, ה-reducer יכול להמשיך לנסות לאחזר את הפלט של ה-shuffle מ-executor שהוצא משימוש, ולגרום לשגיאות ExecutorDeadException ו-FetchFailedException.

    פתרון: מפעילים את האפשרות לאחזור מחדש של מיקום הערבוב על ידי הגדרת הערך spark.reducer.fetchMigratedShuffle.enabled ל-true כשמריצים את עומס העבודה של אצווה ב-Managed Service for Apache Spark (ראו הגדרת מאפיינים של עומס עבודה של אצווה ב-Spark). כשהמאפיין הזה מופעל, משימת ה-reducer מאחזרת מחדש את מיקום הפלט של ה-shuffle מה-driver אחרי שאחזור מ-executor שהוצא משימוש נכשל.