הגדרת Spark עם טבלאות Delta

במאמר הזה מוסבר איך להגדיר את Apache Spark עם קטלוג ייעודי לזמן ריצה של Lakehouse כדי להשתמש בטבלאות Delta Lake. תלמדו איך ליצור קטלוג של Apache Hive, להגדיר סשנים של Spark כדי להתחבר למטא-נתונים ולהריץ עומסי עבודה כדי ליצור ולרשום טבלאות Delta לשאילתות ב-BigQuery.

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

  1. מידע על נקודת הקצה של קטלוג Hive
  2. בודקים את פורמטי האחסון וסוגי הנתונים הנתמכים.
  3. מעיינים במגבלות ובשיקולים.
  4. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  5. Verify that billing is enabled for your Google Cloud project.

  6. Enable the Lakehouse, Managed Service for Apache Spark APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  7. Verify that billing is enabled for your Google Cloud project.

  8. Enable the Lakehouse, Managed Service for Apache Spark APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

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

כדי לקבל את ההרשאות שדרושות לשימוש בקטלוג ייעודי לזמן ריצה של Lakehouse עם טבלאות Delta, בקשו מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

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

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

הוראות מפורטות מופיעות במאמר הקצאת תפקיד יחיד.

תהליך עבודה כללי

כדי להשתמש בקטלוג הייעודי לזמן ריצה של Lakehouse עם טבלאות Delta, פועלים לפי תהליך העבודה הבא:

  1. יוצרים קטלוג של Lakehouse Hive.
  2. מגדירים את סשן Spark עם לקוח המטא-נתונים של Lakehouse ויחסי התלות של Delta Lake.
  3. יוצרים טבלאות Delta ב-Cloud Storage ומאכלסים אותן באמצעות Spark, שרושם אותן במאגר המטא-נתונים.
  4. שולחים שאילתות לטבלאות Delta מ-Apache Spark (קריאה וכתיבה) או ישירות מ-BigQuery (קריאה בלבד).

יצירת קטלוג Hive של Lakehouse

כדי להשתמש בקטלוג ייעודי לזמן ריצה של Lakehouse עם טבלאות Spark ו-Delta, צריך ליצור קטלוג Hive.

קטלוג Hive ב-Lakehouse הוא אוסף של מסדי נתונים של Hive. לפני שמריצים משימות Spark, צריך ליצור קטלוג כדי לרשום אותו ב-Lakehouse Metastore. צריך לתת לקטלוג שם ולבחור מיקום ב-Cloud Storage שבו הנתונים יישמרו.

המסוף

  1. פותחים את הדף Lakehouse במסוף Google Cloud .

    מעבר אל Lakehouse

  2. לוחצים על יצירת קטלוג.

  3. בוחרים באפשרות קטלוג זמן הריצה של Lakehouse.

  4. בשדה Catalog type, בוחרים באפשרות Hive Metastore.

  5. בשדה Select a Cloud Storage bucket (בחירת קטגוריה ב-Cloud Storage), מזינים את שם הקטגוריה ב-Cloud Storage של הקטלוג. אפשר גם ללחוץ על Browse כדי לבחור או ליצור קטגוריה.

  6. בשדה Catalog ID, מזינים שם לקטלוג של Lakehouse Hive.

  7. בשדה Primary location, מציינים את אותו אזור של הקטגוריה.

  8. לוחצים על יצירה.

gcloud

כדי ליצור קטלוג Hive, מריצים את הפקודה הבאה:

gcloud biglake hive catalogs create LAKEHOUSE_CATALOG_ID \
    --project=PROJECT_ID \
    --location-uri="gs://GCS_WAREHOUSE_PATH" \
    --primary-location=REGION \
    --description="DESCRIPTION"

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

  • ‫LAKEHOUSE_CATALOG_ID: שם הקטלוג של Hive.

  • ‫GCS_WAREHOUSE_PATH: הנתיב ב-Cloud Storage לנתוני המחסן.

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud.

  • ‫REGION: האזור הראשי של ה-Metastore. בקטגוריות באזור יחיד, המיקום תואם לאזור של הקטגוריה. לקטגוריות בשני אזורים או במספר אזורים, צריך לציין אזור משויך בשביל הרפליקה הראשית. האזור השני הופך לרפליקה המשנית.

  • ‫DESCRIPTION: תיאור של הקטלוג.

