Mengelola metadata open source dengan BigLake Metastore

BigLake Metastore adalah layanan metadata fisik terpadu untuk produk analisis data di Google Cloud. BigLake Metastore menyediakan satu sumber kebenaran untuk metadata dan memungkinkan Anda mengelola serta mengakses data dari berbagai sumber. BigLake Metastore dapat diakses dari BigQuery dan berbagai mesin pemrosesan data terbuka di Dataproc, sehingga menjadikannya alat yang berguna bagi analis dan engineer data.

Untuk pengelolaan metadata bisnis, lihat Dataplex.

Cara kerja BigLake Metastore

BigLake Metastore adalah layanan tanpa server yang tidak mengharuskan Anda menyediakan resource sebelum menggunakannya. Anda dapat menggunakannya sebagai alternatif tanpa server untuk Hive Metastore di cluster Dataproc. BigLake Metastore berfungsi dengan cara yang sama seperti Hive Metastore melalui API-nya yang kompatibel dengan Hive, dan Anda dapat langsung mengkueri tabel format terbuka di BigQuery tanpa langkah lebih lanjut. BigLake Metastore hanya mendukung tabel Apache Iceberg.

BigLake Metastore menyediakan API, library klien, dan integrasi mesin data (seperti Apache Spark) untuk mengelola katalog, database, dan tabel.

Batasan

BigLake Metastore tunduk pada batasan berikut:

  • BigLake Metastore tidak mendukung tabel Apache Hive.
  • Peran dan izin Identity and Access Management (IAM) hanya dapat diberikan ke project. Memberikan izin IAM ke resource tidak didukung.
  • Cloud Monitoring tidak didukung.
  • Katalog dan database BigLake Metastore memiliki batasan penamaan berikut:
    • Panjang nama maksimal 1.024 karakter.
    • Nama hanya boleh berisi huruf UTF-8 (huruf besar, huruf kecil), angka, dan garis bawah.
    • Nama harus unik untuk setiap kombinasi project dan region.
  • Tabel BigLake Metastore mengikuti konvensi penamaan yang sama dengan tabel BigQuery. Untuk informasi selengkapnya, lihat Penamaan tabel.

Sebelum memulai

Anda harus mengaktifkan penagihan dan BigLake API sebelum menggunakan BigLake Metastore.

  1. Minta administrator untuk memberi Anda peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin) di project Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.
  2. Mengaktifkan penagihan untuk project Google Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.
  3. Mengaktifkan BigLake API.

    Mengaktifkan API

Peran yang diperlukan

  • Untuk memiliki kontrol penuh atas resource BigLake Metastore, Anda memerlukan peran Admin BigLake (roles/biglake.admin). Jika Anda menggunakan akun layanan konektor BigQuery Spark, akun layanan Dataproc Serverless, atau Akun layanan VM Dataproc, berikan peran BigLake Admin ke akun tersebut.
  • Untuk mendapatkan akses hanya baca ke resource BigLake Metastore, Anda memerlukan peran BigLake Viewer (roles/biglake.viewer). Misalnya, saat membuat kueri tabel BigLake Metastore di BigQuery, pengguna atau akun layanan koneksi BigQuery harus memiliki peran BigLake Viewer.
  • Untuk membuat tabel BigQuery dengan koneksi, Anda memerlukan peran BigQuery Connection User (roles/bigquery.connectionUser). Untuk mengetahui informasi selengkapnya tentang berbagi koneksi, lihat Berbagi koneksi dengan pengguna.

Bergantung pada kasus penggunaan, identitas yang memanggil BigLake Metastore dapat berupa pengguna atau akun layanan:

  • Pengguna: saat langsung memanggil BigLake Rest API, atau saat membuat kueri tabel BigQuery Iceberg tanpa koneksi dari BigQuery. Dalam situasi ini, BigQuery menggunakan kredensial pengguna.
  • BigQuery Cloud Resource Connection: saat membuat kueri tabel BigQuery Iceberg dengan koneksi dari BigQuery. BigQuery menggunakan kredensial akun layanan koneksi untuk mengakses BigLake Metastore.
  • BigQuery Spark Connector: saat menggunakan Spark dengan BigLake Metastore dalam prosedur yang disimpan Spark di BigQuery. Spark menggunakan kredensial akun layanan dari Spark Connector untuk mengakses BigLake Metastore dan membuat tabel BigQuery.
  • Akun layanan Dataproc Serverless: saat menggunakan Spark dengan BigLake di Dataproc Serverless. Spark menggunakan kredensial akun layanan.
  • Akun layanan VM Dataproc: saat menggunakan Dataproc (bukan Dataproc Serverless). Apache Spark menggunakan kredensial akun layanan VM.

