התאמה אוטומטית לעומס (autoscaling) ב-Serverless for Apache Spark

במסמך הזה מפורט מידע על התאמה אוטומטית לעומס ב- Google Cloud Serverless for Apache Spark. כששולחים את עומס העבודה של Spark, ‏ Serverless for Apache Spark יכול להגדיל או להקטין באופן דינמי את המשאבים של עומס העבודה, כמו מספר תהליכי הביצוע, כדי להריץ את עומס העבודה בצורה יעילה. התנהגות ברירת המחדל של Serverless (בלי שרת) ל-Apache Spark היא שימוש בהקצאת משאבים דינמית של Spark כדי לקבוע אם, איך ומתי לשנות את גודל עומס העבודה.

שינוי קנה מידה אוטומטי בגרסה 2 של Serverless for Apache Spark

גרסה 2 (V2) של Serverless (בלי שרת) ל-Apache Spark עם שינוי קנה מידה אוטומטי מוסיפה תכונות ושיפורים לגרסה 1 (V1) שמוגדרת כברירת מחדל, כדי לעזור לכם לנהל עומסי עבודה של Serverless ל-Apache Spark, לשפר את הביצועים של עומסי העבודה ולחסוך בעלויות:

  • הקטנת קנה מידה אסינכרונית של צמתים: ב-Autoscaling V2, הקטנת קנה מידה סינכרונית של V1 מוחלפת בהקטנת קנה מידה אסינכרונית. באמצעות הקטנת קנה מידה אסינכרונית, ‏Serverless (בלי שרת) ל-Apache Spark מקטין את קנה המידה של משאבי עומס העבודה בלי לחכות שכל הצמתים יסיימו את ההעברה של הנתונים. המשמעות היא שצמתים עם זנב ארוך שמתרחבים לאט לא יחסמו את ההרחבה.
  • בחירה חכמה של צמתים להקטנה אוטומטית לעומס: ב-התאמה אוטומטית לעומס V2, במקום בחירה אקראית של צמתים כמו ב-V1, נעשה שימוש באלגוריתם חכם שמזהה את הצמתים הכי טובים להקטנה אוטומטית לעומס קודם. האלגוריתם הזה לוקח בחשבון גורמים כמו גודל הנתונים של ערבוב הצמתים וזמן ההמתנה שלהם.
  • התנהגות ניתנת להגדרה של השבתה הדרגתית של Spark והעברת shuffle: ב-Autoscaling V2 אפשר להשתמש במאפייני Spark רגילים כדי להגדיר השבתה הדרגתית של Spark והעברת shuffle. התכונה הזו יכולה לעזור לכם לשמור על תאימות המיגרציה עם נכסי Spark בהתאמה אישית.

תכונות של התאמה אוטומטית לעומס ב-Serverless for Apache Spark

תכונה ‫Serverless (בלי שרת) ל-Apache Spark Autoscaling V1 ‫Serverless (בלי שרת) ל-Apache Spark Autoscaling V2
הורדת עומס בצומת סינכרוני אסינכרוני
בחירת צומת להקטנת קנה מידה אקראי חכם
צמצום הדרגתי של כמות השרתים של Spark והעברה של נתונים בין שרתי Shuffle לא ניתן להגדרה ניתן להגדרה

מאפייני הקצאה דינמית של Spark

בטבלה הבאה מפורטים מאפייני ההקצאה הדינמית של Spark שאפשר להגדיר כששולחים עומס עבודה של אצווה כדי לשלוט בהתאמה אוטומטית לעומס (ראו איך מגדירים מאפייני Spark).

מאפיין (property) תיאור ברירת מחדל
spark.dataproc.scaling.version גרסת ההתאמה האוטומטית לעומס של Spark ב-Serverless for Apache Spark. מציינים את הגרסה 1 או 2 (ראו התאמה אוטומטית לעומס (automatic scaling) בגרסה 2 של בלי שרת (serverless) ל-Apache Spark). 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.reducer.fetchMigratedShuffle.enabled אם ההגדרה היא true, המערכת מאפשרת לאחזר את מיקום הפלט של הערבוב ממנהל ההתקן של Spark אחרי שהאחזור נכשל ממבצע שהוצא משימוש בגלל הקצאה דינמית של Spark. כך מצטמצמות שגיאות ExecutorDeadException שנגרמות מהעברת בלוקים אקראית ממבצעים שהוצאו משימוש למבצעים פעילים, וגם מצטמצמים הניסיונות החוזרים של שלבים שנגרמים משגיאות FetchFailedException (ראו FetchFailedException caused by ExecutorDeadException). המאפיין הזה זמין ב-Serverless for Apache Spark בגרסאות של Spark runtime‏ 1.1.12 ואילך ו-2.0.20 ואילך. false

מדדים של הקצאה דינמית ב-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 כשמריצים את עומס העבודה של אצווה Serverless for Apache Spark (ראו הגדרה של מאפייני עומס עבודה של אצווה Spark). כשהמאפיין הזה מופעל, משימת ה-reducer מאחזרת מחדש את מיקום הפלט של ה-shuffle מה-driver אחרי שאחזור מ-executor שהוצא משימוש נכשל.