יצירת טבלאות חיצוניות של 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 או יוצרים אותו.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
מפעילים את BigQuery Connection API ואת BigQuery Reservation API, אם הם לא מופעלים.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, נדרשת ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים -
במסוף Google Cloud , מפעילים את Cloud Shell.
מוודאים שיש לכם מערך נתונים ב-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 Viewer (
roles/bigquery.viewer) - התפקיד BigQuery Connection User (
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 , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב'מזהה חיבור' – לדוגמה,
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 על ידי קריאה לשיטת ה-API tables.insert:
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 , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב'מזהה חיבור' – לדוגמה,
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. - תכונות כמו בקרת גישה פרטנית זמינות רק בטבלאות BigLake של Delta Lake.
עדכון טבלאות 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 באמצעות קריאה לשיטת ה-API tables.patch:
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 , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב'מזהה חיבור' – לדוגמה,
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 reader version 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 בגודל של יותר מ-50 MB בין נקודות הבדיקה.
שם העמודה לא תקין
מוודאים שמיפוי העמודות מופעל בטבלת Delta Lake. מיפוי עמודות נתמך ב-Reader מגרסה 2 ואילך. ב-Reader גרסה 1, מגדירים את 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.מוודאים שמשתנים שנמצאים בשימוש תדיר במשפטי תנאי נמצאים בעמודות של המחיצה.
יכול להיות שיהיה צורך בהגדרות ובתכונות נוספות כדי לעבד מערכי נתונים גדולים (מעל 100 TB). אם השלבים הקודמים לא פותרים את הבעיות, כדאי לפנות אל שירות הלקוחות או אל biglake-help@google.com, במיוחד אם מדובר במערכי נתונים גדולים מ-100 TB.