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

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

בעיות בהקצאה דינמית ב-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 שהוצא משימוש נכשל.