הגדרת Spark לשימוש בטבלאות Delta

כדי להשתמש בקטלוג של Lakehouse runtime עם טבלאות Delta, צריך להגדיר את סשן Spark עם Lakehouse metastore client factory ותוספים של Delta Lake.

spark-sql

  1. משתמשים ב-SSH כדי להתחבר לצומת הראשי של האשכול ב-Managed Service for Apache Spark.
  2. מריצים את spark-sql בשורת הפקודה עם המאפיינים הבאים כדי להתחיל סשן אינטראקטיבי של Spark SQL:

    spark-sql \
        --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
        --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \
        --conf spark.hive.metastore.client.factory.class=com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory \
        --conf spark.hive.metastore.blms.project.id=PROJECT_ID \
        --conf spark.hive.metastore.blms.catalog.default=LAKEHOUSE_CATALOG_ID \
        --conf spark.hive.metastore.warehouse.dir=gs://GCS_WAREHOUSE_PATH
    
  3. אחרי שהסשן מתחיל, Spark מתחבר לקטלוג הייעודי לזמן ריצה של Lakehouse.

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

    -- Show all the databases in the current project.
    SHOW DATABASES;
    
    -- Create a database.
    CREATE DATABASE spark_delta_blms_database;
    
    -- Create a Delta data source table.
    CREATE TABLE spark_delta_blms_database.delta_quick_start (id INT, name STRING) USING DELTA;
    
    -- Insert data into the table.
    INSERT INTO TABLE spark_delta_blms_database.delta_quick_start VALUES (1, 'my-first-user');
    
    -- Query the Delta table.
    SELECT * FROM spark_delta_blms_database.delta_quick_start;
    

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

    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

    • ‫LAKEHOUSE_CATALOG_ID: שם הקטלוג של Hive.

    • ‫GCS_WAREHOUSE_PATH: הנתיב ב-Cloud Storage שבו מאוחסנים נתוני מחסן הנתונים.

Jupyter Notebook

  1. הרצת Jupyter Notebook באשכול של Managed Service for Apache Spark.
  2. נכנסים לממשק האינטרנט של Jupyter מהכרטיסייה Web interfaces בדף הפרטים של האשכול במסוף Google Cloud .
  3. ב-notebook חדש, יוצרים סשן Spark שמוגדר ל-Delta Lake ומריצים שאילתות:

    from pyspark.sql import SparkSession
    
    # If a Spark session exists, stop it first by running spark.stop()
    spark = SparkSession.builder\
        .master("local")\
        .appName("Lakehouse runtime catalog Delta tutorial")\
        .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")\
        .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")\
        .config("spark.hive.metastore.client.factory.class", "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory")\
        .config("spark.hive.metastore.blms.project.id", "PROJECT_ID")\
        .config("spark.hive.metastore.warehouse.dir", "gs://GCS_WAREHOUSE_PATH")\
        .config("spark.hive.metastore.blms.catalog.default", "LAKEHOUSE_CATALOG_ID")\
        .getOrCreate()
    
    # Show all the databases.
    df = spark.sql("SHOW DATABASES;")
    df.show()
    
    # Create a database.
    spark.sql("CREATE DATABASE jupyter_delta_blms_db")
    
    # Create a Delta data source table.
    spark.sql("CREATE TABLE jupyter_delta_blms_db.delta_table(id INT, name STRING) USING DELTA")
    
    # Insert data into the table.
    spark.sql("INSERT INTO TABLE jupyter_delta_blms_db.delta_table VALUES (1, 'my-first-user');")
    
    # Query from table.
    spark.sql("SELECT * FROM jupyter_delta_blms_db.delta_table;").show()
    

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

    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

    • ‫GCS_WAREHOUSE_PATH: הנתיב ב-Cloud Storage שבו מאוחסנים נתוני המחסן.

    • ‫LAKEHOUSE_CATALOG_ID: שם הקטלוג של Hive.

