Menyiapkan Spark dan Hive dengan katalog runtime Lakehouse

Dokumen ini menjelaskan cara menyiapkan dan mengonfigurasi Apache Spark dan Apache Hive untuk menggunakan katalog runtime Lakehouse. Anda akan mempelajari cara membuat katalog Apache Hive, mengonfigurasi sesi Spark untuk terhubung ke metastore, dan menjalankan workload untuk membuat tabel yang dapat Anda kueri secara langsung di BigQuery.

Sebelum memulai

  1. Baca Tentang Katalog Hive di katalog runtime Lakehouse untuk memahami cara Spark terhubung ke katalog runtime Lakehouse.
  2. Tinjau Format penyimpanan dan jenis data yang didukung.
  3. Tinjau Batasan dan pertimbangan.
  4. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  5. Verify that billing is enabled for your Google Cloud project.

  6. Enable the Lakehouse for Apache Iceberg, Dataproc API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

  8. Enable the Lakehouse for Apache Iceberg, Dataproc API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan guna menggunakan katalog runtime Lakehouse, minta administrator untuk memberi Anda peran IAM berikut di project Anda:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Untuk mengetahui petunjuknya, lihat bagian Memberikan satu peran.

Alur kerja umum

Untuk menggunakan katalog runtime Lakehouse dengan Spark dan Hive, Anda mengikuti alur kerja umum berikut:

  1. Buat katalog Hive Lakehouse untuk Apache Iceberg.
  2. Konfigurasi sesi Spark Anda menggunakan alat pilihan Anda (seperti Managed Service untuk Apache Spark atau BigQuery Studio).
  3. Lakukan operasi database dan tabel dalam sesi Spark Anda.
  4. Kirimkan workload batch ke Managed Service untuk Apache Spark dan kueri tabel yang dihasilkan langsung dari BigQuery.

Membuat katalog Hive Lakehouse

Untuk menggunakan katalog runtime Lakehouse dengan Spark dan Hive, Anda harus membuat katalog Hive terlebih dahulu.

Katalog Hive Lakehouse adalah kumpulan database Hive. Sebelum menjalankan tugas Spark, buat katalog untuk mendaftarkannya ke Lakehouse Metastore. Katalog memiliki nama dan lokasi Cloud Storage tempat data Hive berada.

Konsol

  1. Di konsol Google Cloud , buka halaman Lakehouse.

    Buka Lakehouse

  2. Klik Buat katalog.

  3. Pilih Lakehouse runtime catalog.

  4. Untuk Catalog type, pilih Hive Metastore.

  5. Di kolom Select a Cloud Storage bucket, masukkan nama bucket Cloud Storage yang akan digunakan dengan katalog Anda. Atau, klik Browse untuk memilih bucket yang ada atau membuat bucket baru.

  6. Untuk ID Katalog, beri nama katalog Hive Lakehouse Anda.

  7. Untuk Lokasi utama, tentukan region yang sama dengan bucket Anda.

  8. Klik Create.

gcloud

Untuk membuat katalog Hive, jalankan perintah berikut:

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

Ganti kode berikut:

  • LAKEHOUSE_CATALOG_ID: nama katalog Hive.

  • GCS_WAREHOUSE_PATH: jalur Cloud Storage yang menyimpan gudang data Hive Anda.

  • PROJECT_ID: Google Cloud Project ID Anda.

  • REGION: region utama metastore. Untuk bucket satu region, kolom ini harus cocok dengan region bucket. Untuk bucket dual-region atau multi-region, harus berupa salah satu region penyusun dan tempat replika utama metastore ditujukan. Region lainnya menjadi replika sekunder.

  • DESCRIPTION: deskripsi katalog.

curl

  1. Untuk membuat katalog Hive, jalankan perintah berikut:
curl -X POST -s -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
-d '{"locationUri": "gs://GCS_WAREHOUSE_PATH", "description": "DESCRIPTION"}' \
-H "Content-Type:application/json" \ "https://biglake.googleapis.com/hive/v1/projects/PROJECT_ID/catalogs?hiveCatalogId=LAKEHOUSE_CATALOG_ID&primary_location=REGION"

Ganti kode berikut:

  • LAKEHOUSE_CATALOG_ID: nama katalog Hive.

  • GCS_WAREHOUSE_PATH: jalur Cloud Storage yang menyimpan gudang data Hive Anda.

  • PROJECT_ID: Google Cloud Project ID Anda.

  • REGION: region utama metastore. Untuk bucket satu region, kolom ini harus cocok dengan region bucket. Untuk bucket dual-region atau multi-region, bucket ini harus menjadi salah satu region penyusun dan tempat replika utama metastore ditujukan. Region lainnya menjadi replika sekunder.

  • DESCRIPTION: deskripsi katalog.

