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

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

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

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

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

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

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

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

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

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (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 runtime יש את המגבלות הבאות:

  • סוגי נתונים חדשים בגרסה 3: אין תמיכה בסוגי נתונים חדשים ב-Iceberg גרסה 3 (כמו Variant,‏ Geography,‏ Nanosecond timestamp,‏ ערכי ברירת מחדל וסוגי נתונים לא ידועים).
  • מעקב אחר מקורות נתונים ברמת השורה: אין תמיכה במעקב אחר מקורות נתונים ברמת השורה.
  • פעולות כתיבה ב-BigQuery: פעולות כתיבה ב-BigQuery לא נתמכות בטבלאות בגרסה 3. אפשר לקרוא טבלאות V3 רק מ-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",
  ...
}

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