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

התאמה אוטומטית לעומס (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: גרסה 2 של התאמה אוטומטית לעומס מאפשרת להשתמש במאפיינים סטנדרטיים של Spark כדי להגדיר צמצום הדרגתי של כמות השרתים והעברת נתונים ב-Spark. התכונה הזו יכולה לעזור לכם לשמור על תאימות של המיגרציה עם מאפייני Spark בהתאמה אישית.

תכונות של התאמה אוטומטית לעומס (autoscaling) ב-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 גרסת ההתאמה האוטומטית לעומס של 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 הפועלים חורג ממספר ה-executors המקסימלי הדרוש לתקופה שצוינה על ידי spark.dynamicAllocation.diagnosis.interval. האבחון כולל סיכום של ה-executor עם אחוזונים של מספר ה-executors הלא פעילים וזמן חוסר הפעילות, התפלגות המשימות הפעילות, גודל הנתונים של ה-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 אחרי שאחזור נכשל ממבצע שהוצא משימוש בגלל הקצאה דינמית של Spark. כך אפשר לצמצם את השגיאות מסוג ExecutorDeadException שנגרמות בגלל העברה של בלוקים של shuffle מ-executors שהוצאו משימוש ל-executors פעילים, ולצמצם את מספר הניסיונות החוזרים של שלבים שנגרמים בגלל שגיאות מסוג FetchFailedException (ראו FetchFailedException caused by ExecutorDeadException). המאפיין הזה זמין ב-Managed Service for Apache Spark בגרסאות של סביבת זמן הריצה של Spark 1.1.12 ואילך ו-2.0.20 ואילך. false
spark.scheduler.excludeShuffleSkewExecutors כשהערך הוא true, המערכת נמנעת מתזמון משימות ב-executors עם הטיה של ערבוב, שהם executors עם כמות גדולה של נתוני ערבוב או מספר גדול של משימות מיפוי שהושלמו. כך אפשר לשפר את הביצועים על ידי הפחתת ההטיה בערבוב. 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 מה-driver, אחרי שנכשל אחזור מ-executor שהוצא משימוש.