שכפול רציף של שינויים ממסד נתונים OLTP (לדוגמה, Oracle, PostgreSQL, MySQL) ל-BigQuery עם השהיה נמוכה.
→שימוש ב-Datastream לביצוע Change Data Capture (CDC). הגדרתו להזרמת שינויים ישירות ל-BigQuery, אשר מיישם אותם באמצעות יכולת ה-`MERGE` שלו.
למה: Datastream הוא שירות CDC מנוהל וסרברלס המפשט שכפול מסדי נתונים בזמן אמת מבלי לדרוש צינורות מותאמים אישית או עומס משמעותי על מסד הנתונים המקור.
מקור↗
צינור סטרימינג של Dataflow חייב לייצר תוצאות מדויקות בחלון זמן אירוע למרות שחלק מהאירועים מגיעים באיחור של שעות.
→הגדרת חלונות זמן אירוע עם `allowedLateness` כדי להתאים את העיכוב. שימוש בטריגרים עם הפעלות מוקדמות לתוצאות ראשוניות וצבירת חלוניות שהופעלו כדי לכלול נתונים מאוחרים.
למה: המודל של Dataflow של Watermarks, טריגרים ו-allowedLateness מספק מסגרת חזקה לאיזון בין שלמות להשהיה בעת טיפול בנתונים שאינם בסדר.
צינור Dataflow הכותב ל-BigQuery חווה כפילויות לאחר הפעלות מחדש או כשלים חולפים.
→שימוש בכיור BigQuery Storage Write API (`STORAGE_WRITE_API`) עם המצב מוגדר ל-`at-least-once` (ברירת מחדל, בעבר `STREAMING_INSERTS`) או `exactly-once` (מצב `COMMITTED`).
למה: ה-Storage Write API במצב `COMMITTED` מספק סמנטיקת בדיוק-פעם-אחת מובנית עבור סטרימינג, ומבטל את הצורך בלוגיקת הסרת כפילויות מותאמת אישית.
קליטת נתונים מ-REST API מחולק לדפים ומוגבל בקצב באמצעות Dataflow.
→שימוש ב-`SplittableDoFn` לעיבוד המקור המחולק לדפים במקביל. הטמעת לוגיקת הגבלת קצב (לדוגמה, באמצעות Guava RateLimiter) ו-exponential backoff עבור ניסיונות חוזרים בתוך ה-DoFn.
למה: `SplittableDoFn` מאפשר איזון עבודה דינמי מחדש. שילובו עם הגבלת קצב ולוגיקת ניסיונות חוזרים יוצר דפוס עמיד ויעיל לטיפול ב-API חיצוניים.
זרם נתונים יחיד צריך להיכתב למספר יעדים (לדוגמה, BigQuery, Bigtable, Cloud Storage).
→בצינור Dataflow יחיד, לאחר עיבוד ראשוני, יישום מספר כותבי `PTransform` לאותו `PCollection` סופי.
למה: דפוס ה-fan-out יעיל מאוד מכיוון שהנתונים מעובדים פעם אחת בלבד. הוא מונע את העלות והמורכבות של הפעלת מספר צינורות נפרדים הקוראים מאותו מקור.
זרם בנפח גבוה חייב להיות מועשר על ידי צירוף לטבלת מימדים המשתנה לאט (לדוגמה, פרופילי משתמשים) המתעדכנת מעת לעת.
→שימוש בדפוס ה-side input ב-Dataflow. טעינת טבלת המימדים כ-`PCollectionView`. הגדרת טריגר תקופתי לרענון ה-side input בלוח זמנים, מונע הפעלות מחדש של הצינור.
למה: Side inputs משדרים את נתוני המימדים לכל העובדים עבור חיפושים מהירים בזיכרון, תוך הימנעות מקריאות API/DB לכל אלמנט. רענון תקופתי מטפל בעדכונים ביעילות.
עומסי עבודה של אשכול Dataproc משתנים באופן משמעותי, מה שמוביל להקצאת יתר או לתת-ביצועים.
→יצירת אשכול Dataproc עם מדיניות קנה מידה אוטומטית. הגדרת מספר עובדים ראשיים ומשניים מינימליים/מקסימליים. המדיניות תתאים את קנה מידת האשכול בהתבסס על מדדי YARN.
למה: קנה מידה אוטומטי מייעל עלויות על ידי התאמת משאבי האשכול לדרישת המשימות, הגדלת קנה מידה לעומסים כבדים והפחתה בתקופות סרק.
צינור Dataflow דורש קבצים בינאריים מותאמים אישית, ספריות קנייניות או גרסאות ספציפיות שאינן בתמונות עובדים סטנדרטיות, וחייב לפעול ב-VPC ללא אינטרנט.
→בניית תמונת קונטיינר מותאמת אישית עם כל התלויות המותקנות מראש. דחיפת התמונה ל-Artifact Registry. פריסת הצינור באמצעות Flex Template המפנה לקונטיינר המותאם אישית.
למה: Flex Templates עם קונטיינרים מותאמים אישית מספקים שליטה מלאה על סביבת הריצה והתלויות, חיוני לסביבות לא מקוונות או מיוחדות.
משימת Dataflow או Spark המבצעת `GroupByKey` איטית מכיוון שלחלק מהמפתחות יש מספר לא פרופורציונלי של ערכים ("מפתח חם").
→הטמעת צבירה דו-שלבית (key salting). ראשית, הוספת סיומת אקראית למפתח כדי לפצל את המפתח החם על פני מספר עובדים. צבירה חלקית. שנית, הסרת הסיומת וצבירת התוצאות החלקיות.
למה: טכניקת fanout זו מפצלת ידנית את העבודה עבור המפתח החם, ומאפשרת לעבדו במקביל ולגבור על צוואר הבקבוק.
צינור סטרימינג אסור שייכשל עקב רשומות שגויות. רשומות לא חוקיות חייבות להיות מבודדות לצורך ניתוח מבלי לעצור את העיבוד.
→ב-`DoFn`, השתמש בבלוק try-catch לניתוח. השתמש ב-DoFn מרובה פלטים עם `TupleTag` כדי לנתב רשומות חוקיות לפלט הראשי ורשומות לא חוקיות (עם הקשר שגיאה) לפלט שגיאה נפרד. הטבע את ה-PCollection של השגיאות ליעד של "Dead-Letter Queue" כמו נושא Pub/Sub או טבלת BigQuery.
למה: דפוס זה מספק עמידות על ידי בידוד נתונים גרועים, מניעת כשלים בצינור, והבטחת תיעוד רשומות כושלות לצורך ניפוי באגים ועיבוד מחדש.