Bergantung pada izin yang Anda miliki, Anda dapat memberikan peran ini pada diri sendiri atau meminta administrator untuk memberikannya. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Melihat peran yang dapat diberikan pada resource.

Untuk melihat izin persis yang diperlukan untuk mengakses resource BigLake Metastore, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

  • biglake.tables.get di level project, untuk semua akses hanya baca. Kueri terhadap tabel BigQuery Iceberg bersifat hanya baca.
  • biglake.{catalogs|databases|tables}.* di level project, untuk semua izin baca dan tulis. Biasanya, Apache Spark memerlukan kemampuan untuk membaca dan menulis data, termasuk kemampuan untuk membuat, mengelola, dan melihat katalog, database, serta tabel.
  • bigquery.connections.delegate di level BigQuery Cloud Resource Connection atau yang lebih tinggi, untuk membuat tabel BigQuery Iceberg menggunakan koneksi.

Terhubung ke BigLake Metastore

Bagian berikut menjelaskan cara menghubungkan ke BigLake Metastore. Bagian ini menginstal dan menggunakan plugin katalog BigLake Apache Iceberg, yang ditunjukkan oleh file JAR dalam metode berikut. Plugin katalog terhubung ke BigLake Metastore dari mesin open source seperti Apache Spark.

Menghubungkan dengan VM Dataproc

Untuk terhubung ke BigLake Metastore dengan VM Dataproc, lakukan hal berikut:

  1. Gunakan SSH untuk terhubung ke Dataproc.
  2. Di Spark SQL CLI, gunakan pernyataan berikut untuk menginstal dan mengonfigurasi katalog kustom Apache Iceberg agar berfungsi dengan BigLake Metastore:

    spark-sql \
      --packages ICEBERG_SPARK_PACKAGE \
      --jars BIGLAKE_ICEBERG_CATALOG_JAR \
      --conf spark.sql.catalog.SPARK_CATALOG=org.apache.iceberg.spark.SparkCatalog \
      --conf spark.sql.catalog.SPARK_CATALOG.catalog-impl=org.apache.iceberg.gcp.biglake.BigLakeCatalog \
      --conf spark.sql.catalog.SPARK_CATALOG.gcp_project=PROJECT_ID \
      --conf spark.sql.catalog.SPARK_CATALOG.gcp_location=LOCATION \
      --conf spark.sql.catalog.SPARK_CATALOG.blms_catalog=BLMS_CATALOG \
      --conf spark.sql.catalog.SPARK_CATALOG.warehouse=GCS_DATA_WAREHOUSE_FOLDER \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG=org.apache.iceberg.spark.SparkCatalog \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG.type=hive \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG.uri=thrift://HMS_URI:9083
      

Ganti kode berikut:

  • ICEBERG_SPARK_PACKAGE: versi Apache Iceberg dengan Spark yang akan digunakan. Sebaiknya gunakan versi Spark yang cocok dengan versi Spark di instance Dataproc atau tanpa server Dataproc Anda singkat ini. Untuk melihat daftar versi Apache Iceberg yang tersedia, lihat Download Apache Iceberg. Misalnya, tanda untuk Apache Spark 3.3 adalah:
    --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.2.1
  • BIGLAKE_ICEBERG_CATALOG_JAR: URI Cloud Storage dari plugin katalog kustom Iceberg yang akan diinstal. Bergantung pada lingkungan Anda, pilih salah satu opsi berikut:
    • Iceberg 1.2.0: gs://spark-lib/biglake/biglake-catalog-iceberg1.2.0-0.1.1-with-dependencies.jar
    • Iceberg 0.14.0: gs://spark-lib/biglake/biglake-catalog-iceberg0.14.0-0.1.1-with-dependencies.jar
  • SPARK_CATALOG: ID katalog untuk Spark. Link ini ditautkan ke katalog BigLake Metastore.
  • PROJECT_ID: project ID Google Cloud dari katalog BigLake Metastore yang ditautkan oleh katalog Spark. \
  • LOCATION: lokasi Google Cloud dari katalog BigLake Metastore yang ditautkan dengan katalog Spark.
  • BLMS_CATALOG: ID katalog BigLake Metastore yang ditautkan ke katalog Spark. Katalog tidak harus ada, dan dapat dibuat di Spark.
  • GCS_DATA_WAREHOUSE_FOLDER: folder Cloud Storage tempat Spark membuat semua file. Diawali dengan gs://.
  • HMS_DB: (opsional) database HMS yang berisi tabel yang akan disalin.
  • HMS_TABLE: (opsional) tabel HMS yang akan disalin.
  • HMS_URI: (opsional) endpoint HMS Thrift.

