התאמה אוטומטית לעומס (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: 120sspark.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 שהוצא משימוש.