יצירת טבלאות חיצוניות של 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.

לפני שמתחילים

  1. בדף לבחירת הפרויקט במסוף Cloud de Confiance , בוחרים פרויקט ב- Cloud de Confiance או יוצרים אותו.

    התפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים?

    כניסה לדף לבחירת הפרויקט

  2. מוודאים שהחיוב מופעל בפרויקט ב- Cloud de Confiance .

  3. מפעילים את BigQuery Connection API ואת BigQuery Reservation API, אם הם עדיין לא מופעלים.

    התפקידים שנדרשים כדי להפעיל ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    הפעלת ממשקי ה-API

  4. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

  5. מוודאים שיש לכם קבוצת נתונים ב-BigQuery.

  6. מוודאים שגרסת Google Cloud SDK היא 366.0.0 ואילך:

    gcloud version
    

    במקרה הצורך, מעדכנים את Google Cloud SDK.

  7. יוצרים קישור למשאבים ב-Cloud על סמך מקור הנתונים החיצוני, ונותנים לקישור הזה גישה ל-Cloud Storage. אם אין לכם את ההרשאות המתאימות ליצירת חיבור, בקשו מהאדמין של BigQuery ליצור חיבור ולשתף אותו איתכם.

התפקידים הנדרשים

כדי ליצור טבלת Delta Lake, צריך את ההרשאות הבאות:

  • bigquery.tables.create
  • bigquery.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

    כשמציגים את פרטי החיבור במסוף Cloud de Confiance , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב-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

    כשמציגים את פרטי החיבור במסוף Cloud de Confiance , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב-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

    כשמציגים את פרטי החיבור במסוף Cloud de Confiance , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב-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 כדי לדחוס את קובצי הנתונים הבסיסיים ולהסיר קבצים מיותרים, כמו נתונים ומטא-נתונים.

  • מוודאים שהערך של delta.checkpoint.writeStatsAsStruct הוא true.

  • חשוב לוודא שמשתנים שמשתמשים בהם לעיתים קרובות בסעיפי פרדיקט נמצאים בעמודות של חלוקה למחיצות.

במערכי נתונים גדולים (יותר מ-100TB) יכול להיות שכדאי להשתמש בתכונות ובהגדרות נוספות. אם השלבים הקודמים לא פותרים את הבעיות, כדאי לפנות לשירות הלקוחות או לכתובת biglake-help@google.com, במיוחד לגבי מערכי נתונים שגדולים מ-100TB.