Mengonfigurasi dan menggunakan Spark dan Hive

Untuk menggunakan katalog runtime Lakehouse, Anda harus mengonfigurasi sesi Spark dengan properti tertentu. Anda dapat menetapkan properti ini saat membuat cluster Managed Service untuk Apache Spark atau menentukannya setiap kali Anda membuat sesi.

Properti ini mencakup detail seperti factory klien, Google Cloud ID project, katalog default, dan direktori gudang. Setelah sesi dibuat, Anda dapat melakukan operasi dasar seperti mencantumkan database yang ada, membuat database baru, menentukan tabel, dan menyisipkan data.

spark-sql

  1. Gunakan SSH untuk terhubung ke node utama cluster Managed Service untuk Apache Spark.
  2. Jalankan spark-sql di command line dengan properti berikut untuk memulai sesi Spark SQL interaktif:

    spark-sql \
        --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. Setelah sesi dimulai, Spark akan terhubung ke katalog runtime Lakehouse.

    Jalankan perintah berikut untuk membuat dan mengkueri resource:

    
    -- Show all the databases in the current project.
    SHOW DATABASES;
    
    -- Create a database.
    CREATE DATABASE spark_blms_database;
    
    -- Create a Parquet datasource table.
    CREATE TABLE spark_blms_database.parquet_quick_start (id INT, name STRING) USING PARQUET;
    
    -- Insert data into the table.
    INSERT INTO TABLE spark_blms_database.parquet_quick_start VALUES (1, 'my-first-user');
    

    Ganti kode berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.

    • LAKEHOUSE_CATALOG_ID: nama katalog Hive.

    • GCS_WAREHOUSE_PATH: jalur Cloud Storage yang menyimpan gudang Hive Anda.

Notebook Jupyter

  1. Selesaikan petunjuk untuk menjalankan notebook Jupyter di cluster Managed Service untuk Apache Spark.
  2. Akses antarmuka web Jupyter dari tab Web interfaces di halaman detail cluster di konsol Google Cloud .
  3. Di notebook baru, buat sesi Spark, lalu jalankan kueri berikut:

    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 tutorial")\
        .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_blms_db")
    
    # Create a Parquet datasource table.
    spark.sql("CREATE TABLE jupyter_blms_db.parquet_table(id INT, name STRING) USING PARQUET")
    
    # Insert data into the table.
    spark.sql("INSERT INTO TABLE jupyter_blms_db.parquet_table VALUES (1, 'my-first-user');")
    
    # Query from table.
    spark.sql("SELECT * FROM jupyter_blms_db.parquet_table;").show()
    

    Ganti kode berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.

    • GCS_WAREHOUSE_PATH: jalur Cloud Storage yang menyimpan gudang Hive Anda.

    • LAKEHOUSE_CATALOG_ID: nama katalog Hive.

Notebook BigQuery

  1. Di konsol Google Cloud , buka BigQuery.

    Buka BigQuery

  2. Di panel Explorer, klik + ADD, lalu klik Python notebook.

  3. Di sel kode, konfigurasikan sesi Managed Service untuk Apache Spark dan properti katalog runtime 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.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. Di sel kode lain, buat database dan tabel:

    # Create a database
    spark.sql("CREATE DATABASE bq_spark_blms_database;")
    
    # Create a parquet datasource table
    spark.sql("CREATE TABLE bq_spark_blms_database.parquet_quick_start (id INT, name STRING) USING PARQUET;")
    
    # Insert data into the table
    spark.sql("INSERT INTO TABLE bq_spark_blms_database.parquet_quick_start VALUES (1, 'my-first-user');")
    
    # Query from table
    spark.sql("select * from bq_spark_blms_database.parquet_quick_start;").show()
    

    Ganti kode berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.

    • GCS_WAREHOUSE_PATH: jalur Cloud Storage yang menyimpan gudang Hive Anda.

    • LAKEHOUSE_CATALOG_ID: nama katalog Hive.

Hive CLI

Untuk menggunakan Hive CLI, Anda harus mengonfigurasinya agar terhubung ke metastore. Anda dapat melakukannya dengan salah satu dari dua cara berikut:

  • Opsi 1: Konfigurasi permanen. Perbarui file /etc/hive/conf/hive-site.xml di node utama Anda.
  • Opsi 2: Konfigurasi sementara. Berikan tanda konfigurasi saat Anda memulai CLI.