Menghubungkan dengan cluster Dataproc

Atau, Anda dapat mengirimkan tugas Dataproc ke cluster. Contoh berikut menginstal Iceberg Custom Catalog yang sesuai.

Untuk terhubung dengan cluster Dataproc, kirimkan tugas dengan spesifikasi berikut:

CONFS="spark.sql.catalog.SPARK_CATALOG=org.apache.iceberg.spark.SparkCatalog,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.catalog-impl=org.apache.iceberg.gcp.biglake.BigLakeCatalog,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.gcp_project=PROJECT_ID,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.gcp_location=LOCATION,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.blms_catalog=BLMS_CATALOG,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.warehouse=GCS_DATA_WAREHOUSE_FOLDER,"
CONFS+="spark.jars.packages=ICEBERG_SPARK_PACKAGE"

gcloud dataproc jobs submit spark-sql --cluster=DATAPROC_CLUSTER \
  --project=DATAPROC_PROJECT_ID \
  --region=DATAPROC_LOCATION \
  --jars=BIGLAKE_ICEBERG_CATALOG_JAR \
  --properties="${CONFS}" \
  --file=QUERY_FILE_PATH

Ganti kode berikut:

  • DATAPROC_CLUSTER: cluster Dataproc yang menjadi tujuan mengirimkan tugas.
  • DATAPROC_PROJECT_ID: project ID cluster Dataproc. ID ini bisa berbeda dengan PROJECT_ID.
  • DATAPROC_LOCATION: lokasi cluster Dataproc. Lokasi ini mungkin berbeda dengan LOCATION.
  • QUERY_FILE_PATH: jalur ke file yang berisi kueri yang akan dijalankan.

Menghubungkan dengan Dataproc Serverless

Demikian pula, Anda dapat mengirimkan beban kerja batch ke Dataproc Serverless. Untuk melakukannya, ikuti petunjuk workload batch dengan flag tambahan berikut:

  • --properties="${CONFS}"
  • --jars=BIGLAKE_ICEBERG_CATALOG_JAR

Menghubungkan dengan prosedur tersimpan BigQuery

Anda dapat menggunakan prosedur tersimpan di BigQuery untuk menjalankan tugas Dataproc Serverless. Proses ini mirip dengan menjalankan tugas Dataproc Serverless langsung di Dataproc.

Membuat resource metastore

Bagian berikut menjelaskan cara membuat resource di metastore.

Membuat katalog

Nama katalog memiliki batasan; untuk mengetahui informasi selengkapnya, lihat Batasan. Untuk membuat katalog, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.create dan tentukan nama katalog.

Spark SQL

CREATE NAMESPACE SPARK_CATALOG;

Terraform

Tindakan ini akan membuat database BigLake bernama 'my_database' dengan jenis 'HIVE' dalam katalog yang ditentukan oleh variabel 'google_biglake_catalog.default.id'. Untuk informasi selengkapnya, lihat dokumentasi BigLake Terraform.

resource "google_biglake_catalog" "default" {
name     = "my_catalog"
location = "US"
}

Membuat database

Nama database memiliki batasan; untuk mengetahui informasi selengkapnya, lihat Batasan. Untuk memastikan resource database Anda kompatibel dengan mesin data, sebaiknya buat database menggunakan mesin data, bukan membuat isi resource secara manual. Untuk membuat database, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.databases.create dan tentukan nama database.

Spark SQL

CREATE NAMESPACE SPARK_CATALOG.BLMS_DB;

Ganti kode berikut:

  • BLMS_DB: ID database BigLake Metastore yang akan dibuat

Terraform

Tindakan ini akan membuat database BigLake bernama 'my_database' dengan jenis 'HIVE' dalam katalog yang ditentukan oleh variabel 'google_biglake_catalog.default.id'. Untuk informasi selengkapnya, lihat dokumentasi BigLake Terraform.

