שימוש בווקטורים בינאריים למחיקה בטבלאות Iceberg V3

וקטורים בינאריים של מחיקה בטבלאות Apache Iceberg V3 מאפשרים לתעד מחיקות ברמת השורה בקובצי .puffin בלי לשכתב קובצי נתונים שלמים. במקום לבצע פעולות JOIN יקרות בזמן השאילתה, מנועים כמו BigQuery,‏ Managed Service for Apache Spark,‏ Apache Flink ו-Trino משתמשים בווקטורים האלה כדי לזהות שורות שנמחקו ולדלג עליהן במהלך הקריאה.

האופטימיזציה הזו נתמכת בקטלוג הייעודי לזמן ריצה של Lakehouse, והיא יכולה לשפר את ביצועי הכתיבה והקריאה של צינורות עיבוד נתונים בנפח גבוה של סימון נתונים שהשתנו (CDC). הוא גם עוזר לכם לעמוד בדרישות רגולטוריות כמו GDPR (הזכות להישכח) על ידי מחיקת רשומות ספציפיות בלי העומס של כתיבה מחדש של קובצי נתונים.

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

  1. מוודאים שהחיוב מופעל בפרויקט ב- Google Cloud .

  2. מפעילים את BigLake API, אם הוא עדיין לא מופעל.

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

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

    להפעלת ה-API

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

כדי לקבל את ההרשאות שדרושות ליצירה ולניהול של טבלאות Iceberg V3, בקשו מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט ובקטגוריית האחסון:

  • ליצור ולנהל טבלאות Iceberg V3:
    • אדמין של BigLake‏ (roles/biglake.admin) – הפרויקט שלכם
    • אדמין של אחסון (roles/storage.admin) – קטגוריית היעד של Cloud Storage

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

הגדרת קטלוג REST של Iceberg

לפני שיוצרים טבלת Iceberg V3, צריך להגדיר את קטלוג Iceberg REST, כולל יצירת מרחב שמות וקטלוג.

הגדרת קטלוג REST של Iceberg יכולה להימשך זמן מה. לפני שממשיכים, חשוב לוודא שגם מרחב השמות וגם הקטלוג נוצרו בהצלחה.

מגבלות

לטבלאות Iceberg V3 בקטלוג הייעודי לזמן ריצה של Lakehouse יש את המגבלות הבאות:

  • סוגי נתונים חדשים ב-V3: אין תמיכה בסוגי נתונים חדשים ב-Iceberg V3 (כמו וריאנט, מיקום גיאוגרפי, חותמת זמן בננו-שניות, ערכי ברירת מחדל וסוגי נתונים לא ידועים).
  • מעקב אחר שושלת נתונים של שורות: אין תמיכה במעקב אחר שושלת נתונים של שורות.
  • כתיבה ב-BigQuery: אי אפשר לכתוב ב-BigQuery בטבלאות בגרסה 3. אפשר לקרוא טבלאות בגרסה 3 רק מ-BigQuery. כדי ליצור טבלאות בגרסה 3 ולכתוב בהן, צריך להשתמש במנועי קוד פתוח (כמו Apache Spark,‏ Apache Flink או Trino).

דרישות לגבי מנועי חיפוש

חשוב לוודא שאתם משתמשים בגרסת מנוע שתומכת ב-Iceberg V3 ובווקטורים של מחיקה בינארית. מומלץ להשתמש ב-Apache Spark בגרסה 3.5 ואילך. הדוגמאות במדריך הזה משתמשות ב-iceberg-spark-runtime-3.5_2.12:1.10.1.

כשמגדירים את הטבלה ואת הסשן של המנוע, צריך לוודא את הפרטים הבאים:

  • גרסת פורמט הטבלה: צריך להגדיר את הערך format-version='3'.
  • מצב מחיקה: צריך להיות מוגדר כ-merge-on-read. במצב הזה, המחיקות נכתבות בקבצים נפרדים (וקטורי המחיקה) במקום לשכתב את קובצי הנתונים המקוריים (העתקה בזמן כתיבה).

הגדרת סשן Spark לדוגמה

ההגדרות הבאות מפעילות את התוספים הנדרשים של Iceberg ומגדירות את החיבור לקטלוג REST:

spark-sql \
    --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.1,org.apache.iceberg:iceberg-gcp:1.10.1 \
    --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-gcp-bundle/1.10.1/iceberg-gcp-bundle-1.10.1.jar \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
    --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.CATALOG_NAME.type=rest \
    --conf spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog \
    --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_PATH \
    --conf spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID \
    --conf spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager \
    --conf spark.sql.catalog.CATALOG_NAME.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO \
    --conf spark.sql.defaultCatalog=CATALOG_NAME

מחליפים את מה שכתוב בשדות הבאים:

  • ‫CATALOG_NAME: השם של נקודת הקצה של קטלוג ה-REST של Apache Iceberg.
  • ‫WAREHOUSE_PATH: ה-URI של התיקייה ב-Cloud Storage שבה מאוחסן מחסן הנתונים, שמתחיל ב-gs://.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

שימוש בווקטורים בינאריים של מחיקה

כדי להשתמש בווקטורים בינאריים של מחיקה בטבלאות Apache Iceberg V3, צריך ליצור טבלה עם גרסת עיצוב 3, לאכלס את הטבלה בנתונים, לבצע שינויים סטנדרטיים במסד הנתונים ולשלוח שאילתה לטבלה. אתם יכולים להריץ את כל ההצהרות של יצירה, הוספה, מחיקה ועדכון באמצעות Spark SQL.

