במאמר הזה מוסבר על שינוי גודל אוטומטי בשירות מנוהל ל-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 מותאמים אישית.
תכונות של קנה מידה אוטומטי ב-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 אחרי שהאחזור נכשל ממבצע שהוצא משימוש בגלל הקצאה דינמית של 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: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 |
מספר המבצעים הפעילים שמבצעים משימות. |
בעיות בהקצאה דינמית ב-Spark ופתרונות
FetchFailedException caused by ExecutorDeadException
הסיבה: כש-Spark dynamic allocation מצמצם את גודל המבצע, קובץ ה-shuffle מועבר למבצעים פעילים. עם זאת, מכיוון שמשימת ה-reducer של Spark ב-executor מאחזרת את הפלט של ה-shuffle מהמיקום שהוגדר על ידי ה-driver של Spark כשהמשימה של ה-reducer התחילה, אם קובץ ה-shuffle מועבר, ה-reducer יכול להמשיך לנסות לאחזר את הפלט של ה-shuffle מ-executor שהוצא משימוש, ולגרום לשגיאות
ExecutorDeadExceptionו-FetchFailedException.פתרון: מפעילים את האפשרות לאחזור מחדש של מיקום הערבוב על ידי הגדרת הערך
spark.reducer.fetchMigratedShuffle.enabledל-trueכשמריצים את עומס העבודה של אצווה של Managed Service for Apache Spark (ראו הגדרת מאפיינים של עומס עבודה של אצווה של Spark). כשהמאפיין הזה מופעל, משימת ה-reducer מאחזרת מחדש את מיקום הפלט של ה-shuffle מה-driver אחרי שאחזור מ-executor שהוצא משימוש נכשל.