resource "google_biglake_database" "default" {
name    = "my_database"
catalog = google_biglake_catalog.default.id
type    = "HIVE"
hive_options {
  location_uri = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.metadata_directory.name}"
  parameters = {
    "owner" = "Alex"
  }
}
}

Membuat tabel

Nama tabel memiliki batasan. Untuk informasi selengkapnya, lihat Penamaan tabel. Untuk membuat tabel, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.databases.tables.create dan tentukan nama tabel.

Spark SQL

CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
  (id bigint, data string) USING iceberg;

Ganti kode berikut:

  • BLMS_TABLE: ID tabel BigLake Metastore untuk membuat

Terraform

Tindakan ini akan membuat tabel BigLake Metastore dengan nama "my_table" dan jenis "HIVE" di database yang ditentukan oleh variabel "google_biglake_database.default.id". Lihat Dokumentasi Penyedia Terraform untuk mengetahui informasi selengkapnya: Tabel BigLake.

resource "google_biglake_table" "default" {
name     = "my-table"
database = google_biglake_database.default.id
type     = "HIVE"
hive_options {
  table_type = "MANAGED_TABLE"
  storage_descriptor {
    location_uri  = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.data_directory.name}"
    input_format  = "org.apache.hadoop.mapred.SequenceFileInputFormat"
    output_format = "org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat"
  }
  parameters = {
    "spark.sql.create.version"          = "3.1.3"
    "spark.sql.sources.schema.numParts" = "1"
    "transient_lastDdlTime"             = "1680894197"
    "spark.sql.partitionProvider"       = "catalog"
    "owner"                             = "Alex"
    "spark.sql.sources.schema.part.0" = jsonencode({
      "type" : "struct",
      "fields" : [
        { "name" : "id", "type" : "integer",
          "nullable" : true,
          "metadata" : {}
        },
        {
          "name" : "name",
          "type" : "string",
          "nullable" : true,
          "metadata" : {}
        },
        {
          "name" : "age",
          "type" : "integer",
          "nullable" : true,
          "metadata" : {}
        }
      ]
    })
    "spark.sql.sources.provider" = "iceberg"
    "provider"                   = "iceberg"
  }
}
}

Contoh Terraform E2E

Contoh GitHub ini menyediakan contoh E2E yang dapat dijalankan yang membuat Katalog, Database, dan Tabel Metastore "BigLake". Untuk informasi selengkapnya tentang cara menggunakan contoh ini, lihat Perintah Dasar Terraform.

Menyalin tabel Iceberg dari Hive Metastore ke BigLake Metastore

Untuk membuat tabel Iceberg dan menyalin tabel Hive Metastore ke BigLake Metastore, gunakan pernyataan Spark SQL berikut:

CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
  (id bigint, data string) USING iceberg
  TBLPROPERTIES(hms_table='HMS_DB.HMS_TABLE');

BigLake Metastore adalah metastore yang direkomendasikan untuk membuat kueri tabel eksternal BigLake untuk Iceberg. Saat membuat tabel Iceberg di Spark, Anda dapat secara opsional membuat tabel BigLake Iceberg yang ditautkan secara bersamaan.

Untuk membuat tabel Iceberg di Spark dan secara otomatis membuat tabel BigLake Iceberg secara bersamaan, gunakan pernyataan Spark SQL berikut:

  CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
    (id bigint, data string) USING iceberg
    TBLPROPERTIES(bq_table='BQ_TABLE_PATH',
    bq_connection='BQ_RESOURCE_CONNECTION');

Ganti kode berikut:

  • BQ_TABLE_PATH: jalur tabel Iceberg BigLake yang akan dibuat. Ikuti sintaksis jalur tabel BigQuery. Project ini akan menggunakan project yang sama dengan katalog BigLake Metastore jika project tersebut tidak ditentukan.
  • BQ_RESOURCE_CONNECTION (opsional): formatnya adalah project.location.connection-id. Jika ditentukan, kueri BigQuery akan menggunakan kredensial koneksi Cloud Resource untuk mengakses BigLake Metastore. Jika tidak ditentukan, BigQuery akan membuat tabel eksternal reguler, bukan tabel BigLake.

