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