התכונה התאמה נכונה משתמשת ברמזים למשאבים של Apache Beam כדי להתאים אישית את משאבי העובדים לצינור עיבוד נתונים. היכולת לטרגט כמה משאבים שונים לשלבים ספציפיים בצינור עיבוד הנתונים מספקת גמישות ויכולות נוספות, וגם חיסכון פוטנציאלי בעלויות. אתם יכולים להקצות משאבים יקרים יותר לשלבים בצינור עיבוד הנתונים שדורשים אותם, ומשאבים זולים יותר לשלבים אחרים. אפשר להשתמש בהתאמה הנכונה כדי לציין את דרישות המשאבים עבור צינור עיבוד נתונים שלם או עבור שלבים ספציפיים בצינור עיבוד הנתונים.
תמיכה ומגבלות
- הנחיות למשאבים נתמכות ב-Apache Beam Java וב-Python SDK, בגרסאות 2.31.0 ואילך.
- התאמה נכונה נתמכת בצינורות עיבוד נתונים באצווה.
התאמה נכונה נתמכת בצינורות סטרימינג עם שינוי גודל אוטומטי אופקי מופעל.
- כדי להפעיל את התכונה, מגדירים את אפשרות צינור עיבוד הנתונים
--experiments=enable_streaming_rightfitting.
- כדי להפעיל את התכונה, מגדירים את אפשרות צינור עיבוד הנתונים
התאמה נכונה תומכת ב-Dataflow Prime.
התאמה נכונה לא תומכת ב-FlexRS.
כשמשתמשים בהתאמה נכונה, לא משתמשים ב
worker_acceleratorאפשרות השירות.כשמשתמשים בשינוי קנה מידה אנכי, אי אפשר להשתמש בבחירה אוטומטית של מכונות וירטואליות.
הפעלת התאמה לימין
כדי להפעיל את ההתאמה הנכונה, משתמשים באחד או יותר מהרמזים הזמינים למשאבים בצינור עיבוד הנתונים. כשמשתמשים ברמז למשאב בצינור, התאמה נכונה מופעלת באופן אוטומטי. למידע נוסף, קראו את הקטע שימוש ברמזים למשאבים במסמך הזה.
רמזים זמינים למשאבים
אלה הרמזים למשאבים שזמינים.
| רמז למשאב | תיאור |
|---|---|
min_ram |
הכמות המינימלית של זיכרון RAM בגיגה-בייט שצריך להקצות לעובדים. Dataflow משתמש בערך הזה כגבול תחתון כשמקצים זיכרון ל-workers חדשים (התאמה אופקית לעומס) או ל-workers קיימים (התאמה אנכית לעומס). לדוגמה: min_ram=RAM_VALUEGB
|
cpu_count |
מספר המעבדים הווירטואליים שצריך להקצות לכל וורקר. כשמשתמשים בהנחיה הזו למשאב, Dataflow בוחר סוגי מכונות עם מספר ה-vCPU שצוין שעומדים בדרישות הזיכרון. לדוגמה: cpu_count=CPU_VALUE
|
accelerator |
הקצאה של מעבדים גרפיים שסופקה על ידי המשתמש, שמאפשרת לכם לשלוט בשימוש במעבדים גרפיים ובעלות שלהם בצינור עיבוד הנתונים ובשלבים שלו. מציינים את הסוג והמספר של מעבדי ה-GPU שרוצים לצרף ל-workers של Dataflow כפרמטרים לדגל. לדוגמה: accelerator="type:GPU_TYPE;count:GPU_COUNT;machine_type:MACHINE_TYPE;CONFIGURATION_OPTIONS"
מידע נוסף על שימוש ביחידות GPU זמין במאמר בנושא יחידות GPU ב-Dataflow. |
בחירה אוטומטית של מכונות וירטואליות לסוגי מכונות של וורקרים
כשמשתמשים בהנחיות למשאבים min_ram או cpu_count בשלבים של צינור עיבוד הנתונים שלא דורשים מאיצים, הבחירה האוטומטית של מכונות וירטואליות מופעלת באופן אוטומטי.
כשמשתמשים בבחירה אוטומטית של מכונות וירטואליות, ה-workers מוקצים מתוך מבחר של סוגי מכונות שתואמים לדרישות של צינור עיבוד הנתונים, וכך משפרים את הזמינות של הקיבולת והאמינות.
במאמר בחירה אוטומטית של מכונות וירטואליות מוסבר בפירוט איך פועלת הבחירה האוטומטית של מכונות וירטואליות, מהן המגבלות שלה ומהן ההמלצות לגבי סוגי האחסון.
קינון של רמזים למשאבים
ההנחיות למשאבים מיושמות בהיררכיית הטרנספורמציה של צינור עיבוד הנתונים באופן הבא:
-
min_ram: הערך של הטרנספורמציה מחושב כערך ה-hint הגדול ביותר שלmin_ramמבין הערכים שמוגדרים בטרנספורמציה עצמה ובכל ההורים שלה בהיררכיית הטרנספורמציות.- לדוגמה: אם בהנחיה הפנימית של הטרנספורמציה מוגדר
min_ramשל 16GB, ובהנחיה החיצונית של הטרנספורמציה בהיררכיה מוגדרmin_ramשל 32GB, הנחיה של 32GB תשמש לכל השלבים בטרנספורמציה כולה. - לדוגמה: אם הנחיית טרנספורמציה פנימית מגדירה את
min_ramל-16GB, והנחיית הטרנספורמציה החיצונית בהיררכיה מגדירה אתmin_ramל-8GB, הנחיה של 8GB משמשת לכל השלבים בטרנספורמציה החיצונית שלא נמצאים בטרנספורמציה הפנימית, והנחיה של 16GB משמשת לכל השלבים בטרנספורמציה הפנימית.
- לדוגמה: אם בהנחיה הפנימית של הטרנספורמציה מוגדר
-
accelerator: הערך הפנימי ביותר בהיררכיה של הטרנספורמציה מקבל עדיפות.- דוגמה: אם רמז
acceleratorשל טרנספורמציה פנימית שונה מרמזacceleratorשל טרנספורמציה חיצונית בהיררכיה, הרמזacceleratorשל הטרנספורמציה הפנימית משמש לטרנספורמציה הפנימית.
- דוגמה: אם רמז
רמזים שמוגדרים לצינור כולו מטופלים כאילו הם מוגדרים בהמרת החוץ הנפרדת.
שימוש ברמזים למשאבים
אפשר להגדיר רמזים למשאבים בכל הצינור או בשלבים של הצינור.
הינטים של משאבי פייפליין
אפשר להגדיר רמזים למשאבים בצינור כולו כשמריצים את צינור העיבוד משורת הפקודה.
gcloud
כדי להגדיר רמזים למשאבים כשמריצים צינור עיבוד נתונים עם תבנית Flex, משתמשים בדגל --additional-pipeline-options עם הפקודה gcloud dataflow flex-template run.
השם של אפשרות הצינור תלוי בשפת ה-SDK. לדוגמה, לגבי רמזים למשאבים:
- בצינורות עיבוד נתונים ב-Java, משתמשים ב-
resourceHints. - בצינורות עיבוד נתונים ב-Python, משתמשים ב-
resource_hints.
בדוגמה הבאה מוסבר איך להגדיר רמזים למשאבים כשמריצים צינור עיבוד נתונים של תבנית Flex ב-Java:
gcloud dataflow flex-template run JOB_NAME \
--template-file-gcs-location="gs://TEMPLATE_LOCATION" \
--region="REGION" \
--additional-pipeline-options=resourceHints=min_ram=RAM_VALUEGB \
--additional-pipeline-options=resourceHints=cpu_count=CPU_VALUE \
--parameters ...
בדוגמה הבאה אפשר לראות איך מגדירים רמזים למשאבים כשמריצים צינור של תבנית Flex ב-Python:
gcloud dataflow flex-template run JOB_NAME \
--template-file-gcs-location="gs://TEMPLATE_LOCATION" \
--region="REGION" \
--additional-pipeline-options=resource_hints=min_ram=RAM_VALUEGB \
--additional-pipeline-options=resource_hints=cpu_count=CPU_VALUE \
--parameters ...
Java
להגדרת סביבת Java, ראו יצירת פייפליין של Dataflow באמצעות Java.
בדוגמה הבאה מוסבר איך להגדיר רמזים למשאבים כשמריצים צינור עיבוד נתונים ב-Java:
mvn -Pdataflow-runner compile exec:java \
-Dexec.mainClass=com.example.MyPipeline \
-Dexec.args="--runner=DataflowRunner \
--resourceHints=min_ram=RAM_VALUEGB \
--resourceHints=cpu_count=CPU_VALUE \
..."
Python
כדי להגדיר את סביבת Python, עיינו במדריך של Python.
בדוגמה הבאה אפשר לראות איך מגדירים רמזים למשאבים כשמריצים צינור עיבוד נתונים של Python:
python my_pipeline.py \
--runner=DataflowRunner \
--resource_hints=min_ram=RAM_VALUEGB \
--resource_hints=cpu_count=CPU_VALUE \
...
רמזים למשאבים של שלבים בצינור עיבוד הנתונים
אפשר להגדיר רמזים למשאבים בשלבים של צינור עיבוד הנתונים (טרנספורמציות) באופן פרוגרמטי.
Java
כדי להתקין את Apache Beam SDK ל-Java, קראו את המאמר התקנת Apache Beam SDK.
אפשר להגדיר רמזים למשאבים באופן פרוגרמטי בהמרות של צינורות באמצעות הסיווג ResourceHints.
בדוגמה הבאה מוסבר איך להגדיר באופן פרוגרמטי רמזים למשאבים בטרנספורמציות של צינור עיבוד נתונים.
pcoll.apply(MyCompositeTransform.of(...)
.setResourceHints(
ResourceHints.create()
.withMinRam("15GB")
.withCpuCount(8)
.withAccelerator(
"type:nvidia-l4;count:1;install-nvidia-driver")))
pcoll.apply(ParDo.of(new BigMemFn())
.setResourceHints(
ResourceHints.create()
.withMinRam("30GB")
.withCpuCount(16)))
כדי להגדיר באופן פרוגרמטי רמזים למשאבים בכל הצינור, משתמשים בממשק ResourceHintsOptions.
Python
כדי להתקין את Apache Beam SDK ל-Python, אפשר לעיין במאמר בנושא התקנה של Apache Beam SDK.
אפשר להגדיר רמזים למשאבים באופן פרוגרמטי בהמרות של צינורות באמצעות הסיווג PTransforms.with_resource_hints.
מידע נוסף זמין במאמר הכיתה ResourceHint.
בדוגמה הבאה מוצג איך להגדיר רמזים למשאבים באופן פרוגרמטי בהמרות של צינור עיבוד נתונים.
pcoll | MyPTransform().with_resource_hints(
min_ram="4GB",
cpu_count=8,
accelerator="type:nvidia-tesla-l4;count:1;install-nvidia-driver")
pcoll | beam.ParDo(BigMemFn()).with_resource_hints(
min_ram="30GB",
cpu_count=16)
כדי להגדיר רמזים למשאבים בכל צינור עיבוד הנתונים, משתמשים באפשרות --resource_hints כשמריצים את צינור עיבוד הנתונים. לדוגמה, ראו הנחיות למשאבי צינור עיבוד נתונים.
המשך
אין תמיכה ברמזים למשאבים ב-Go.
תמיכה במספר מאיצים
בתוך צינור עיבוד נתונים, לטרנספורמציות שונות יכולות להיות הגדרות שונות של מאיצים. ההגדרות האלה כוללות הגדרות שדורשות סוגי מכונות שונים. ההגדרות האלה של האצת טרנספורמציות מקבלות קדימות על פני ההגדרות ברמת צינור העיבוד, אם הן סופקו.
התאמה ומיזוג נכונים
במקרים מסוימים, טרנספורמציות שמוגדרות עם רמזים שונים למשאבים יכולות להתבצע ב-workers באותו מאגר של workers, כחלק מתהליך האופטימיזציה של המיזוג. כשטרנספורמציות ממוזגות, Dataflow מריץ אותן בסביבה שעומדת באיחוד של רמזי המשאבים שמוגדרים בטרנספורמציות. במקרים מסוימים, זה כולל את כל הצינור.
אם אי אפשר למזג רמזים למשאבים, לא מתבצע מיזוג. לדוגמה, אי אפשר למזג רמזים למשאבים של GPU שונים, ולכן לא ניתן לבצע מיזוג של טרנספורמציות כאלה.
אפשר גם למנוע מיזוג על ידי הוספת פעולה לצינור עיבוד הנתונים, שמאלצת את Dataflow להמיר PCollection ביניים. האפשרות הזו שימושית במיוחד כשמנסים לבודד משאבים יקרים כמו מעבדים גרפיים או מכונות עם זיכרון גבוה, משלבים איטיים או משלבים שדורשים משאבי מחשוב רבים ולא זקוקים למשאבים המיוחדים האלה. במקרים כאלה, יכול להיות שיהיה כדאי להכריח פיצול של המיזוג בין השלבים האיטיים שמוגבלים על ידי המעבד לבין השלבים שדורשים את המעבדים הגרפיים היקרים או מכונות עם זיכרון גבוה, ולשלם את העלות של יצירת חומר שמשויכת לפיצול המיזוג. מידע נוסף זמין במאמר בנושא מניעת מיזוג.
התאמה לסטרימינג
במשימות סטרימינג, אפשר להפעיל התאמה נכונה על ידי הגדרת אפשרות הצינור --experiments=enable_streaming_rightfitting.
התאמה נכונה יכולה לשפר את הביצועים של צינור עיבוד הנתונים אם הוא כולל שלבים עם דרישות שונות למשאבים.
דוגמה: צינור עיבוד נתונים עם שלב שדורש הרבה משאבי מעבד ושלב שדורש GPU
דוגמה לצינור עיבוד נתונים שיכול להפיק תועלת מהתאמה נכונה היא צינור שמבצע שלב שדורש הרבה משאבי CPU, ואחריו שלב שדורש משאבי GPU. בלי התאמה נכונה, צריך להגדיר מאגר עובדים של GPU אחד כדי להריץ את כל שלבי צינור עיבוד הנתונים, כולל השלב שדורש שימוש אינטנסיבי ב-CPU. זה עלול להוביל לניצול חלקי של משאבי ה-GPU כשמאגר ה-workers מבצע את השלב שדורש שימוש אינטנסיבי ב-CPU.
אם ההתאמה המדויקת מופעלת ומוסיפים רמז למשאב לשלב שדורש GPU, הצינור ייצור שני מאגרים נפרדים, כך שהשלב שדורש הרבה משאבי מעבד יבוצע על ידי מאגר ה-workers של המעבד, והשלב שדורש GPU יבוצע על ידי מאגר ה-workers של ה-GPU.
בפייפליין לדוגמה, בטבלת ההתאמה האוטומטית לעומס אפשר לראות שמאגר ה-workers שמבצע את השלב שדורש הרבה משאבי מעבד (CPU), Pool 0, גדל בהתחלה ל-99 workers, ואחר כך קטן ל-87 workers. מאגר העובדים שמבצע את השלב שדורש GPU, Pool 1, מוגדל ל-13 עובדים:
בתרשים של ניצול המעבד (CPU) אפשר לראות שרמת ניצול המעבד הכוללת של העובדים בשני מאגרי העובדים גבוהה:
פתרון בעיות בהתאמה של האוזניות
בקטע הזה מוסבר איך לפתור בעיות נפוצות שקשורות להתאמה.
הגדרות אישיות לא תקינות
כשמנסים להשתמש בהתאמה לימין, מופיעה השגיאה הבאה:
Workflow failed. Causes: One or more operations had an error: 'operation-OPERATION_ID':
[UNSUPPORTED_OPERATION] 'CPU_VALUE vCpus with RAM_VALUE MiB memory is
an invalid configuration for GPU_COUNT count of 'GPU_TYPE' in family 'MACHINE_TYPE'.'.
השגיאה הזו מתרחשת כשסוג ה-GPU שנבחר לא תואם לסוג המכונה שנבחר. כדי לפתור את השגיאה, צריך לבחור סוג GPU וסוג מכונה שתואמים זה לזה. לפרטים על תאימות, ראו פלטפורמות GPU.
בדיקת ההתאמה של האוזנייה הימנית
כדי לוודא שהתאמה נכונה מופעלת, אפשר לעיין במדדי התאמה אוטומטית לעומס ולוודא שהעמודה Worker pool מוצגת ומופיעים בה מאגרי משאבים שונים:
ביצועים של התאמת זכויות סטרימינג
יכול להיות שפייפליינים זורמים עם התאמה נכונה לא תמיד יניבו ביצועים טובים יותר מפייפליינים בלי התאמה נכונה. לדוגמה:
- הצינור משתמש ביותר עובדים
- זמן האחזור של המערכת ארוך יותר, או שהתפוקה נמוכה יותר
- הגודל של מאגר ה-workers משתנה בתדירות גבוהה יותר, או לא מתייצב
אם אתם רואים את זה בפייפליין שלכם, אתם יכולים להשבית את ההתאמה הנכונה על ידי הסרת --experiments=enable_streaming_rightfitting אפשרות הפייפליין. בנוסף, פייפליינים זורמים עם התאמה נכונה שמופעלת באמצעות רמזים למשאבי האצה עשויים להשתמש ביותר מאיצי תוכנה מהרצוי. אם אתם מבחינים בכך בצינור עיבוד הנתונים שלכם, אתם יכולים להגדיר את המספר המקסימלי של מאיצים שבהם צינור עיבוד הנתונים משתמש, על ידי הגדרת אפשרות צינור עיבוד הנתונים --experiments=max_num_accelerators=MAX_NUM_ACCELERATORS.