Untuk membuat link tabel BigLake Iceberg secara manual dengan URI tabel BigLake Metastore yang ditentukan (blms://…), gunakan pernyataan BigQuery SQL berikut:

CREATE EXTERNAL TABLE 'BQ_TABLE_PATH'
  WITH CONNECTION `BQ_RESOURCE_CONNECTION`
  OPTIONS (
          format = 'ICEBERG',
          uris = ['blms://projects/PROJECT_ID/locations/LOCATION/catalogs/BLMS_CATALOG/databases/BLMS_DB/tables/BLMS_TABLE']
          )

Melihat resource metastore

Bagian berikut menjelaskan cara melihat resource di BigLake Metastore.

Melihat katalog

Untuk melihat semua database dalam katalog, gunakan metode projects.locations.catalogs.list dan tentukan nama katalog.

Untuk melihat informasi tentang katalog, gunakan metode projects.locations.catalogs.get dan tentukan nama katalog.

Melihat database

Untuk melihat database, lakukan langkah berikut:

API

Untuk melihat semua tabel dalam database, gunakan metode projects.locations.catalogs.databases.list dan tentukan nama database.

Untuk melihat informasi tentang database, gunakan metode projects.locations.catalogs.databases.get dan tentukan nama database.

Spark SQL

Untuk melihat semua database dalam katalog, gunakan pernyataan berikut:

SHOW { DATABASES | NAMESPACES } IN SPARK_CATALOG;

Untuk melihat informasi tentang database yang ditentukan, gunakan pernyataan berikut:

DESCRIBE { DATABASE | NAMESPACE } [EXTENDED] SPARK_CATALOG.BLMS_DB;

Melihat tabel

Untuk menampilkan semua tabel dalam database atau tabel yang ditentukan, lakukan hal berikut:

API

Untuk melihat semua tabel dalam database, gunakan metode projects.locations.catalogs.databases.tables.list dan tentukan nama database.

Untuk melihat informasi tentang tabel, gunakan metode projects.locations.catalogs.databases.tables.get dan tentukan nama tabel.

Spark SQL

Untuk melihat semua tabel dalam database, gunakan pernyataan berikut:

SHOW TABLES IN SPARK_CATALOG.BLMS_DB;

Untuk melihat informasi tentang tabel yang ditentukan, gunakan pernyataan berikut:

DESCRIBE TABLE [EXTENDED] SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Mengubah resource metastore

Bagian berikut menjelaskan cara memodifikasi resource di metastore.

Memperbarui tabel

Untuk menghindari konflik saat beberapa tugas mencoba memperbarui tabel yang sama secara bersamaan, BigLake Metastore menggunakan penguncian optimis. Untuk menggunakan penguncian optimis, Anda harus mendapatkan versi tabel saat ini (yang disebut etag) terlebih dahulu dengan menggunakan metode GetTable. Kemudian, Anda dapat membuat perubahan pada tabel dan menggunakan metode UpdateTable, dengan meneruskan etag yang diambil sebelumnya. Jika tugas lain memperbarui tabel setelah Anda mengambil etag, metode UpdateTable akan gagal. Tindakan ini memastikan bahwa hanya satu tugas yang dapat memperbarui tabel dalam satu waktu, sehingga mencegah konflik.

Untuk memperbarui tabel, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.databases.tables.patch dan tentukan nama tabel.

Spark SQL

Untuk opsi pembaruan tabel di SQL, lihat ALTER TABLE.

Mengganti nama tabel

Untuk mengganti nama tabel, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.databases.tables.rename dan tentukan nama tabel serta nilai newName.

Spark SQL

ALTER TABLE BLMS_TABLE RENAME TO NEW_BLMS_TABLE;

Ganti kode berikut:

  • NEW_BLMS_TABLE: nama baru untuk BLMS_TABLE. Harus berada dalam set data yang sama dengan BLMS_TABLE.

Menghapus resource metastore

Bagian berikut menjelaskan cara menghapus resource di BigLake Metastore.

Menghapus katalog

Untuk menghapus katalog, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.delete dan tentukan nama katalog. Metode ini tidak menghapus file terkait di Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG;

Menghapus database

Untuk menghapus database, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.databases.delete dan tentukan nama database. Metode ini tidak menghapus file terkait di Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG.BLMS_DB;

Menghapus tabel

Untuk menghapus tabel, pilih salah satu opsi berikut:

API

Gunakan metode projects.locations.catalogs.databases.tables.delete dan tentukan nama tabel. Metode ini tidak menghapus file terkait di Google Cloud.

Spark SQL

Untuk hanya membuang tabel, gunakan pernyataan berikut:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Untuk membuang tabel dan menghapus file terkait di Google Cloud, gunakan pernyataan berikut:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE PURGE;