יצירת טבלאות חיצוניות של BigLake ל-Delta Lake
בעזרת BigLake אתם יכולים לגשת לטבלאות Delta Lake עם בקרת גישה פרטנית יותר. Delta Lake הוא פורמט קוד פתוח לאחסון נתונים בטבלאות שפותח על ידי Databricks, ותומך בטבלאות נתונים בקנה מידה של פטה-בייט.
ב-BigQuery אפשר להשתמש בתכונות הבאות בטבלאות Delta Lake:
- הקצאת גישה: שליחת שאילתות לנתונים מובְנים במאגרי נתונים חיצוניים באמצעות הקצאת גישה. האצלת גישה מפרידה בין הגישה לטבלת Delta Lake לבין הגישה למאגר הנתונים הבסיסי.
- בקרת גישה מפורטת: אכיפת אבטחה מפורטת ברמת הטבלה, כולל אבטחה ברמת השורה וברמת העמודה. בטבלאות Delta Lake שמבוססות על Cloud Storage, אתם יכולים להשתמש גם בהסתרת מידע דינמית.
- התפתחות הסכימה: שינויים בסכימה בטבלאות Delta Lake מזוהים באופן אוטומטי. השינויים בסכימה משתקפים בטבלה ב-BigQuery.
טבלאות Delta Lake תומכות גם בכל התכונות של BigLake כשמגדירים אותן כטבלאות BigLake.
לפני שמתחילים
-
בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.
התפקידים שנדרשים כדי לבחור או ליצור פרויקט
- בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים?
-
מפעילים את BigQuery Connection API ואת BigQuery Reservation API, אם הם עדיין לא מופעלים.
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים -
מפעילים את Cloud Shell במסוף Google Cloud .
מוודאים שיש לכם קבוצת נתונים ב-BigQuery.
מוודאים שגרסת Google Cloud SDK היא 366.0.0 ואילך:
gcloud versionבמקרה הצורך, מעדכנים את Google Cloud SDK.
יוצרים קישור למשאבים ב-Cloud על סמך מקור הנתונים החיצוני, ונותנים לקישור הזה גישה ל-Cloud Storage. אם אין לכם את ההרשאות המתאימות ליצירת חיבור, בקשו מהאדמין של BigQuery ליצור חיבור ולשתף אותו איתכם.
התפקידים הנדרשים
כדי ליצור טבלת Delta Lake, צריך את ההרשאות הבאות:
bigquery.tables.createbigquery.connections.delegate
התפקיד המוגדר מראש "אדמין ב-BigQuery (roles/bigquery.admin)" בניהול הזהויות והרשאות הגישה כולל את ההרשאות האלה.
אם אתם לא חשבון משתמש בתפקיד הזה, בקשו מהאדמין לתת לכם את ההרשאות האלה או ליצור בשבילכם את טבלת Delta Lake.
בנוסף, כדי לאפשר למשתמשי BigQuery לשלוח שאילתות לטבלה, לחשבון השירות שמשויך לחיבור צריכות להיות ההרשאות והגישה הבאות:
- התפקיד "צפייה ב-BigQuery (
roles/bigquery.viewer)" - התפקיד "משתמש בחיבור ל-BigQuery (
roles/bigquery.connectionUser)" - גישה לקטגוריה של Cloud Storage שמכילה את הנתונים האלה
במאמר תפקידים והרשאות מוגדרים מראש תוכלו לקרוא מידע נוסף על תפקידים והרשאות של ניהול זהויות והרשאות גישה (IAM) ב-BigQuery.
יצירת טבלאות באמצעות Delta Lake
כדי ליצור טבלאות Delta Lake, מבצעים את השלבים הבאים.
SQL
משתמשים בהצהרה CREATE EXTERNAL TABLE כדי ליצור את טבלת Delta Lake:
CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.DELTALAKE_TABLE_NAME`
WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
OPTIONS (
format ="DELTA_LAKE",
uris=['DELTA_TABLE_GCS_BASE_PATH']);
מחליפים את הערכים הבאים:
- PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור את טבלת Delta Lake
- DATASET: מערך הנתונים ב-BigQuery שיכיל את הטבלה של Delta Lake
- DELTALAKE_TABLE_NAME: השם של טבלת Delta Lake
- REGION: האזור שבו נמצא החיבור ליצירת טבלת Delta Lake, לדוגמה
us CONNECTION_ID: מזהה החיבור, לדוגמה:
myconnectionכשמציגים את פרטי החיבור במסוף Google Cloud , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב-Connection ID, לדוגמה
projects/myproject/locations/connection_location/connections/myconnection.DELTA_TABLE_GCS_BASE_PATH: הקידומת של טבלת Delta Lake
BQ
בסביבה של שורת הפקודה, משתמשים בפקודה bq mk כדי ליצור את טבלת Delta Lake:
bq mk --table --external_table_definition=DEFINITION_FILE PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME
מחליפים את הערכים הבאים:
- DEFINITION_FILE: הנתיב לקובץ הגדרת הטבלה
- PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור את טבלת Delta Lake
- DATASET: מערך הנתונים ב-BigQuery שיכיל את הטבלה של Delta Lake
- DELTALAKE_TABLE_NAME: השם של טבלת Delta Lake
REST
משתמשים ב-BigQuery API כדי ליצור טבלת Delta Lake באמצעות קריאה ל-method tables.insert של ה-API:
REQUEST='{
"autodetect": true,
"externalDataConfiguration": {
"sourceFormat": "DELTA_LAKE",
"connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
"sourceUris": [
"DELTA_TABLE_GCS_BASE_PATH"
],
},
"tableReference": {
"tableId": "DELTALAKE_TABLE_NAME"
}
}'
echo $REQUEST | curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables?autodetect_schema=true
מחליפים את הערכים הבאים:
- PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור את טבלת Delta Lake
- REGION: האזור שבו נמצא החיבור ליצירת טבלת Delta Lake, לדוגמה
us CONNECTION_ID: מזהה החיבור, לדוגמה:
myconnectionכשמציגים את פרטי החיבור במסוף Google Cloud , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב-Connection ID, לדוגמה
projects/myproject/locations/connection_location/connections/myconnection.DELTA_TABLE_GCS_BASE_PATH: הקידומת של טבלת Delta Lake
DELTALAKE_TABLE_NAME: השם של טבלת Delta Lake
DATASET: מערך הנתונים ב-BigQuery שיכיל את הטבלה של Delta Lake
כשיוצרים טבלאות Delta Lake, הקידומת של Delta Lake משמשת כ-URI של הטבלה. לדוגמה, בטבלה עם יומנים בקטגוריה gs://bucket/warehouse/basictable/_delta_log, ה-URI של הטבלה הוא gs://bucket/warehouse/basictable. כשמריצים שאילתות בטבלת Delta Lake, BigQuery קורא את הנתונים שמתחת לקידומת כדי לזהות את הגרסה הנוכחית של הטבלה, ואז מחשב את המטא-נתונים ואת הקבצים של הטבלה.
אפשר ליצור טבלאות חיצוניות של Delta Lake בלי חיבור, אבל לא מומלץ לעשות את זה מהסיבות הבאות:
- יכול להיות שהמשתמשים יקבלו שגיאות
ACCESS_DENIEDכשהם ינסו לגשת לקבצים ב-Cloud Storage. - תכונות כמו בקרת גישה מפורטת זמינות רק בטבלאות Delta Lake BigLake.
עדכון טבלאות Delta Lake
כדי לעדכן (לרענן) את הסכימה של טבלאות Delta Lake, פועלים לפי השלבים הבאים.
BQ
בסביבה של שורת הפקודה, משתמשים בפקודה bq update כדי לעדכן (לרענן) את הסכימה של טבלת Delta Lake:
bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME
מחליפים את הערכים הבאים:
- PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור את טבלת Delta Lake
- DATASET: מערך הנתונים ב-BigQuery שיכיל את הטבלה של Delta Lake
- DELTALAKE_TABLE_NAME: השם של טבלת Delta Lake
REST
משתמשים ב-BigQuery API כדי לעדכן טבלת Delta Lake, באמצעות קריאה ל-method tables.patch ב-API:
REQUEST='{
"externalDataConfiguration": {
"sourceFormat": "DELTA_LAKE",
"sourceUris": [
"DELTA_TABLE_GCS_BASE_PATH"
],
"connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
"autodetect": true
}
}'
echo $REQUEST |curl -X PATCH -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/DELTALAKE_TABLE_NAME?autodetect_schema=true
מחליפים את הערכים הבאים:
- DELTA_TABLE_GCS_BASE_PATH: הקידומת של טבלת Delta Lake
- PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור את טבלת Delta Lake
- REGION: האזור שבו נמצא החיבור ליצירת טבלת Delta Lake, לדוגמה
us CONNECTION_ID: מזהה החיבור, לדוגמה:
myconnectionכשמציגים את פרטי החיבור במסוף Google Cloud , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב-Connection ID, לדוגמה
projects/myproject/locations/connection_location/connections/myconnection.DELTALAKE_TABLE_NAME: השם של טבלת Delta Lake
DATASET: מערך הנתונים ב-BigQuery שיכיל את הטבלה של Delta Lake
הרצת שאילתות בטבלאות Delta Lake
אחרי שיוצרים טבלת BigLake ב-Delta Lake, אפשר לשלוח אליה שאילתות באמצעות תחביר GoogleSQL, בדיוק כמו בטבלה רגילה ב-BigQuery. לדוגמה:
SELECT field1, field2 FROM mydataset.my_cloud_storage_table;
מידע נוסף זמין במאמר שליחת שאילתות על נתוני Cloud Storage בטבלאות BigLake.
חיבור חיצוני שמשויך לחשבון שירות משמש לחיבור למאגר הנתונים. מכיוון שחשבון השירות מאחזר נתונים ממאגר הנתונים, המשתמשים צריכים רק גישה לטבלת Delta Lake.
מיפוי נתונים
BigQuery ממיר את סוגי הנתונים של Delta Lake לסוגי הנתונים של BigQuery, כמו שמוצג בטבלה הבאה:
| סוג Delta Lake | סוג BigQuery |
|---|---|
boolean |
BOOL |
byte |
INT64 |
int |
INT64 |
long |
INT64 |
float |
FLOAT64 |
double |
FLOAT64 |
Decimal(P/S) |
NUMERIC או BIG_NUMERIC, בהתאם לרמת הדיוק |
date |
DATE |
time |
TIME |
timestamp (not partition column) |
TIMESTAMP |
timestamp (partition column) |
DATETIME |
string |
STRING |
binary |
BYTES |
array<Type> |
ARRAY<Type> |
struct |
STRUCT |
map<KeyType, ValueType> |
ARRAY<Struct<key KeyType, value ValueType>> |
מגבלות
לטבלאות Delta Lake יש מגבלות של טבלאות BigLake וגם את המגבלות הבאות:
- תמיכה ב-Delta Lake גרסת קורא 3 עם וקטורים למחיקת נתיבים יחסיים ומיפוי עמודות.
- אין תמיכה בנקודות ביקורת של Delta Lake V2.
- אתם צריכים לציין את גרסת הקורא בקובץ של רשומת היומן האחרונה. לדוגמה, טבלאות חדשות חייבות לכלול את
00000..0.json. - אין תמיכה בפעולות של סימון נתונים שהשתנו (CDC). המערכת מתעלמת מכל פעולות ה-CDC הקיימות.
- המערכת מזהה את הסכימה באופן אוטומטי. אי אפשר לשנות את הסכימה באמצעות BigQuery.
- שמות העמודות בטבלה חייבים לעמוד במגבלות על שמות עמודות ב-BigQuery.
- אין תמיכה בתצוגות מהותיות.
- Read API לא נתמך ב-Delta Lake.
- סוג הנתונים
timestamp_ntzלא נתמך בטבלאות Delta Lake BigLake.
פתרון בעיות
בקטע הזה מוסבר איך להשתמש בטבלאות BigLake של Delta Lake. למידע כללי נוסף על פתרון בעיות בשאילתות ב-BigQuery, קראו את המאמר פתרון בעיות בשאילתות.
שגיאות שקשורות למשאבים ולזמן קצוב לתפוגה של שאילתה
בודקים את ספריית היומנים (gs://bucket/warehouse/basictable/_delta_log) של טבלת Delta Lake ומחפשים קובצי JSON עם מספר גרסה שגדול מנקודת הבדיקה הקודמת. כדי לקבל את מספר הגרסה, אפשר להציג את הספרייה או לבדוק את הקובץ _delta_log/_last_checkpoint.
קבצי JSON שגדולים מ-10MiB עלולים להאט את הרחבת הטבלה, מה שעלול לגרום לבעיות של זמן קצוב לתפוגה ובעיות במשאבים. כדי לפתור את הבעיה, משתמשים בפקודה הבאה כדי ליצור נקודת ביקורת חדשה, כך שהשאילתות ידלגו על קריאת קובצי ה-JSON:
spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.checkpointInterval' = '1')");
לאחר מכן, המשתמשים יכולים להשתמש באותה פקודה כדי לאפס את מרווח נקודות הציון לערך ברירת המחדל של 10, או לערך שמונע קובצי JSON בגודל של יותר מ-50MB בין נקודות הציון.
שם העמודה לא חוקי
מוודאים שמיפוי העמודות מופעל בטבלת Delta Lake. מיפוי עמודות נתמך ב-Reader מגרסה 2 ואילך. בגרסה 1 של Reader, מגדירים את delta.columnMapping.mode ל-name באמצעות הפקודה הבאה:
spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.columnMapping.mode' = 'name', 'delta.minReaderVersion' = '3', 'delta.minWriterVersion' = '7')");
אם שם העמודה הלא חוקי עומד במגבלות הגמישות של שמות עמודות, פנו אל Cloud Customer Care או אל biglake-help@google.com.
שגיאות מסוג "הגישה נדחתה"
כדי לאבחן בעיות בטבלאות Delta Lake BigLake, צריך לבדוק את הדברים הבאים:
אתם צריכים לוודא שאתם משתמשים בטבלאות Delta Lake BigLake (עם חיבור).
למשתמשים יש את ההרשאה הנדרשת.
ביצועים
כדי לשפר את ביצועי השאילתות, נסו את השלבים הבאים:
משתמשים בכלי העזר של Delta Lake כדי לדחוס את קובצי הנתונים הבסיסיים ולהסיר קבצים מיותרים, כמו נתונים ומטא-נתונים.
מוודאים שהערך של
delta.checkpoint.writeStatsAsStructהואtrue.חשוב לוודא שמשתנים שמשתמשים בהם לעיתים קרובות בסעיפי פרדיקט נמצאים בעמודות של חלוקה למחיצות.
במערכי נתונים גדולים (יותר מ-100TB) יכול להיות שכדאי להשתמש בתכונות ובהגדרות נוספות. אם השלבים הקודמים לא פותרים את הבעיות, כדאי לפנות לשירות הלקוחות או לכתובת biglake-help@google.com, במיוחד לגבי מערכי נתונים שגדולים מ-100TB.