Untuk mengonfigurasi CLI dan menjalankan sesi kueri, ikuti langkah-langkah berikut:

  1. Gunakan SSH untuk terhubung ke node utama cluster Managed Service untuk Apache Spark.
  2. Bergantung pada metode konfigurasi Anda, lakukan salah satu hal berikut:

    • Untuk mengonfigurasi secara permanen (Opsi 1):

      1. Buka /etc/hive/conf/hive-site.xml di node utama dan tambahkan properti berikut:

        <property>
            <name>hive.metastore.blms.project.id</name>
            <value>PROJECT_ID</value>
            <description></description>
        </property>
        
        <property>
            <name>hive.metastore.client.factory.class</name>
            <value>com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory</value>
            <description></description>
        </property>
        <property>
            <name>hive.metastore.blms.catalog.default</name>
            <value>LAKEHOUSE_CATALOG_ID</value>
            <description></description>
        </property>
        <property>
            <name>hive.metastore.warehouse.dir</name>
            <value>gs://GCS_WAREHOUSE_PATH</value>
            <description></description>
        </property>
        
      2. Mulai Hive CLI:

        hive
        
    • Untuk mengonfigurasi sementara saat startup (Opsi 2): Mulai Hive CLI dengan tanda konfigurasi:

      hive \
      --hiveconf hive.metastore.blms.project.id="PROJECT_ID" \
      --hiveconf hive.metastore.blms.catalog.default="LAKEHOUSE_CATALOG_ID" \
      --hiveconf hive.metastore.client.factory.class=com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory \
      --hiveconf hive.metastore.warehouse.dir="gs://GCS_WAREHOUSE_PATH"
      
  3. Kemudian, jalankan perintah berikut dalam sesi Hive CLI:

    show databases;
    create database hive_query_test;
    create table hive_query_test.parquet_table (id INT, name STRING) stored as PARQUET;
    select * from hive_query_test.parquet_table;
    

    Ganti kode berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.

    • LAKEHOUSE_CATALOG_ID: nama katalog Hive.

    • GCS_WAREHOUSE_PATH: jalur Cloud Storage yang menyimpan gudang Hive Anda.

Mengirimkan tugas batch Managed Service untuk Apache Spark

Anda dapat mengirimkan workload batch PySpark ke Managed Service untuk Apache Spark yang menggunakan katalog runtime Lakehouse.

Cuplikan PySpark ini menginisialisasi sesi Spark yang dikonfigurasi untuk terhubung dengan katalog runtime Lakehouse. Setelan ini menetapkan properti penting seperti factory klien Lakehouse, Google Cloud project ID, katalog default, dan direktori gudang data. Setelah membuat sesi, kode menunjukkan cara mencantumkan database yang ada, membuat database baru, dan menentukan tabel berformat Parquet dalam database tersebut menggunakan perintah Spark SQL.

  1. Buat file Python dengan tugas PySpark:

    from pyspark.sql import SparkSession
    
    spark = (
        SparkSession.builder.appName("Lakehouse runtime catalog tutorial")
        .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_test")
    
    # Create a Parquet datasource table.
    spark.sql(
            "CREATE TABLE dp_serverless_test.parquet_table(id INT, name STRING) USING"
            " PARQUET"
        )
    
    # Query from table.
    spark.sql("SELECT * from  dp_serverless_test.parquet_table").show()
    

    Ganti kode berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.

    • LAKEHOUSE_CATALOG_ID: nama katalog Hive.

    • GCS_WAREHOUSE_PATH: jalur Cloud Storage yang menyimpan gudang data Hive Anda.

  2. Kirimkan tugas batch:

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

    Ganti kode berikut:

    • PYTHON_SCRIPT_FILE: Jalur ke file aplikasi PySpark. Ini dapat berupa jalur lokal atau jalur objek Cloud Storage.
    • PROJECT_ID: Project ID Anda.
    • REGION: Region tempat menjalankan tugas batch.
    • CLOUD_STORAGE_BUCKET: Nama bucket Cloud Storage yang digunakan untuk menyiapkan dependensi beban kerja.

Menjalankan kueri pada tabel dari BigQuery

Setelah membuat resource dari Spark di katalog runtime Lakehouse, Anda dapat menjalankan kueri pada resource tersebut dari BigQuery Studio.

  1. Di konsol Google Cloud , buka BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

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

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda.
    • LAKEHOUSE_CATALOG_ID: nama katalog Hive Anda.
    • DATABASE_NAME: nama database Anda.
    • TABLE_NAME: nama tabel Anda.