‫BigQuery Notebook

  1. במסוף Google Cloud , נכנסים ל-BigQuery.

    כניסה ל-BigQuery

  2. בחלונית Explorer, לוחצים על ‎+ ADD ואז על Python notebook.

  3. בתא קוד, מגדירים את הסשן של Managed Service for Apache Spark עם תוספי Delta ומאפייני קטלוג ייעודי לזמן ריצה של Lakehouse:

    from google.cloud.dataproc_spark_connect import DataprocSparkSession
    from google.cloud.dataproc_v1 import Session
    import os
    
    os.environ['DATAPROC_SPARK_CONNECT_DEFAULT_DATASOURCE'] = ""
    
    session = Session()
    session.environment_config.execution_config.ttl = {"seconds": 864000}
    session.runtime_config.version = "2.3"
    session.runtime_config.properties = {
     "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
     "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.delta.catalog.DeltaCatalog",
     "spark.hive.metastore.blms.project.id": "PROJECT_ID",
     "spark.hive.metastore.blms.catalog.default": "LAKEHOUSE_CATALOG_ID",
     "spark.hive.metastore.warehouse.dir": "gs://GCS_WAREHOUSE_PATH",
     "spark.hive.metastore.client.factory.class": "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory",
     "spark.sql.catalogImplementation": "hive"
    }
    
    spark = DataprocSparkSession.builder.dataprocSessionConfig(session).getOrCreate()
    print("Spark session created successfully")
    
  4. בתא קוד אחר, יוצרים מסד נתונים וטבלת Delta:

    # Create a database
    spark.sql("CREATE DATABASE bq_spark_delta_database;")
    
    # Create a Delta data source table
    spark.sql("CREATE TABLE bq_spark_delta_database.delta_quick_start (id INT, name STRING) USING DELTA;")
    
    # Insert data into the table
    spark.sql("INSERT INTO TABLE bq_spark_delta_database.delta_quick_start VALUES (1, 'my-first-user');")
    
    # Query from table
    spark.sql("SELECT * FROM bq_spark_delta_database.delta_quick_start;").show()
    

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

    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

    • ‫GCS_WAREHOUSE_PATH: הנתיב ב-Cloud Storage שבו מאוחסנים נתוני המחסן.

    • ‫LAKEHOUSE_CATALOG_ID: שם הקטלוג של Hive.

שליחת משימה באצווה ב-Managed Service for Apache Spark

אתם יכולים לשלוח עומס עבודה של אצווה ב-PySpark אל Managed Service for Apache Spark כדי ליצור טבלאות Delta ולשאול שאילתות לגביהן באמצעות קטלוג זמן הריצה של Lakehouse.

  1. יוצרים קובץ Python עם עבודת PySpark:

    from pyspark.sql import SparkSession
    
    spark = (
        SparkSession.builder.appName("Lakehouse runtime catalog Delta tutorial")
        .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
        .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
        .config(
            "spark.hive.metastore.client.factory.class",
            "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory",
        )
        .config("spark.hive.metastore.blms.project.id", "PROJECT_ID")
        .config("spark.hive.metastore.blms.catalog.default", "LAKEHOUSE_CATALOG_ID")
        .config(
            "spark.hive.metastore.warehouse.dir",
            "gs://GCS_WAREHOUSE_PATH",
        )
        .enableHiveSupport()
        .getOrCreate()
    )
    
    # Show all the databases.
    spark.sql("SHOW DATABASES;").show()
    
    # Create a database.
    spark.sql("CREATE DATABASE dp_serverless_delta_db")
    
    # Create a Delta data source table.
    spark.sql(
        "CREATE TABLE dp_serverless_delta_db.delta_table(id INT, name STRING) USING DELTA"
    )
    
    # Insert data into the table.
    spark.sql("INSERT INTO TABLE dp_serverless_delta_db.delta_table VALUES (1, 'my-first-user');")
    
    # Query from table.
    spark.sql("SELECT * FROM dp_serverless_delta_db.delta_table;").show()
    

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

    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

    • ‫LAKEHOUSE_CATALOG_ID: שם הקטלוג של Hive.

    • ‫GCS_WAREHOUSE_PATH: הנתיב ב-Cloud Storage שבו מאוחסנים נתוני מחסן הנתונים.

  2. שולחים את המשימה באצווה:

    gcloud dataproc batches submit pyspark PYTHON_SCRIPT_FILE \
        --version=2.2 \
        --project=PROJECT_ID \
        --region=REGION \
        --deps-bucket=gs://CLOUD_STORAGE_BUCKET
    

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

    • ‫PYTHON_SCRIPT_FILE: הנתיב המקומי או ב-Cloud Storage לקובץ של אפליקציית PySpark.
    • PROJECT_ID: מזהה הפרויקט.
    • ‫REGION: האזור שבו תתבצע המשימה באצווה.
    • ‫CLOUD_STORAGE_BUCKET: קטגוריית Cloud Storage לאחסון זמני של תלות בעומסי עבודה.

