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

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

גרסה 2 של התאמה לעומס (autoscaling) ב-Managed Service for Apache Spark

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

  • הקטנת קנה מידה אסינכרונית של צמתים: בגרסה 2 של ההתאמה האוטומטית לעומס, הקטנת קנה המידה הסינכרונית של גרסה 1 הוחלפה בהקטנת קנה מידה אסינכרונית. באמצעות הקטנת קנה מידה אסינכרונית, Managed Service for Apache Spark מקטין את קנה המידה של משאבי עומס העבודה בלי לחכות שכל הצמתים יסיימו את העברת ה-shuffle. המשמעות היא שצמתים של זנב ארוך שמצטמצמים אנכית בהתאם לעומס (scale down) לא יחסמו את ההגדלה האנכית בהתאם לעומס (scale up).
  • בחירה חכמה של צמתים לצמצום אנכי בהתאם לעומס (scale down): בגרסה 2 של ההתאמה האוטומטית לעומס, הבחירה האקראית של צמתים בגרסה 1 מוחלפת באלגוריתם חכם שמזהה את הצמתים שהכי מתאימים לצמצום אנכי בהתאם לעומס (scale down) קודם. האלגוריתם הזה מביא בחשבון גורמים כמו גודל הנתונים של הצומת לערבוב וזמן חוסר הפעילות.
  • התנהגות ניתנת להגדרה של צמצום הדרגתי של כמות השרתים ב-Spark והעברת נתונים ב-Shuffle: בגרסה 2 של התאמה לעומס (Autoscaling) אפשר להשתמש במאפיינים סטנדרטיים של Spark כדי להגדיר צמצום הדרגתי של כמות השרתים ב-Spark והעברת נתונים ב-Shuffle. התכונה הזו יכולה לעזור לכם לשמור על תאימות של המיגרציה עם מאפייני Spark בהתאמה אישית.

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

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

מאפייני ההקצאה הדינמית של Spark

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

מאפיין (property) תיאור ברירת מחדל
spark.dataproc.scaling.version גרסת ההתאמה לעומס (autoscaling) של Managed Service for Apache Spark. צריך לציין את הגרסה 1 או 2. 1
spark.dynamicAllocation.enabled האם להשתמש בהקצאת משאבים דינמית, שמשנה את מספר ה-executors בהתאם לעומס העבודה. אם מגדירים את הערך ל-false, ההתאמה האוטומטית לעומס מושבתת בעומס העבודה. ברירת המחדל: true. true
spark.dynamicAllocation.initialExecutors מספר ה-executors הראשוני שהוקצה לעומס העבודה. אחרי שעומס העבודה מתחיל, יכול להיות שההתאמה האוטומטית לעומס תשנה את מספר ה-executors הפעילים. הערך המינימלי הוא 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 מוגדר, פרטי האבחון נרשמים ביומן אם מספר ה-executors שפועלים חורג מהמספר המקסימלי שנדרש לתקופה שצוינה במאפיין spark.dynamicAllocation.diagnosis.interval. האבחון כולל סיכום של מנהלי הביצוע עם אחוזונים של מספר מנהלי הביצוע הלא פעילים וזמן חוסר הפעילות, התפלגות המשימות הפעילות, גודל הנתונים של ה-shuffle וגודל ה-RDD במטמון. אפשר להשתמש ב-spark.dynamicAllocation.diagnosis.logLevel כדי לשלוט ברמת יומן הפלט. false
spark.dynamicAllocation.profile מגדירים את הערך performance או cost כדי להחיל קבוצה מוגדרת מראש של הגדרות אישיות שעברו אופטימיזציה לביצועים או ליעילות מבחינת עלות. מאפיינים שהוגדרו על ידי המשתמש מבטלים את ברירות המחדל של הפרופיל. פרטים נוספים זמינים במאמר פרופילים של הקצאה דינמית ב-Spark. none
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled כשהערך הוא true, מופעל חישוב דינמי של זמן קצוב לתפוגה של מנהלי משימות שמכילים נתוני ערבוב. במקום להשתמש בערך הסטטי spark.dynamicAllocation.shuffleTracking.timeout, זמן הקצוב לתפוגה מחושב על סמך כמות הנתונים של ה-shuffle שמאוחסנים ב-executor. כך אפשר לשחרר מהר יותר את ה-executors עם ה-shuffles הקטנים, ולהשאיר את ה-executors עם ה-shuffles הגדולים פעילים למשך זמן ארוך יותר. false
spark.reducer.fetchMigratedShuffle.enabled כשהערך הוא true, אפשר לאחזר את מיקום הפלט של ה-shuffle ממנהל ההתקן של Spark אחרי שאחזור נכשל מ-executor שהוצא משימוש בגלל הקצאה דינמית של Spark. כך אפשר לצמצם את השגיאות מסוג ExecutorDeadException שנגרמות בגלל העברה של בלוקים של ערבוב (shuffle) ממבצעים שהוצאו משימוש למבצעים פעילים, ולהפחית את מספר הניסיונות החוזרים של שלבים שנגרמים בגלל שגיאות מסוג FetchFailedException (ראו FetchFailedException caused by ExecutorDeadException). המאפיין הזה זמין ב-Managed Service for Apache Spark בגרסאות סביבת זמן הריצה של Spark 1.1.12 ואילך ו-2.0.20 ואילך. false
spark.scheduler.excludeShuffleSkewExecutors כשהערך הוא true, המערכת נמנעת מתזמון משימות ב-executors עם הטיה של ערבוב, שהם executors עם כמות גדולה של נתוני ערבוב או מספר גדול של משימות מיפוי שהושלמו. כך אפשר לשפר את הביצועים על ידי צמצום ההטיה של ה-shuffle. false

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

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

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

  • ‫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 באצווה יוצרים את המדדים הבאים שקשורים להקצאת משאבים דינמית של Spark (למידע נוסף על מדדי Spark, ראו מעקב וכלים).

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

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

  • ‫FetchFailedException שנגרם על ידי ExecutorDeadException

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

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