שאילתות בפורמטים של טבלאות פתוחות באמצעות קובצי מניפסט
במאמר הזה מוסבר איך להשתמש בקובצי מניפסט כדי לשלוח שאילתות לנתונים שמאוחסנים בפורמטים של טבלאות בקוד פתוח, כמו Apache Hudi ו-Delta Lake.
חלק מהפורמטים של טבלאות בקוד פתוח, כמו Hudi ו-Delta Lake, מייצאים את המצב הנוכחי שלהם כקובץ מניפסט אחד או יותר. קובץ מניפסט מכיל רשימה של קובצי נתונים שיוצרים טבלאות. התמיכה במניפסט ב-BigQuery מאפשרת לשלוח שאילתות ולטעון נתונים שמאוחסנים בפורמטים של טבלאות פתוחות.
לפני שמתחילים
Enable the BigQuery Connection, BigQuery Reservation, and BigLake APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.כדי ליצור טבלאות BigLake, אפשר להריץ את פקודות Spark באחת מהשיטות הבאות:
יוצרים אשכול Dataproc. כדי לשלוח שאילתות לטבלאות Hudi, מגדירים את השדה
--optional-componentsלערךHUDI. כדי לשלוח שאילתות לטבלאות Delta, מגדירים את--optional-componentsל-Presto.שימוש בתהליך מאוחסן ל-Spark ב-BigQuery. כדי לעשות זאת:
כדי לאחסן את קובץ המניפסט ב-Cloud Storage, צריך ליצור קטגוריה של Cloud Storage. כדי לגשת לקובץ המניפסט, צריך להתחבר לקטגוריה של Cloud Storage. כדי לעשות זאת:
התפקידים הנדרשים
כדי להריץ שאילתות על טבלאות BigLake שמבוססות על נתוני Hudi ו-Delta Lake, צריך לוודא שיש לכם את התפקידים הבאים:
- משתמש עם הרשאת גישה ל-BigQuery Connection (
roles/bigquery.connectionUser) - צפייה בנתוני BigQuery (
roles/bigquery.dataViewer) - משתמש BigQuery (
roles/bigquery.user)
אפשר גם להריץ שאילתות על טבלאות חיצוניות של Hudi. עם זאת, מומלץ לשדרג את הטבלה החיצונית ל-BigLake. כדי להריץ שאילתות בטבלאות חיצוניות של Hudi, צריך לוודא שיש לכם את התפקידים הבאים:
- צפייה בנתוני BigQuery (
roles/bigquery.dataViewer) - משתמש BigQuery (
roles/bigquery.user) - צפייה באובייקטים באחסון (
roles/storage.objectViewer)
בהתאם להרשאות שלכם, אתם יכולים להקצות לעצמכם את התפקידים האלה או לבקש מהאדמין להקצות אותם לכם. מידע נוסף על מתן תפקידים זמין במאמר איך בודקים אילו תפקידים אפשר לתת במשאבים.
כדי לראות את ההרשאות הנדרשות לשליחת שאילתות לטבלאות BigLake, מרחיבים את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
bigquery.connections.usebigquery.jobs.createbigquery.readsessions.create(נדרש רק אם קוראים נתונים באמצעות BigQuery Storage Read API)bigquery.tables.getbigquery.tables.getData
יכול להיות שתוכלו לקבל את ההרשאות האלה גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
שאילתות של עומסי עבודה ב-Hudi
כדי להריץ שאילתות על נתוני Hudi, פועלים לפי השלבים הבאים:
- יצירת טבלה חיצונית על סמך נתוני Hudi.
- משדרגים את הטבלה החיצונית ל-BigLake.
יצירת טבלאות חיצוניות של Hudi
כשמסנכרנים טבלאות באמצעות כלי הסנכרון של Hudi ו-BigQuery, צריך להפעיל את הדגל use-bq-manifest-file כדי לעבור לגישה של קובץ מניפסט. הדגל הזה גם מייצא קובץ מניפסט בפורמט שנתמך על ידי BigQuery, ומשתמש בו כדי ליצור טבלה חיצונית עם השם שצוין בפרמטר --table.
כדי ליצור טבלת Hudi חיצונית, פועלים לפי השלבים הבאים:
כדי ליצור טבלת Hudi חיצונית, שולחים משימה לאשכול Dataproc קיים. כשמגדירים את המחבר Hudi-BigQuery, צריך להפעיל את הדגל
use-bq-manifest-fileכדי לעבור לגישה של קובץ המניפסט. הדגל הזה מייצא קובץ מניפסט בפורמט שנתמך על ידי BigQuery, ומשתמש בו כדי ליצור טבלה חיצונית עם השם שצוין בפרמטר--table.spark-submit \ --master yarn \ --packages com.google.cloud:google-cloud-bigquery:2.10.4 \ --class org.apache.hudi.gcp.bigquery.BigQuerySyncTool \ JAR \ --project-id PROJECT_ID \ --dataset-name DATASET \ --dataset-location LOCATION \ --table TABLE \ --source-uri URI \ --source-uri-prefix URI_PREFIX \ --base-path BASE_PATH \ --partitioned-by PARTITION_BY \ --use-bq-manifest-file
מחליפים את מה שכתוב בשדות הבאים:
JAR: אם אתם משתמשים במחבר Hudi-BigQuery, מצייניםhudi-gcp-bundle-0.14.0.jar. אם אתם משתמשים ברכיב Hudi ב-Dataproc 2.1, צריך לציין/usr/lib/hudi/tools/bq-sync-tool/hudi-gcp-bundle-0.12.3.1.jar
PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור את טבלת Hudi BigLake
DATASET: מערך הנתונים שבו רוצים ליצור את טבלת Hudi BigLake.
LOCATION: המיקום שבו רוצים ליצור את טבלת Hudi BigLake.
TABLE: השם של הטבלה שרוצים ליצוראם אתם עוברים מגרסה קודמת של מחבר Hudi-BigQuery (גרסה 0.13.0 ומטה) שיצרה תצוגות בקובצי המניפסט, ודאו שאתם משתמשים באותו שם טבלה כדי שתוכלו לשמור את קוד הצינור הקיים במורד הזרם.
URI: ה-URI של Cloud Storage שיצרתם כדי לאחסן את קובץ המניפסט של Hudiה-URI הזה מצביע על המחיצה ברמה הראשונה. חשוב לכלול את מפתח המחיצה. לדוגמה,
gs://mybucket/hudi/mydataset/EventDate=*
URI_PREFIX: התחילית של נתיב ה-URI של Cloud Storage, בדרך כלל זה הנתיב לטבלאות Hudi
BASE_PATH: נתיב הבסיס לטבלאות Hudiלדוגמה,
gs://mybucket/hudi/mydataset/
PARTITION_BY: ערך המחיצהלדוגמה,
EventDate
מידע נוסף על הגדרת המחבר זמין במאמר מחבר Hudi-BigQuery.
כדי להגדיר אמצעי בקרה מתאימים ברמת הגרנולריות או כדי לשפר את הביצועים באמצעות הפעלת שמירת מטא-נתונים במטמון, אפשר לעיין במאמר שדרוג טבלאות BigLake.
שאילתות לגבי עומסי עבודה של דלתא
יש עכשיו תמיכה מקורית בטבלאות דלתא. מומלץ ליצור טבלאות Delta BigLake לעומסי עבודה של Delta. טבלאות Delta Lake BigLake תומכות בטבלאות Delta Lake מתקדמות יותר, כולל טבלאות עם מיפוי מחדש של עמודות ועם וקטורים של מחיקות. בנוסף, טבלאות Delta BigLake קוראות ישירות את תמונת המצב האחרונה, כך שהעדכונים זמינים באופן מיידי.
כדי להריץ שאילתות על עומסי עבודה של Delta, פועלים לפי השלבים הבאים:
- יוצרים קובץ מניפסט.
- יוצרים טבלת BigLake על סמך קובץ המניפסט.
- כדי לשפר את הביצועים, אפשר להגדיר אמצעי בקרה מתאימים ברמת פירוט גבוהה או להפעיל שמירת מטא-נתונים במטמון. למידע נוסף, אפשר לעיין במאמר בנושא שדרוג טבלאות BigLake.
יצירת קובץ מניפסט
BigQuery תומך בקובץ המניפסט בפורמט SymLinkTextInputFormat, שהוא רשימה של כתובות URI שמופרדות בשורות חדשות. מידע נוסף על יצירת קובץ מניפסט זמין במאמר הגדרת שילוב של Presto עם Delta Lake ושאילתות בטבלאות Delta.
כדי ליצור קובץ מניפסט, שולחים משימה לאשכול קיים של Dataproc:
SQL
מריצים את הפקודה הבאה בטבלת Delta במיקום path-to-delta-table באמצעות Spark:
GENERATE symlink_format_manifest FOR TABLE delta.`<path-to-delta-table>`
Scala
מריצים את הפקודה הבאה בטבלת Delta במיקום path-to-delta-table באמצעות Spark:
val deltaTable = DeltaTable.forPath(<path-to-delta-table>)
deltaTable.generate("symlink_format_manifest")
Java
מריצים את הפקודה הבאה בטבלת Delta במיקום path-to-delta-table באמצעות Spark:
DeltaTable deltaTable = DeltaTable.forPath(<path-to-delta-table>);
deltaTable.generate("symlink_format_manifest");
Python
מריצים את הפקודה הבאה בטבלת Delta במיקום path-to-delta-table באמצעות Spark:
deltaTable = DeltaTable.forPath(<path-to-delta-table>)
deltaTable.generate("symlink_format_manifest")
יצירת טבלאות Delta BigLake
כדי ליצור טבלת Delta BigLake, משתמשים בהצהרת CREATE EXTERNAL TABLE עם השדה file_set_spec_type שמוגדר לערך NEW_LINE_DELIMITED_MANIFEST:
עוברים לדף BigQuery.
בעורך השאילתות, מריצים את ההצהרה
CREATE EXTERNAL TABLE:CREATE EXTERNAL TABLE PROJECT_ID.DATASET_NAME.TABLE_NAME WITH PARTITION COLUMNS( `PARTITION_COLUMN PARTITION_COLUMN_TYPE`,) WITH CONNECTION `PROJECT_IDREGION.CONNECTION_NAME` OPTIONS ( format = "DATA_FORMAT", uris = ["URI"], file_set_spec_type = 'NEW_LINE_DELIMITED_MANIFEST', hive_partition_uri_prefix = "PATH_TO_DELTA_TABLE" max_staleness = STALENESS_INTERVAL, metadata_cache_mode = 'CACHE_MODE');
מחליפים את מה שכתוב בשדות הבאים:
-
DATASET_NAME: השם של מערך הנתונים שיצרתם -
TABLE_NAME: השם שרוצים לתת לטבלה -
REGION: המיקום שבו נמצא החיבור (לדוגמה,us-east1) -
CONNECTION_NAME: השם של החיבור שיצרתם -
DATA_FORMAT: כל אחד מהפורמטים הנתמכים (למשלPARQUET) -
URI: הנתיב לקובץ המניפסט (לדוגמה,gs://mybucket/path) -
PATH_TO_DELTA_TABLE: קידומת משותפת לכל מזהי ה-URI של המקור לפני שמתחיל קידוד מפתח החלוקה -
STALENESS_INTERVAL: מציין אם פעולות בטבלת BigLake משתמשות במטא-נתונים שנשמרו במטמון, ומה מידת העדכניות של המטא-נתונים שנשמרו במטמון שנדרשת כדי שהפעולה תוכל להשתמש בהם. מידע נוסף על שיקולים לגבי שמירת מטא-נתונים במטמון זמין במאמר שמירת מטא-נתונים במטמון לשיפור הביצועים.כדי להשבית את השמירה במטמון של המטא-נתונים, מציינים את הערך 0. (זוהי ברירת המחדל)
כדי להפעיל שמירת מטא-נתונים במטמון, צריך לציין ערך של מילול של מרווח בין 30 דקות ל-7 ימים. לדוגמה, כדי לציין מרווח של 4 שעות, צריך להזין
INTERVAL 4 HOUR. אם הערך הזה מוגדר, פעולות שמתבצעות בטבלה משתמשות במטא נתונים ששמורים במטמון אם הם רעננו ב-4 השעות האחרונות. אם המטא-נתונים שבמטמון ישנים יותר, הפעולה מאחזרת מטא-נתונים מ-Delta Lake במקום זאת. -
CACHE_MODE: מציין אם מטמון המטא-נתונים מתרענן באופן אוטומטי או ידני. מידע נוסף על שיקולים לגבי שמירת מטא-נתונים במטמון זמין במאמר שמירת מטא-נתונים במטמון לשיפור הביצועים.מגדירים את הערך
AUTOMATICכדי שהמטמון של המטא-נתונים יתעדכן במרווח זמן שמוגדר על ידי המערכת, בדרך כלל בין 30 ל-60 דקות.מגדירים את הערך
MANUALאם רוצים לרענן את מטמון המטא-נתונים לפי לוח זמנים שקובעים. במקרה כזה, אפשר להתקשר אלBQ.REFRESH_EXTERNAL_METADATA_CACHEהליך המערכת כדי לרענן את המטמון.אם מגדירים את
STALENESS_INTERVALלערך גדול מ-0, צריך להגדיר גם אתCACHE_MODE.
דוגמה:
CREATE EXTERNAL TABLE mydataset.mytable WITH CONNECTION `us-east1.myconnection` OPTIONS ( format="PARQUET", uris=["gs://mybucket/path/partitionpath=*"], file_set_spec_type = 'NEW_LINE_DELIMITED_MANIFEST' hive_partition_uri_prefix = "gs://mybucket/path/" max_staleness = INTERVAL 1 DAY, metadata_cache_mode = 'AUTOMATIC' );
-
שדרוג טבלאות BigLake
אתם יכולים גם לשפר את הביצועים של עומסי העבודה באמצעות שמירת מטא-נתונים במטמון ותצוגות חומריות. אם רוצים להשתמש במטמון של מטא-נתונים, אפשר לציין את ההגדרות לכך באותו זמן. כדי לקבל פרטים על הטבלה, כמו פורמט המקור ו-URI המקור, אפשר לעיין במאמר בנושא קבלת פרטי טבלה.
כדי לעדכן טבלה חיצונית לטבלת BigLake או לעדכן טבלת BigLake קיימת, בוחרים באחת מהאפשרויות הבאות:
SQL
כדי לעדכן טבלה, משתמשים בCREATE OR REPLACE EXTERNAL TABLE הצהרת DDL:
במסוף Google Cloud , עוברים לדף BigQuery.
מזינים את ההצהרה הבאה בעורך השאילתות:
CREATE OR REPLACE EXTERNAL TABLE `PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME` WITH CONNECTION {`REGION.CONNECTION_ID` | DEFAULT} OPTIONS( format ="TABLE_FORMAT", uris = ['BUCKET_PATH'], max_staleness = STALENESS_INTERVAL, metadata_cache_mode = 'CACHE_MODE' );
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: השם של הפרויקט שמכיל את הטבלה -
DATASET: השם של מערך הנתונים שמכיל את הטבלה -
EXTERNAL_TABLE_NAME: שם הטבלה -
REGION: האזור שבו נמצא החיבור -
CONNECTION_ID: השם של החיבור שרוצים להשתמש בוכדי להשתמש ב חיבור שמוגדר כברירת מחדל, מציינים
DEFAULTבמקום מחרוזת החיבור שמכילהREGION.CONNECTION_ID. -
TABLE_FORMAT: הפורמט שבו הטבלה משתמשתאי אפשר לשנות את זה כשמעדכנים את הטבלה.
-
BUCKET_PATH: הנתיב לדלי Cloud Storage שמכיל את הנתונים של הטבלה החיצונית, בפורמט['gs://bucket_name/[folder_name/]file_name'].אפשר לבחור כמה קבצים מהמאגר על ידי ציון כוכבית אחת (
*) כתו כללי בנתיב. לדוגמה,['gs://mybucket/file_name*']. מידע נוסף זמין במאמר תמיכה בתווים כלליים בכתובות URI של Cloud Storage.אפשר לציין כמה דליים לאפשרות
urisעל ידי ציון כמה נתיבים.בדוגמאות הבאות מוצגים ערכים חוקיים של
uris:['gs://bucket/path1/myfile.csv']['gs://bucket/path1/*.csv']['gs://bucket/path1/*', 'gs://bucket/path2/file00*']
כשמציינים
urisערכים שמטרגטים כמה קבצים, לכל הקבצים האלה צריכה להיות סכימה תואמת.מידע נוסף על שימוש בכתובות URI של Cloud Storage ב-BigQuery זמין במאמר בנושא נתיב משאב של Cloud Storage.
-
STALENESS_INTERVAL: מציין אם פעולות שמתבצעות בטבלה משתמשות במטא-נתונים ששמורים במטמון, ומה רמת העדכניות של המטא-נתונים ששמורים במטמון שנדרשת כדי שהפעולה תוכל להשתמש בהם.מידע נוסף על שיקולים לגבי שמירת מטא-נתונים במטמון זמין במאמר שמירת מטא-נתונים במטמון לשיפור הביצועים.
כדי להשבית את השמירה במטמון של המטא-נתונים, מציינים את הערך 0. (זוהי ברירת המחדל)
כדי להפעיל שמירת מטא-נתונים במטמון, צריך לציין ערך של מילול של מרווח בין 30 דקות ל-7 ימים. לדוגמה, כדי לציין מרווח של 4 שעות, צריך להזין
INTERVAL 4 HOUR. אם הערך הזה מוגדר, פעולות שמתבצעות בטבלה משתמשות במטא נתונים ששמורים במטמון אם הם רעננו ב-4 השעות האחרונות. אם המטא-נתונים שבמטמון ישנים יותר, הפעולה מאחזרת מטא-נתונים מ-Cloud Storage במקום זאת. -
CACHE_MODE: מציין אם המטמון של המטא-נתונים מתרענן באופן אוטומטי או ידנימידע נוסף על שיקולים בנוגע לשמירה במטמון של מטא-נתונים זמין במאמר שמירה במטמון של מטא-נתונים לשיפור הביצועים.
מגדירים את הערך
AUTOMATICכדי שהמטמון של המטא-נתונים יתעדכן במרווח זמן שמוגדר על ידי המערכת, בדרך כלל בין 30 ל-60 דקות.מגדירים את הערך
MANUALאם רוצים לרענן את מטמון המטא-נתונים לפי לוח זמנים שקובעים. במקרה כזה, אפשר להתקשר אלBQ.REFRESH_EXTERNAL_METADATA_CACHEהליך המערכת כדי לרענן את המטמון.אם מגדירים את
STALENESS_INTERVALלערך גדול מ-0, צריך להגדיר גם אתCACHE_MODE.
-
לוחצים על הפעלה.
מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.
BQ
כדי לעדכן טבלה, משתמשים בפקודות bq mkdef ו-bq update:
יוצרים הגדרה של טבלה חיצונית שמתארת את ההיבטים של הטבלה שרוצים לשנות:
bq mkdef --connection_id=PROJECT_ID.REGION.CONNECTION_ID \ --source_format=TABLE_FORMAT \ --metadata_cache_mode=CACHE_MODE \ "BUCKET_PATH" > /tmp/DEFINITION_FILE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: השם של הפרויקט שמכיל את החיבור -
REGION: האזור שמכיל את החיבור -
CONNECTION_ID: השם של החיבור שרוצים להשתמש בו -
TABLE_FORMAT: הפורמט שבו נעשה שימוש בטבלה. אי אפשר לשנות את זה כשמעדכנים את הטבלה.
CACHE_MODE: מציין אם מטמון המטא-נתונים מתרענן באופן אוטומטי או ידני. מידע נוסף על שיקולים בנוגע לשמירת מטא-נתונים במטמון זמין במאמר שמירת מטא-נתונים במטמון לשיפור הביצועים.מגדירים את הערך
AUTOMATICכדי שהמטמון של המטא-נתונים יתעדכן במרווח זמן שמוגדר על ידי המערכת, בדרך כלל בין 30 ל-60 דקות.מגדירים את הערך
MANUALאם רוצים לרענן את מטמון המטא-נתונים לפי לוח זמנים שקובעים. במקרה כזה, אפשר להתקשר אלBQ.REFRESH_EXTERNAL_METADATA_CACHEההליך של המערכת כדי לרענן את המטמון.אם הערך של
CACHE_MODEגדול מ-0, צריך להגדיר אתSTALENESS_INTERVAL.
BUCKET_PATH: הנתיב לדלי Cloud Storage שמכיל את הנתונים של הטבלה החיצונית, בפורמטgs://bucket_name/[folder_name/]file_name.כדי להגביל את הקבצים שנבחרו מהמאגר, מציינים כוכבית אחת (
*) בנתיב. לדוגמה,gs://mybucket/file_name*. מידע נוסף זמין במאמר בנושא תמיכה בתווים כלליים בכתובות URI של Cloud Storage.אפשר לציין כמה דליים לאפשרות
urisעל ידי ציון כמה נתיבים.בדוגמאות הבאות מוצגים ערכים חוקיים של
uris:gs://bucket/path1/myfile.csvgs://bucket/path1/*.csvgs://bucket/path1/*,gs://bucket/path2/file00*
כשמציינים ערכים של
urisשמטרגטים כמה קבצים, לכל הקבצים האלה צריכה להיות סכימה תואמת.מידע נוסף על שימוש בכתובות URI של Cloud Storage ב-BigQuery זמין במאמר בנושא נתיב משאב ב-Cloud Storage.
DEFINITION_FILE: השם של קובץ הגדרת הטבלה שאתם יוצרים.
-
מעדכנים את הטבלה באמצעות ההגדרה החדשה של הטבלה החיצונית:
bq update --max_staleness=STALENESS_INTERVAL \ --external_table_definition=/tmp/DEFINITION_FILE \ PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME
מחליפים את מה שכתוב בשדות הבאים:
STALENESS_INTERVAL: מציין אם פעולות שמתבצעות בטבלה משתמשות במטא-נתונים ששמורים במטמון, וכמה טריים צריכים להיות המטא-נתונים ששמורים במטמון כדי שהפעולה תוכל להשתמש בהם. מידע נוסף על שיקולים בנוגע לשמירת מטא-נתונים במטמון זמין במאמר שמירת מטא-נתונים במטמון לשיפור הביצועים.כדי להשבית את השמירה במטמון של המטא-נתונים, מציינים את הערך 0. (זוהי ברירת המחדל)
כדי להפעיל שמירת מטא-נתונים במטמון, צריך לציין ערך של מרווח זמן בין 30 דקות ל-7 ימים, באמצעות הפורמט
Y-M D H:M:Sשמתואר במסמכי התיעוד של סוג הנתוניםINTERVAL. לדוגמה, כדי להגדיר את מרווח הרענון ל-4 שעות, מציינים0-0 0 4:0:0. אם הערך הזה מוגדר, פעולות שמתבצעות בטבלה משתמשות במטא נתונים שנשמרו במטמון אם הם רעננו ב-4 השעות האחרונות. אם המטא-נתונים שבמטמון ישנים יותר, הפעולה מאחזרת מטא-נתונים מ-Cloud Storage במקום זאת.
DEFINITION_FILE: השם של קובץ הגדרת הטבלה שיצרתם או עדכנתם.
PROJECT_ID: שם הפרויקט שמכיל את הטבלה
DATASET: השם של מערך הנתונים שמכיל את הטבלה
EXTERNAL_TABLE_NAME: שם הטבלה
שליחת שאילתות לטבלאות BigLake ולטבלאות חיצוניות
אחרי שיוצרים טבלת BigLake, אפשר להריץ עליה שאילתות באמצעות תחביר GoogleSQL, בדיוק כמו בטבלה ב-BigQuery רגילה.
לדוגמה, SELECT field1, field2 FROM mydataset.my_cloud_storage_table;.
מגבלות
BigQuery תומך רק בשליחת שאילתות לטבלאות Delta Lake reader בגרסה 1.
השילוב בין Hudi ל-BigQuery פועל רק בטבלאות מחולקות למחיצות (Partitions) בסגנון Hive
copy-on-write.