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

    להפעלת ה-API

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

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

  • הכול:
    • אדמין 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. אפשר לקרוא טבלאות בגרסה 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: השם של נקודת הקצה של קטלוג Apache Iceberg REST.
  • 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 V2 ל-V3

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

Spark

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

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

כדי לוודא שנוצרים קבצים של וקטור מחיקה בינארי למחיקות, המנוע לא יכול לחזור לשיטת העתקה בעת כתיבה. בדרך כלל נדרשת כמות גדולה של נתונים בטבלה לפני פעולת המחיקה. לדוגמה, יכול להיות ש-Apache Spark יבצע אופטימיזציה למחיקות קטנות על ידי חזרה לשיטת העתקה בעת כתיבה. כדי לאכלס את הטבלה, מריצים את ההצהרות הבאות ב-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",
  ...
}

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