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