הגדרת קטלוג מותאם אישית של Apache Iceberg ל-BigQuery כדי להתחבר לקטלוג זמן הריצה של Lakehouse מאפשרת להשתמש באשכולות של Managed Service for Apache Spark או ב- Managed Service for Apache Spark כדי ליצור קטלוג יחיד ומשותף.
כחלק מ-Lakehouse for Apache Iceberg, ההגדרה הזו מאפשרת לכם להשתמש באשכול Managed Service for Apache Spark או ב- Managed Service for Apache Spark כדי ליצור קטלוג משותף יחיד.
אחרי שמגדירים את שכבת המטא-נתונים הזו, היא פועלת עם מנועי קוד פתוח כמו Apache Spark ו-Apache Flink כדי לנהל את הפורמטים של הטבלאות הפתוחות.
לפני שמתחילים
- מפעילים את החיוב בפרויקט Google Cloud . כך בודקים אם החיוב מופעל בפרויקט
מפעילים את ממשקי ה-API של BigQuery ושל Managed Service for Apache Spark.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להגדרת קטלוג זמן הריצה של Lakehouse, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:
-
יוצרים אשכול של Managed Service for Apache Spark:
Dataproc Worker (
roles/dataproc.worker) בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine בפרויקט -
יצירת טבלאות קטלוג של Lakehouse בזמן ריצה:
- Dataproc Worker (
roles/dataproc.worker) בחשבון השירות של מכונת ה-VM של Managed Service for Apache Spark בפרויקט - BigQuery Data Editor (
roles/bigquery.dataEditor) בחשבון שירות של מכונת Dataproc הווירטואלית בפרויקט - משתמש באובייקטים באחסון (
roles/storage.objectUser) בחשבון השירות של מכונת Dataproc הווירטואלית בפרויקט
- Dataproc Worker (
-
שליחת שאילתות לטבלאות בקטלוג זמן הריצה של Lakehouse:
- BigQuery Data Viewer (
roles/bigquery.dataViewer) בפרויקט - BigQuery User (
roles/bigquery.user) בפרויקט - צפייה באובייקטים באחסון (
roles/storage.objectViewer) בפרויקט
- BigQuery Data Viewer (
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
הגדרת קטלוג זמן הריצה של Lakehouse באמצעות Managed Service for Apache Spark
אתם יכולים להגדיר את קטלוג זמן הריצה של Lakehouse באמצעות Managed Service for Apache Spark, Apache Spark או Apache Flink:
Apache Spark
הגדרת אשכול חדש. כדי ליצור אשכול חדש של Managed Service for Apache Spark, מריצים את הפקודה
gcloud dataproc clusters createהבאה, שכוללת את ההגדרות שצריך להשתמש בהן בקטלוג של Lakehouse runtime:gcloud dataproc clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --region=LOCATION \ --single-node
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: שם לאשכול Managed Service for Apache Spark. -
PROJECT_ID: המזהה של Google Cloud הפרויקט שבו יוצרים את האשכול. -
LOCATION: האזור ב-Compute Engine שבו יוצרים את האשכול.
-
שולחים משימת Apache Spark באמצעות אחת מהשיטות הבאות:
Google Cloud CLI
gcloud dataproc jobs submit spark-sql \ --project=PROJECT_ID \ --cluster=CLUSTER_NAME \ --region=REGION \ --jars=https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,BIGLAKE_ICEBERG_CATALOG_JAR \ --properties=spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,\ spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog,\ spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID,\ spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION,\ spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY \ --execute="SPARK_SQL_COMMAND"
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה Google Cloud הפרויקט Google Cloud שמכיל את אשכול Managed Service for Apache Spark. -
CLUSTER_NAME: השם של אשכול Managed Service for Apache Spark שבו אתם משתמשים כדי להריץ את משימת Apache Spark SQL. -
REGION: האזור ב-Compute Engine שבו נמצא האשכול. -
BIGLAKE_ICEBERG_CATALOG_JAR: ה-URI של Cloud Storage של תוסף הקטלוג המותאם אישית של Apache Iceberg שבו רוצים להשתמש. בהתאם למספר הגרסה של Apache Iceberg, בוחרים באחת מהאפשרויות הבאות:- Apache Iceberg 1.9.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.9.1-1.0.1.jar - Apache Iceberg 1.6.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.2.jar
- Apache Iceberg 1.9.1:
-
LOCATION: המיקום של משאבי BigQuery. -
CATALOG_NAME: השם של קטלוג Apache Spark שבו רוצים להשתמש בעבודת ה-SQL. -
WAREHOUSE_DIRECTORY: תיקיית Cloud Storage שמכילה את מחסן הנתונים. הערך הזה מתחיל ב-gs://. -
SPARK_SQL_COMMAND: שאילתת ה-SQL של Apache Spark שרוצים להריץ. השאילתה הזו כוללת את הפקודות ליצירת המשאבים. לדוגמה, כדי ליצור מרחב שמות וטבלה.
spark-sql CLI
נכנסים לדף VM Instances במסוף Google Cloud .
כדי להתחבר למכונה וירטואלית של Managed Service for Apache Spark, לוחצים על SSH בשורה שבה מופיע שם המכונה הווירטואלית הראשית של אשכול Managed Service for Apache Spark, שהוא שם האשכול ואחריו הסיומת
-m. הפלט אמור להיראות כך:Connected, host fingerprint: ssh-rsa ... Linux cluster-1-m 3.16.0-0.bpo.4-amd64 ... ... example-cluster@cluster-1-m:~$בטרמינל, מריצים את פקודת האתחול הבאה לקטלוג של זמן הריצה של Lakehouse:
spark-sql \ --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,BIGLAKE_ICEBERG_CATALOG_JAR \ --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \ --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \ --conf spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION \ --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY
מחליפים את מה שכתוב בשדות הבאים:
-
BIGLAKE_ICEBERG_CATALOG_JAR: ה-URI של Cloud Storage של תוסף הקטלוג המותאם אישית של Apache Iceberg שבו רוצים להשתמש. בהתאם למספר הגרסה של Apache Iceberg, בוחרים באחת מהאפשרויות הבאות:- Apache Iceberg 1.9.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.9.1-1.0.1.jar - Apache Iceberg 1.6.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.2.jar
- Apache Iceberg 1.9.1:
-
CATALOG_NAME: השם של קטלוג Apache Spark שבו אתם משתמשים בעבודת ה-SQL. -
PROJECT_ID: מזהה הפרויקט של קטלוג זמן הריצה של Lakehouse שאליו מקושר קטלוג Apache Spark. Google Cloud -
LOCATION: המיקום Google Cloud של קטלוג זמן הריצה של Lakehouse. -
WAREHOUSE_DIRECTORY: תיקיית Cloud Storage שמכילה את מחסן הנתונים. הערך הזה מתחיל ב-gs://.
אחרי שמתחברים לאשכול, ההודעה
spark-sqlמוצגת במסוף Apache Spark, ואפשר להשתמש בה כדי לשלוח משימות של Apache Spark.spark-sql (default)>-
Apache Flink
יוצרים אשכול Managed Service for Apache Spark עם רכיב Apache Flink אופציונלי מופעל, ומוודאים שאתם משתמשים ב-Managed Service for Apache Spark
2.2או בגרסה מתקדמת יותר.נכנסים לדף VM instances במסוף Google Cloud .
ברשימת המכונות הווירטואליות, לוחצים על SSH כדי להתחבר למכונה הווירטואלית הראשית של אשכול Managed Service for Apache Spark, שמופיעה ברשימה כשם האשכול ואחריו הסיומת
-m.הגדרת הפלאגין Custom Apache Iceberg catalog for BigQuery עבור קטלוג זמן הריצה של Lakehouse:
FLINK_VERSION=1.19 ICEBERG_VERSION=1.6.1 cd /usr/lib/flink sudo wget -c https://repo.maven.apache.org/maven2/org/apache/iceberg/iceberg-flink-runtime-${FLINK_VERSION}/${ICEBERG_VERSION}/iceberg-flink-runtime-${FLINK_VERSION}-${ICEBERG_VERSION}.jar -P lib sudo gcloud storage cp gs://spark-lib/bigquery/iceberg-bigquery-catalog-${ICEBERG_VERSION}-1.0.2.jar lib/
מפעילים את סשן Apache Flink ב-YARN:
HADOOP_CLASSPATH=`hadoop classpath` sudo bin/yarn-session.sh -nm flink-dataproc -d sudo bin/sql-client.sh embedded \ -s yarn-session
יצירת קטלוג ב-Apache Flink:
CREATE CATALOG CATALOG_NAME WITH ( 'type'='iceberg', 'warehouse'='WAREHOUSE_DIRECTORY', 'catalog-impl'='org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog', 'gcp_project'='PROJECT_ID', 'gcp_location'='LOCATION' );
מחליפים את מה שכתוב בשדות הבאים:
-
CATALOG_NAME: מזהה הקטלוג של Apache Flink שמקושר לקטלוג של זמן הריצה של Lakehouse. -
WAREHOUSE_DIRECTORY: נתיב הבסיס של ספריית מחסן הנתונים (התיקייה ב-Cloud Storage שבה Apache Flink יוצר קבצים). הערך הזה מתחיל ב-gs://. -
PROJECT_ID: מזהה הפרויקט של קטלוג זמן הריצה של Lakehouse שאליו מקושר קטלוג Apache Flink. -
LOCATION: המיקום של מקורות המידע ב-BigQuery.
-
הסשן של Apache Flink מחובר עכשיו לקטלוג של Lakehouse runtime, ואפשר להריץ פקודות Apache Flink SQL.
ניהול משאבים בקטלוג של זמן הריצה של Lakehouse
עכשיו, אחרי שהתחברתם לקטלוג של זמן הריצה של Lakehouse, אתם יכולים ליצור משאבים ולצפות בהם על סמך המטא-נתונים שמאוחסנים בקטלוג של זמן הריצה של Lakehouse.
לדוגמה, אפשר להריץ את הפקודות הבאות בסשן אינטראקטיבי של Apache Flink SQL כדי ליצור מסד נתונים וטבלה של Apache Iceberg.
שימוש בקטלוג מותאם אישית של Apache Iceberg ל-BigQuery:
USE CATALOG CATALOG_NAME;
מחליפים את
CATALOG_NAMEבמזהה הקטלוג של Apache Flink.יוצרים מסד נתונים, וכך נוצר מערך נתונים ב-BigQuery:
CREATE DATABASE IF NOT EXISTS DATABASE_NAME;
מחליפים את
DATABASE_NAMEבשם של מסד הנתונים החדש.משתמשים במסד הנתונים שיצרתם:
USE DATABASE_NAME;
יוצרים טבלת Apache Iceberg. הקוד הבא יוצר טבלת מכירות לדוגמה:
CREATE TABLE IF NOT EXISTS ICEBERG_TABLE_NAME ( order_number BIGINT, price DECIMAL(32,2), buyer ROW<first_name STRING, last_name STRING>, order_time TIMESTAMP(3) );
מחליפים את
ICEBERG_TABLE_NAMEבשם של הטבלה החדשה.צפייה במטא-נתונים של טבלה:
DESCRIBE EXTENDED ICEBERG_TABLE_NAME;
מציגים רשימה של הטבלאות במסד הנתונים:
SHOW TABLES;
הוספת נתונים לטבלה
אחרי שיוצרים טבלת Apache Iceberg כמו שמתואר בקטע הקודם, אפשר להשתמש ב-Apache Flink DataGen כמקור נתונים כדי להטמיע נתונים בזמן אמת בטבלה. השלבים הבאים הם דוגמה לתהליך העבודה הזה:
יצירת טבלה זמנית באמצעות DataGen:
CREATE TEMPORARY TABLE DATABASE_NAME.TEMP_TABLE_NAME WITH ( 'connector' = 'datagen', 'rows-per-second' = '10', 'fields.order_number.kind' = 'sequence', 'fields.order_number.start' = '1', 'fields.order_number.end' = '1000000', 'fields.price.min' = '0', 'fields.price.max' = '10000', 'fields.buyer.first_name.length' = '10', 'fields.buyer.last_name.length' = '10' ) LIKE DATABASE_NAME.ICEBERG_TABLE_NAME (EXCLUDING ALL);
מחליפים את מה שכתוב בשדות הבאים:
-
DATABASE_NAME: שם מסד הנתונים שבו תאוחסן הטבלה הזמנית. -
TEMP_TABLE_NAME: שם לטבלה הזמנית. -
ICEBERG_TABLE_NAME: השם של טבלת Apache Iceberg שיצרתם בקטע הקודם.
-
מגדירים את רמת המקביליות ל-1:
SET 'parallelism.default' = '1';
מגדירים את מרווח הזמן בין נקודות הביקורת:
SET 'execution.checkpointing.interval' = '10second';
מגדירים את נקודת הביקורת:
SET 'state.checkpoints.dir' = 'hdfs:///flink/checkpoints';
מפעילים את משימת הסטרימינג בזמן אמת:
INSERT INTO ICEBERG_TABLE_NAME SELECT * FROM TEMP_TABLE_NAME;
הפלט אמור להיראות כך:
[INFO] Submitting SQL update statement to the cluster... [INFO] SQL update statement has been successfully submitted to the cluster: Job ID: 0de23327237ad8a811d37748acd9c10b
כדי לבדוק את הסטטוס של עבודת הסטרימינג:
נכנסים לדף Clusters במסוף Google Cloud .
בוחרים את האשכול.
לוחצים על הכרטיסייה Web interfaces (ממשקי אינטרנט).
לוחצים על הקישור YARN ResourceManager.
בממשק YARN ResourceManager, מוצאים את סשן Apache Flink ולוחצים על הקישור ApplicationMaster בקטע Tracking UI.
בעמודה סטטוס, מוודאים שהסטטוס של העבודה הוא פועל.
הפעלת שאילתות על נתונים שמוזרמים בלקוח SQL של Apache Flink:
SELECT * FROM ICEBERG_TABLE_NAME /*+ OPTIONS('streaming'='true', 'monitor-interval'='3s')*/ ORDER BY order_time desc LIMIT 20;
הרצת שאילתות על נתונים בסטרימינג ב-BigQuery:
SELECT * FROM `DATABASE_NAME.ICEBERG_TABLE_NAME` ORDER BY order_time desc LIMIT 20;
מפסיקים את עבודת הסטרימינג בלקוח Apache Flink SQL:
STOP JOB 'JOB_ID';
מחליפים את
JOB_IDבמזהה המשימה שהוצג בפלט כשיוצרים את משימת הסטרימינג.
הגדרת קטלוג זמן הריצה של Lakehouse באמצעות Managed Service for Apache Spark
אתם יכולים להגדיר את קטלוג זמן הריצה של Lakehouse באמצעות Managed Service for Apache Spark, באמצעות Apache Spark SQL או PySpark.
Apache Spark SQL
יוצרים קובץ SQL עם פקודות Apache Spark SQL שרוצים להריץ בקטלוג של זמן הריצה של Lakehouse. לדוגמה, הפקודה הבאה יוצרת מרחב שמות וטבלה:
CREATE NAMESPACE `CATALOG_NAME`.NAMESPACE_NAME; CREATE TABLE `CATALOG_NAME`.NAMESPACE_NAME.TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';
מחליפים את מה שכתוב בשדות הבאים:
-
CATALOG_NAME: שם הקטלוג שמפנה לטבלת Apache Spark. -
NAMESPACE_NAME: השם של מרחב השמות שמפנה לטבלת Apache Spark. -
TABLE_NAME: שם הטבלה שלכם ב-Apache Spark. -
WAREHOUSE_DIRECTORY: ה-URI של תיקיית Cloud Storage שבה מאוחסן מחסן הנתונים.
-
שולחים משימה באצווה של Apache Spark SQL על ידי הרצת הפקודה
gcloud dataproc batches submit spark-sqlהבאה:gcloud dataproc batches submit spark-sql SQL_SCRIPT_PATH \ --project=PROJECT_ID \ --region=REGION \ --subnet=projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME \ --deps-bucket=BUCKET_PATH \ --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog, \ spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog, \ spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID, \ spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION, \ spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY"
מחליפים את מה שכתוב בשדות הבאים:
-
SQL_SCRIPT_PATH: הנתיב לקובץ ה-SQL שבו משתמשת משימה באצווה. -
PROJECT_ID: מזהה Google Cloud הפרויקט שבו תופעל משימה באצווה. -
REGION: האזור שבו עומס העבודה פועל. -
SUBNET_NAME(אופציונלי): השם של רשת משנה של VPC ב-REGIONשעומדת בדרישות של רשת משנה של סשן. -
BUCKET_PATH: המיקום של קטגוריית Cloud Storage להעלאת התלויות של עומס העבודה. הקטגוריהWAREHOUSE_DIRECTORYנמצאת בדלי הזה. אין צורך לציין את הקידומתgs://URI של קטגוריית האחסון. אפשר לציין את הנתיב לקטגוריה או את שם הקטגוריה, לדוגמה,mybucketname1. -
LOCATION: המיקום שבו תופעל משימה באצווה.
מידע נוסף על שליחת משימות עיבוד ברצף (batch) של Apache Spark זמין במאמר הרצת עומס עבודה של Apache Spark.
-
PySpark
יוצרים קובץ Python עם פקודות PySpark שרוצים להריץ בקטלוג של זמן הריצה של Lakehouse.
לדוגמה, הפקודה הבאה מגדירה סביבת Apache Spark כדי ליצור אינטראקציה עם טבלאות Apache Iceberg שמאוחסנות בקטלוג של זמן הריצה של Lakehouse. הפקודה יוצרת מרחב שמות חדש וטבלת Apache Iceberg בתוך מרחב השמות הזה.
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Lakehouse runtime catalog Iceberg") \ .config("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION") \ .config("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY") \ .getOrCreate() spark.sql("USE `CATALOG_NAME`;") spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;") spark.sql("USE NAMESPACE_NAME;") spark.sql("CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';")
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה Google Cloud הפרויקט שבו תופעל משימה באצווה. -
LOCATION: המיקום שבו נמצאים מקורות המידע ב-BigQuery. -
CATALOG_NAME: שם הקטלוג שמפנה לטבלת Apache Spark. -
TABLE_NAME: שם הטבלה שלכם ב-Apache Spark. -
WAREHOUSE_DIRECTORY: ה-URI של תיקיית Cloud Storage שבה מאוחסן מחסן הנתונים. -
NAMESPACE_NAME: השם של מרחב השמות שמפנה לטבלת Apache Spark.
-
שולחים את משימה באצווה באמצעות הפקודה
gcloud dataproc batches submit pysparkהבאה:gcloud dataproc batches submit pyspark PYTHON_SCRIPT_PATH \ --version=2.2 \ --project=PROJECT_ID \ --region=REGION \ --deps-bucket=BUCKET_PATH \ --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog,spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID,spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION,spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY"
מחליפים את מה שכתוב בשדות הבאים:
-
PYTHON_SCRIPT_PATH: הנתיב לסקריפט Python שבו נעשה שימוש במשימה באצווה. -
PROJECT_ID: מזהה Google Cloud הפרויקט שבו תופעל משימה באצווה. -
REGION: האזור שבו עומס העבודה פועל. -
BUCKET_PATH: המיקום של קטגוריית Cloud Storage להעלאת תלות של עומסי עבודה. אין צורך לציין את הקידומתgs://URI של קטגוריית האחסון. אפשר לציין את נתיב הקטגוריה או את שם הקטגוריה, לדוגמה,mybucketname1.
מידע נוסף על שליחת משימות אצווה של PySpark זמין בהפניה ל-PySpark gcloud.
-