הרצת שאילתות על טבלאות Delta מ-BigQuery

אחרי שיוצרים טבלאות Delta מ-Spark בקטלוג הייעודי לזמן ריצה של Lakehouse, אפשר לשלוח אליהן שאילתות מ-BigQuery Studio.

שאילתות שמופעלות מ-BigQuery על טבלאות Delta בנקודת הקצה של קטלוג Hive הן לקריאה בלבד.

  1. במסוף Google Cloud , עוברים אל BigQuery.

    כניסה ל-BigQuery

  2. בעורך השאילתות, מזינים את ההצהרה הבאה:

    SELECT * FROM `PROJECT_ID.LAKEHOUSE_CATALOG_ID.DATABASE_NAME.TABLE_NAME`;
    

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

    • PROJECT_ID: מזהה הפרויקט.
    • ‫LAKEHOUSE_CATALOG_ID: השם של קטלוג Hive.
    • ‫DATABASE_NAME: שם מסד הנתונים.
    • ‫TABLE_NAME: שם טבלת ה-Delta.

מגבלות

כשמשתמשים בטבלאות Delta עם נקודת הקצה של קטלוג Hive בקטלוג הייעודי לזמן ריצה של Lakehouse, חלות המגבלות הבאות:

  • שאילתות לקריאה בלבד ב-BigQuery: שאילתות בטבלאות Delta מ-BigQuery הן לקריאה בלבד. ביצוע שינויים בנתונים, פעולות DML ושינויים בסכימה באמצעות Apache Spark.
  • הצגת סכימה של placeholder ב-GetHiveTable ובדיקה של סכימה אמיתית: קריאות לטבלאות Delta ב-GetHiveTable מחזירות סכימה של placeholder במקום הסכימה האמיתית של הטבלה. כדי לבדוק את הסכימה האמיתית של טבלת Delta, צריך להשתמש ב-Apache Spark. מערכת BigQuery מחשבת סכימה שונה שמותאמת להפעלת שאילתות Dremel, אבל היא לא זהה לסכימה של טבלת הדלתא האמיתית.
  • אי-תאימות של לקוחות Hive: לקוחות Hive (כמו Hive CLI) לא תומכים בטבלאות Delta עם קטלוג ייעודי לזמן ריצה של Lakehouse, נקודת הקצה של Hive. אתם יכולים להשתמש ב-Apache Spark כדי לנהל טבלאות Delta, וב-Spark או ב-BigQuery כדי לשלוח אליהן שאילתות.
  • אין תמיכה בפעולות שמנוהלות על ידי קטלוג: מצב ניהול על ידי קטלוג לא נתמך בטבלאות Delta. אי אפשר ליצור טבלת Delta באמצעות DDL של מטא-נתונים עצמאי. במקום זאת, צרו טבלאות Delta עם מיקומי אחסון חיצוניים ב-Cloud Storage (לדוגמה, באמצעות Apache Spark) ורשמו אותן בקטלוג.
  • המגבלות של טבלאות Delta חיצוניות ב-BigQuery: נקודת הקצה של Hive בקטלוג הייעודי לזמן ריצה של Lakehouse משתמשת באותו מנוע שאילתות כמו טבלאות Delta Lake חיצוניות ב-BigQuery. כל המגבלות של טבלאות Delta Lake חיצוניות והמגבלות של טבלאות BigLake חלות גם כאן. לדוגמה, אין תמיכה בפעולות של סימון נתונים שהשתנו (CDC) וב-BigQuery Storage Read API, ואין תמיכה ב-timestamp_ntz.

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