התכונה "התאמה אוטומטית של קנה המידה לרוחב" מאפשרת ל-Dataflow לבחור את המספר המתאים של מכונות ה-worker למשימה, ולהוסיף או להסיר מכונות worker לפי הצורך. ההתאמה לעומס ב-Dataflow מבוססת על ניצול ה-CPU הממוצע של ה-workers ועל המקביליות של צינור עיבוד הנתונים. ההקבלה של צינור עיבוד נתונים היא הערכה של מספר ה-threads שנדרשים כדי לעבד נתונים בצורה היעילה ביותר בכל זמן נתון.
התאמה לעומס (autoscaling) אופקית נתמכת גם בצינורות עיבוד נתונים באצווה וגם בפייפליין זורם.
התאמה אוטומטית לעומס (autoscaling) של Batch
התכונה "התאמה אופקית של קנה המידה" מופעלת כברירת מחדל בכל צינורות עיבוד הנתונים באצווה. Dataflow בוחר באופן אוטומטי את מספר ה-workers על סמך כמות העבודה הכוללת המשוערת בכל שלב בצינור עיבוד הנתונים. ההערכה הזו תלויה בגודל הקלט ובקצב העיבוד הנוכחי. כל 30 שניות, Dataflow מעריך מחדש את כמות העבודה בהתאם להתקדמות הביצוע. ככל שכמות העבודה הכוללת המשוערת עולה או יורדת, Dataflow מגדיל או מקטין באופן דינמי את מספר ה-workers.
מספר העובדים הוא תת-לינארי לכמות העבודה. לדוגמה, במשימה עם כמות עבודה כפולה יש פחות מכמות כפולה של עובדים.
אם מתקיים אחד מהתנאים הבאים, Dataflow שומר על מספר ה-workers או מקטין אותו כדי לחסוך במשאבים לא פעילים:
- השימוש הממוצע של ה-worker ב-CPU נמוך מ-5%.
- המקביליות מוגבלת בגלל עבודה שלא ניתנת להקבלה, כמו נתונים שלא ניתנים לפיצול בגלל קבצים דחוסים או מודולים של קלט/פלט שלא מתפצלים.
- רמת ההקבלה קבועה, למשל כשכותבים לקבצים קיימים ב-Cloud Storage.
כדי להגדיר גבול עליון למספר ה-workers, מגדירים את אפשרות צינור עיבוד הנתונים --maxNumWorkers.
ערך ברירת המחדל הוא 2,000.
כדי להגדיר גבול תחתון למספר ה-workers, מגדירים את אפשרות השירות --dataflow-service-options=min_num_workers.
הדגלים האלה הם אופציונליים.
התאמה אוטומטית לעומס בסטרימינג
במשימות סטרימינג, התאמה אופקית לעומס מאפשרת ל-Dataflow לשנות באופן דינמי את מספר ה-workers בהתאם לשינויים בעומס ובניצול המשאבים.
כברירת מחדל, התאמה אוטומטית לעומס (autoscaling) אופקית מופעלת במשימות סטרימינג שמשתמשות ב-Streaming Engine. כדי להפעיל התאמה אופקית לעומס (Horizontal Autoscaling) במשימות סטרימינג שלא משתמשות במנוע סטרימינג, מגדירים את האפשרויות הבאות של צינור עיבוד הנתונים כשמפעילים את צינור עיבוד הנתונים:
Java
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
מחליפים את MAX_WORKERS במספר המקסימלי של מכונות ה-worker.
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
מחליפים את MAX_WORKERS במספר המקסימלי של מכונות ה-worker.
המשך
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
מחליפים את MAX_WORKERS במספר המקסימלי של מכונות ה-worker.
כדי להגדיר גבול תחתון למספר ה-workers, מגדירים את אפשרות השירות --dataflow-service-options=min_num_workers. כשמגדירים את הערך הזה, ההתאמה האוטומטית של קנה המידה לא תפחית את מספר ה-workers מתחת למספר שצוין. הדגל הזה הוא אופציונלי.
במשימות סטרימינג שמשתמשות ב-Streaming Engine, אפשר גם להגדיר סף לצבר המשימות על ידי הגדרה של רמת זמן אחזור.
במשימת סטרימינג שכבר פועלת, אפשר לעדכן את מספר העובדים המינימלי, מספר העובדים המקסימלי או את רמת זמן האחזור באמצעות עדכון משימה תוך כדי ריצה. כדי לשנות את ההגדרות, מגדירים את הדגלים min-num-workers, max-num-workers או latency-tier. מידע נוסף זמין במאמר כוונון של התאמה אוטומטית לעומס אופקית בצינורות עיבוד נתונים בסטרימינג.
השבתת התאמה אוטומטית אופקית לעומס (Horizontal Autoscaling)
כדי להשבית את ההתאמה האוטומטית לעומס (autoscaling) האופקית, מגדירים את האפשרות הבאה של פייפליין כשמריצים את המשימה.
Java
--autoscalingAlgorithm=NONE
אם משביתים את ההתאמה האופקית של קנה המידה, Dataflow מגדיר את מספר ה-workers על סמך האפשרות --numWorkers.
Python
--autoscaling_algorithm=NONE
אם משביתים את ההתאמה האופקית של קנה המידה, מספר ה-workers ב-Dataflow נקבע לפי האפשרות --num_workers.
המשך
--autoscaling_algorithm=NONE
אם משביתים את ההתאמה האופקית של קנה המידה, מספר ה-workers ב-Dataflow נקבע לפי האפשרות --num_workers.
מקורות בהתאמה אישית
אם אתם יוצרים מקור נתונים בהתאמה אישית, יכול להיות שתוכלו לשפר את הביצועים על ידי הטמעת שיטות שמספקות מידע נוסף לאלגוריתם של התאמה לעומס אופקית:
Java
מקורות מוגבלים
- במחלקה המשנית
BoundedSource, מטמיעים את ה-methodgetEstimatedSizeBytes. שירות Dataflow משתמש ב-getEstimatedSizeBytesכדי לחשב את המספר הראשוני של ה-workers שצריך להשתמש בהם בצינור עיבוד הנתונים. - במחלקה המשנית
BoundedReader, מטמיעים את ה-methodgetFractionConsumed. שירות Dataflow משתמש ב-getFractionConsumedכדי לעקוב אחרי התקדמות הקריאה ולהתכנס למספר הנכון של ה-workers שבהם צריך להשתמש במהלך הקריאה.
מקורות לא מוגבלים
המקור צריך להודיע לשירות Dataflow על צבר המשימות.
הצבר הוא אומדן של הקלט בבייטים שעדיין לא עובד על ידי המקור. כדי להודיע לשירות על צבר משימות, צריך להטמיע אחת מהשיטות הבאות בכיתה UnboundedReader.
-
getSplitBacklogBytes()– צבר המשימות של הפיצול הנוכחי של המקור. השירות צובר את הנתונים של כל הפיצולים. -
getTotalBacklogBytes()– צבר ההזמנות הגלובלי בכל הפיצולים. במקרים מסוימים, צבר ההזמנות לא זמין לכל פיצול, ואפשר לחשב אותו רק בכל הפיצולים. רק הפיצול הראשון (מזהה פיצול "0") צריך לספק את סך כל הנתונים בצבר ההזמנות.
מאגר Apache Beam מכיל כמה דוגמאות למקורות מותאמים אישית שמטמיעים את המחלקה UnboundedReader.
Python
מקורות מוגבלים
- במחלקה המשנית
BoundedSource, מטמיעים את ה-methodestimate_size. שירות Dataflow משתמש ב-estimate_sizeכשהוא מחשב את המספר הראשוני של ה-workers שצריך להשתמש בהם בצינור עיבוד הנתונים. - במחלקה המשנית
RangeTracker, מטמיעים את ה-methodfraction_consumed. שירות Dataflow משתמש ב-fraction_consumedכדי לעקוב אחרי התקדמות הקריאה ולהתכנס למספר הנכון של ה-workers שבהם צריך להשתמש במהלך הקריאה.
המשך
מקורות מוגבלים
- ב-
RangeTracker, מטמיעים את ה-methodGetProgress(). שירות Dataflow משתמש ב-GetProgressכדי לעקוב אחרי התקדמות הקריאה ולהתכנס למספר הנכון של ה-workers שבהם צריך להשתמש במהלך הקריאה.
מגבלות
- במשימות שפועלות ב-Dataflow Prime, ההתאמה האופקית לעומס מושבתת במהלך ההתאמה האנכית לעומס ועד 10 דקות אחריה. מידע נוסף זמין במאמר ההשפעה על התאמה אופקית לעומס (Horizontal Autoscaling).
- בצינורות עיבוד נתונים שלא משתמשים בארגון נתונים של Dataflow, יכול להיות ש-Dataflow לא יוכל לצמצם את מספר ה-workers בצורה יעילה, כי יכול להיות שה-workers ארגנו נתונים שמאוחסנים בדיסקים מקומיים.
- הטרנספורמציה PeriodicImpulse נתמכת עם התאמה אוטומטית לעומס (scaling) בסטרימינג ב-Apache Beam SDK בגרסאות 2.60.0 ואילך. אם בצינור עיבוד הנתונים משתמשים ב-
PeriodicImpulseעם גרסת SDK קודמת, ה-workers של Dataflow לא מצטמצמים אנכית בהתאם לעומס (scale down) כמו שצריך.