יצירת טבלת Iceberg עם וקטורים בינאריים של מחיקה

יוצרים טבלה ומציינים את format-version='3' ואת מצבי המחיקה, העדכון והמיזוג של merge-on-read במאפייני הטבלה. מריצים את ההצהרה הבאה ב-Spark SQL:

Spark

CREATE NAMESPACE IF NOT EXISTS my_namespace;
USE my_namespace;

CREATE TABLE my_namespace.mytable_v3 (
   id BIGINT,
   city STRING,
   state STRING
) TBLPROPERTIES (
   'format-version'='3',
   'write.delete.mode'='merge-on-read',
   'write.update.mode'='merge-on-read',
   'write.merge.mode'='merge-on-read'
);

שדרוג טבלת Iceberg מגרסה 2 לגרסה 3

אתם יכולים לשדרג טבלת Iceberg V2 קיימת ל-V3 באמצעות הצהרות ALTER TABLE. אי אפשר לשנמך טבלה מגרסה 3 לגרסה 2. מריצים את ההצהרה הבאה ב-Spark SQL:

Spark

ALTER TABLE my_namespace.mytable_v2 SET TBLPROPERTIES ('format-version' = '3');

הוספת נתונים לטבלה

כדי לוודא שנוצרים קובצי וקטור של מחיקה בינארית, המנוע לא יכול לחזור למצב של העתקה בזמן כתיבה. בדרך כלל, כדי שזה יקרה צריך להיות בטבלה כמות משמעותית של נתונים לפני פעולת המחיקה. לדוגמה, Apache Spark עשוי לבצע אופטימיזציה של מחיקות קטנות על ידי חזרה ל-copy-on-write. כדי לאכלס את הטבלה, מריצים את ההצהרות הבאות ב-Spark SQL:

Spark

-- Create a temporary view with a large number of rows (100,000 rows)
CREATE OR REPLACE TEMPORARY VIEW large_source AS
SELECT
  id,
  CAST(id AS STRING) as city,
  'WA' as state
FROM (
  SELECT row_number() OVER (ORDER BY (SELECT NULL)) as id
  FROM (SELECT 0 FROM range(1000)) a
  CROSS JOIN (SELECT 0 FROM range(100)) b
);

-- Overwrite the existing table with the generated data
INSERT OVERWRITE my_namespace.mytable_v3 SELECT * FROM large_source;

מחיקת נתונים

מריצים הצהרת DELETE ב-Spark SQL. מכיוון שהטבלה מוגדרת ל-merge-on-read ויש בה מספיק נתונים, Spark יוצר קובצי מחיקה באמצעות וקטורים בינאריים של מחיקה.

Spark

DELETE FROM my_namespace.mytable_v3 WHERE id = 5000;

עדכון נתונים

מריצים הצהרת UPDATE ב-Spark SQL. בגלל שהטבלה מוגדרת ל-merge-on-read ויש בה מספיק נתונים, Spark יוצר קובצי מחיקה באמצעות וקטורים בינאריים של מחיקה.

Spark

UPDATE my_namespace.mytable_v3 SET state = 'NY' WHERE id = 1;

הרצת שאילתה על הטבלה

שאילתות בטבלה משתמשות באופן אוטומטי בקובצי וקטור המחיקה הבינאריים כדי להחריג שורות שנמחקו. אפשר לשלוח שאילתות לטבלה באמצעות Apache Spark או BigQuery.

Spark

-- Should be less than the initial 100,000 rows
SELECT count(*) FROM my_namespace.mytable_v3;

-- Should return no results
SELECT * FROM my_namespace.mytable_v3 WHERE id = 5000;

-- Should return 'NY'
SELECT * FROM my_namespace.mytable_v3 WHERE id = 1;

BigQuery

כששולחים שאילתה מ-BigQuery, צריך להשתמש במזהה הטבלה המלא PROJECT_ID.CATALOG_NAME.my_namespace.mytable_v3.

bq query --nouse_legacy_sql \
    'SELECT * FROM `PROJECT_ID.CATALOG_NAME.my_namespace.mytable_v3` LIMIT 10'

אימות היצירה של וקטורי מחיקה בינאריים

כדי לוודא שנוצרו וקטורים בינאריים של מחיקה, בודקים את ספריית האחסון ואת המטא-נתונים של תמונת המצב.

חיפוש קובצי .puffin

עוברים לספריית הנתונים של הטבלה במחסן הנתונים של Cloud Storage (לדוגמה, gs://WAREHOUSE_BUCKET/my_namespace/mytable_v3/data). אמורים להיות שם קובצי .puffin שבהם מאוחסנים וקטורי המחיקה הבינאריים.

בדיקת המטא-נתונים של תמונת המצב

המטא-נתונים של תמונת המצב בקובצי ה-JSON של טבלת Iceberg מכילים מידע על פעולת המחיקה. חפשו מאפיינים כמו added-delete-files,‏ added-dvs ו-operation בסיכום של תמונת המצב. זהו אישור לכך שנוספו קובצי מחיקה.

"summary": {
  "operation": "delete",
  "added-delete-files": "1",
  "added-dvs": "1",
  "added-files-size": "42",
  "added-position-deletes": "1",
  ...
}

המאמרים הבאים