במאמר הזה מוסבר איך לקרוא נתונים מ-BigQuery ל-Dataflow.
סקירה כללית
ברוב תרחישי השימוש, מומלץ להשתמש ב-Managed I/O כדי לקרוא מ-BigQuery. Managed I/O מספק תכונות כמו שדרוגים אוטומטיים וAPI עקבי להגדרות. כשקוראים מ-BigQuery, הממשק Managed I/O מבצע קריאות ישירות של טבלאות, שמניבות את ביצועי הקריאה הכי טובים.
אם אתם צריכים כוונון ביצועים מתקדם יותר, כדאי להשתמש בBigQueryIOמחבר. המחבר BigQueryIO תומך בקריאות ישירות של טבלאות ובקריאה ממשימות של BigQuery Export. הוא גם מאפשר שליטה מפורטת יותר בביטול הסריאליזציה של רשומות בטבלה. מידע נוסף מופיע בקטע שימוש במחבר BigQueryIO במאמר הזה.
הקרנה וסינון של עמודות
כדי להקטין את נפח הנתונים שצינור הנתונים קורא מ-BigQuery, אפשר להשתמש בטכניקות הבאות:
- הקרנת עמודות מציינת קבוצת משנה של עמודות לקריאה מהטבלה. כדאי להשתמש בהקרנת עמודות אם בטבלה יש מספר גדול של עמודות ואתם צריכים לקרוא רק קבוצת משנה שלהן.
- Row filtering (סינון שורות) מציין פרדיקט להחלה על הטבלה. פעולת הקריאה של BigQuery מחזירה רק שורות שתואמות למסנן, וכך אפשר לצמצם את כמות הנתונים הכוללת שמועברת דרך צינור העיבוד.
בדוגמה הבאה, המערכת קוראת את העמודות "user_name" ו-"age" מטבלה ומסננת את השורות שלא תואמות לפרדיקט "age > 18". בדוגמה הזו נעשה שימוש ב-I/O מנוהל.
Java
כדי לבצע אימות ב-Dataflow, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
הקראה מתוצאת שאילתה
בדוגמה הבאה נעשה שימוש ב-Managed I/O כדי לקרוא את התוצאה של שאילתת SQL. הוא מריץ שאילתה במערך נתונים ציבורי של BigQuery. אפשר גם להשתמש בשאילתות SQL כדי לקרוא מתצוגה מפורטת או מתצוגה מפורטת חומרית של BigQuery.
Java
כדי לבצע אימות ב-Dataflow, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
שימוש במחבר BigQueryIO
מחבר BigQueryIO תומך בשיטות הסריאליזציה הבאות:
- קריאת הנתונים כרשומות בפורמט Avro. בשיטה הזו, אתם מספקים פונקציה שמנתחת את רשומות Avro לסוג נתונים מותאם אישית.
- קריאת הנתונים כאובייקטים של
TableRow. השיטה הזו נוחה כי היא לא דורשת סוג נתונים מותאם אישית. עם זאת, בדרך כלל הביצועים שלו נמוכים יותר מאשר קריאת רשומות בפורמט Avro.
המחבר תומך בשתי אפשרויות לקריאת נתונים:
- משימת ייצוא. כברירת מחדל, מחבר
BigQueryIOמריץ משימת ייצוא של BigQuery שכותבת את נתוני הטבלה ל-Cloud Storage. לאחר מכן, המחבר קורא את הנתונים מ-Cloud Storage. - קריאות ישירות של טבלאות. האפשרות הזו מהירה יותר מעבודות ייצוא, כי היא משתמשת ב-BigQuery Storage Read API ומדלגת על שלב הייצוא. כדי להשתמש בקריאות ישירות של טבלאות, צריך להפעיל את הפונקציה
withMethod(Method.DIRECT_READ)כשיוצרים את צינור הנתונים.
כשבוחרים באיזו אפשרות להשתמש, כדאי להביא בחשבון את הנקודות הבאות:
באופן כללי, מומלץ להשתמש בקריאות ישירות של טבלאות. ה-Storage Read API מתאים יותר לצינורות נתונים מאשר משימות ייצוא, כי הוא לא דורש את שלב הביניים של ייצוא הנתונים.
אם אתם משתמשים בקריאות ישירות, תחויבו על השימוש ב-Storage Read API. כאן תוכלו לראות את המחירים של חילוץ נתונים בדף התמחור של BigQuery.
לא חל תשלום נוסף על עבודות ייצוא. עם זאת, יש מגבלות על משימות ייצוא. אם מעבירים כמויות גדולות של נתונים, והמהירות היא בראש סדר העדיפויות והעלות ניתנת להתאמה, מומלץ לבצע קריאות ישירות.
ל-Storage Read API יש מגבלות מכסה. כדי לעקוב אחרי השימוש במכסה, אפשר להשתמש במדדים שלGoogle Cloud .
אם אתם משתמשים במשימות ייצוא, צריך להגדיר את
--tempLocationהאפשרות pipeline כדי לציין קטגוריה של Cloud Storage לקבצים המיוצאים.כשמשתמשים ב-Storage Read API, יכול להיות שיוצגו ביומנים שגיאות של תפוגת חכירה ותוקף של סשן, כמו:
DEADLINE_EXCEEDEDServer UnresponsiveStatusCode.FAILED_PRECONDITION details = "there was an error operating on 'projects/<projectID>/locations/<location>/sessions/<sessionID>/streams/<streamID>': session`
השגיאות האלה יכולות להתרחש כשפעולה נמשכת יותר זמן מהזמן הקצוב לתפוגה, בדרך כלל בצינורות שפועלים יותר מ-6 שעות. כדי לפתור את הבעיה, צריך לעבור לייצוא קבצים.
רמת המקביליות תלויה בשיטת הקריאה:
קריאות ישירות: מחבר ה-I/O יוצר מספר דינמי של זרמים, על סמך גודל בקשת הייצוא. היא קוראת את הזרמים האלה ישירות מ-BigQuery במקביל.
משימות ייצוא: מערכת BigQuery קובעת כמה קבצים ייכתבו ל-Cloud Storage. מספר הקבצים תלוי בשאילתה ובנפח הנתונים. מחבר הקלט/פלט קורא את הקבצים המיוצאים במקביל.
בטבלה הבאה מוצגים מדדי ביצועים עבור אפשרויות קריאה שונות של BigQuery I/O. עומסי העבודה הופעלו על e2-standard2worker אחד, באמצעות Apache Beam SDK 2.49.0 ל-Java. הם לא השתמשו ב-Runner v2.
| 100 מיליון רשומות | 1KB | עמודה אחת | תפוקה (בייטים) | תפוקה (אלמנטים) |
|---|---|---|
| קריאת נתונים מהאחסון | 120 MBps | 88,000 רכיבים לשנייה |
| ייצוא בפורמט Avro | 105MBps | 78,000 רכיבים לשנייה |
| ייצוא JSON | 110MBps | 81,000 רכיבים לשנייה |
המדדים האלה מבוססים על צינורות פשוטים של עיבוד נתונים באצווה. הם נועדו להשוות בין הביצועים של מחברי קלט/פלט, ולא בהכרח מייצגים צינורות נתונים בעולם האמיתי. הביצועים של צינורות Dataflow הם מורכבים, והם פונקציה של סוג המכונה הווירטואלית, הנתונים שעוברים עיבוד, הביצועים של מקורות ויעדים חיצוניים וקוד המשתמש. המדדים מבוססים על הפעלת Java SDK, והם לא מייצגים את מאפייני הביצועים של ערכות SDK בשפות אחרות. מידע נוסף זמין במאמר בנושא ביצועים של Beam IO.
דוגמאות
בדוגמאות הקוד הבאות נעשה שימוש במחבר BigQueryIO עם קריאות ישירות של טבלאות. כדי להשתמש במקום זאת במשימת ייצוא, משמיטים את הקריאה ל-withMethod.
קריאת רשומות בפורמט Avro
בדוגמה הזו מוסבר איך להשתמש במחבר BigQueryIO כדי לקרוא רשומות בפורמט Avro.
כדי לקרוא נתונים מ-BigQuery לרשומות בפורמט Avro, משתמשים בשיטה read(SerializableFunction). השיטה הזו מקבלת פונקציה שמוגדרת על ידי האפליקציה, שמנתחת אובייקטים של SchemaAndRecord ומחזירה סוג נתונים מותאם אישית. הפלט מהמחבר הוא PCollection של סוג הנתונים המותאם אישית.
הקוד הבא קורא PCollection<MyData> מטבלה ב-BigQuery, כאשר MyData הוא מחלקה שמוגדרת על ידי האפליקציה.
Java
כדי לבצע אימות ב-Dataflow, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
השיטה read מקבלת ממשק SerializableFunction<SchemaAndRecord, T> שמגדיר פונקציה להמרה מרשומות Avro למחלקת נתונים בהתאמה אישית. בדוגמת הקוד הקודמת, ה-method MyData.apply מטמיע את פונקציית ההמרה הזו. הפונקציה לדוגמה מנתחת את השדות name ו-age מרשומת Avro ומחזירה מופע של MyData.
כדי לציין איזו טבלה ב-BigQuery לקרוא, צריך להפעיל את השיטה from, כמו בדוגמה הקודמת. מידע נוסף זמין במאמר בנושא שמות טבלאות במאמרי העזרה של מחבר BigQuery I/O.
קריאת אובייקטים של TableRow
בדוגמה הזו מוסבר איך להשתמש במחבר BigQueryIO כדי לקרוא אובייקטים של TableRow.
השיטה readTableRows קוראת נתונים מ-BigQuery לתוך PCollection של אובייקטים מסוג TableRow. כל TableRow הוא מיפוי של צמדי מפתח/ערך שמכיל שורה אחת של נתוני טבלה. מציינים את הטבלה ב-BigQuery שממנה רוצים לקרוא נתונים באמצעות קריאה לשיטה from.
הקוד הבא קורא PCollection<TableRows> מטבלה ב-BigQuery.
Java
כדי לבצע אימות ב-Dataflow, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
בדוגמה הזו אפשר לראות גם איך לגשת לערכים מהמילון TableRow.
ערכים של מספרים שלמים מקודדים כמחרוזות כדי להתאים לפורמט JSON המיוצא של BigQuery.