התאמה אוטומטית לעומס (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:truespark.dynamicAllocation.executorIdleTimeout: 300sspark.dynamicAllocation.initialExecutors:10
cost: הפרופיל הזה מבצע אופטימיזציה להפחתת צריכת המשאבים על ידי החלת הגדרות ברירת המחדל הבאות:
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout: 120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled: truespark.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 שהוצא משימוש.