Komponen Iceberg opsional Managed Service untuk Apache Spark

Komponen opsional Iceberg memungkinkan Anda mengelola tabel data lakehouse dengan transaksi ACID dan evolusi skema di cluster Managed Service untuk Apache Spark. Anda dapat menginstal Iceberg selama pembuatan cluster menggunakan fitur Komponen opsional untuk mengkueri dan mengupdate tabel di seluruh workload Spark dan Hive.

Fitur utama Iceberg

Fitur Iceberg mencakup:

  • Evolusi skema: Menambahkan, menghapus, atau mengganti nama kolom tanpa menulis ulang seluruh tabel.
  • Lintas waktu: Buat kueri snapshot tabel historis untuk tujuan audit atau rollback.
  • Partisi tersembunyi: Mengoptimalkan tata letak data untuk kueri yang lebih cepat tanpa mengekspos detail partisi kepada pengguna.
  • Transaksi ACID: Memastikan konsistensi data dan mencegah konflik.

Saat Anda membuat cluster Managed Service untuk Apache Spark dengan Iceberg, properti Spark dan Hive berikut dikonfigurasi untuk berfungsi dengan Iceberg.

Versi image 2.x

Properti Spark dan Hive berikut dikonfigurasi di cluster Managed Service untuk Apache Spark `2.x` saat komponen Iceberg diinstal:

File konfigurasi Properti Nilai default
/etc/spark/conf/spark-defaults.conf spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.driver.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
spark.executor.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
/etc/hive/conf/hive-site.xml hive.aux.jars.path file:///usr/lib/iceberg/lib/iceberg-hive-runtime.jar
iceberg.engine.hive.enabled true

Versi image 3.0

Properti Spark dan Hive berikut dikonfigurasi di cluster Managed Service untuk Apache Spark `3.0` saat komponen Iceberg diinstal:

File konfigurasi Properti Nilai default
/etc/spark/conf/spark-defaults.conf spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.default_iceberg org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.default_iceberg.type rest
spark.sql.catalog.default_iceberg.uri env:ICEBERG_REST_CATALOG_URI
/etc/hive/conf/hive-site.xml iceberg.engine.hive.enabled true

Menginstal komponen opsional Iceberg

Anda dapat menginstal komponen Iceberg di cluster Managed Service untuk Apache Spark yang dibuat dengan versi image 2.2.47 dan yang lebih baru. Halaman daftar versi image cluster Managed Service untuk Apache Spark menampilkan versi komponen Iceberg yang disertakan dalam versi image cluster Managed Service untuk Apache Spark terbaru.

KonsolGoogle Cloud

Untuk membuat cluster Managed Service untuk Apache Spark yang menginstal komponen Iceberg, selesaikan langkah-langkah berikut di konsol Google Cloud :

  1. Buka halaman Create cluster.
  2. Klik Additional configuration untuk meluaskan bagian tersebut.
  3. Edit Optional components.
  4. Di panel yang terbuka, centang kotak untuk Iceberg.
  5. Klik Simpan.

gcloud CLI

Untuk membuat cluster Managed Service untuk Apache Spark yang menginstal komponen Iceberg, gunakan perintah gcloud dataproc clusters create dengan flag --optional-components.

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --optional-components=ICEBERG \
     other flags ...

Ganti kode berikut:

REST API

Untuk membuat cluster Managed Service untuk Apache Spark yang menginstal komponen opsional Iceberg, tentukan Iceberg SoftwareConfig.Component sebagai bagian dari permintaan clusters.create.

Menggunakan tabel Iceberg dengan Spark dan Hive

Setelah membuat cluster Managed Service untuk Apache Spark yang memiliki komponen opsional Iceberg yang diinstal di cluster, Anda dapat menggunakan Spark dan Hive untuk membaca dan menulis data tabel Iceberg.

Spark

Mengonfigurasi sesi Spark untuk Iceberg

Anda dapat menggunakan perintah gcloud CLI secara lokal, atau REPL (Read-Eval-Print Loop) spark-shell atau pyspark yang berjalan di node master cluster Dataproc untuk mengaktifkan ekstensi Spark Iceberg dan menyiapkan katalog Spark untuk menggunakan tabel Iceberg.

gcloud

Jalankan contoh gcloud CLI berikut di jendela terminal lokal atau di Cloud Shell untuk mengirimkan tugas Spark dan menetapkan properti Spark guna mengonfigurasi sesi Spark untuk Iceberg.

gcloud dataproc jobs submit spark  \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties="spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --properties="spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --properties="spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER" \
     other flags ...

Ganti kode berikut:

  • CLUSTER_NAME: Nama cluster.
  • REGION: Region Compute Engine.
  • CATALOG_NAME: Nama katalog Iceberg.
  • BUCKET dan FOLDER: Lokasi katalog Iceberg di Cloud Storage.

spark-shell

Untuk mengonfigurasi sesi Spark untuk Iceberg menggunakan REPL spark-shell di cluster Managed Service untuk Apache Spark, selesaikan langkah-langkah berikut:

  1. Gunakan SSH untuk terhubung ke node master cluster Managed Service untuk Apache Spark.

  2. Jalankan perintah berikut di terminal sesi SSH untuk mengonfigurasi sesi Spark untuk Iceberg.

spark-shell \
    --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=hadoop" \
    --conf "spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER"

Ganti kode berikut:

  • CLUSTER_NAME: Nama cluster.
  • REGION: Region Compute Engine.
  • CATALOG_NAME: Nama katalog Iceberg.
  • BUCKET dan FOLDER: Lokasi katalog Iceberg di Cloud Storage.

shell pyspark

Untuk mengonfigurasi sesi Spark untuk Iceberg menggunakan REPL pyspark di cluster Managed Service untuk Apache Spark, selesaikan langkah-langkah berikut:

  1. Gunakan SSH untuk terhubung ke node master cluster Managed Service untuk Apache Spark.

  2. Jalankan perintah berikut di terminal sesi SSH untuk mengonfigurasi sesi Spark untuk Iceberg:

pyspark \
    --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=hadoop" \
    --conf "spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER"

Ganti kode berikut:

  • CLUSTER_NAME: Nama cluster.
  • REGION: Region Compute Engine.
  • CATALOG_NAME: Nama katalog Iceberg.
  • BUCKET dan FOLDER: Lokasi katalog Iceberg di Cloud Storage.

Menulis data ke Tabel Iceberg

Anda dapat menulis data ke tabel Iceberg menggunakan Spark. Cuplikan kode berikut membuat DataFrame dengan data sampel, membuat tabel Iceberg di Cloud Storage, lalu menulis data ke tabel Iceberg.

PySpark

# Create a DataFrame with sample data.
data = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"])

# Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

# Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Scala

// Create a DataFrame with sample data.
val data = Seq((1, "Alice"), (2, "Bob")).toDF("id", "name")

// Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

// Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Membaca data dari Tabel Iceberg

Anda dapat membaca data dari tabel Iceberg menggunakan Spark. Cuplikan kode berikut membaca tabel, lalu menampilkan kontennya.

PySpark

# Read Iceberg table data into a DataFrame.
df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")
# Display the data.
df.show()

Scala

// Read Iceberg table data into a DataFrame.
val df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")

// Display the data.
df.show()

Spark SQL

SELECT * FROM CATALOG_NAME.NAMESPACE.TABLE_NAME

Hive

Membuat Tabel Iceberg di Hive

Cluster Managed Service untuk Apache Spark mengonfigurasi Hive terlebih dahulu agar dapat berfungsi dengan Iceberg.

Untuk menjalankan cuplikan kode di bagian ini, selesaikan langkah-langkah berikut;

  1. Gunakan SSH untuk terhubung ke node master cluster Managed Service untuk Apache Spark Anda.

  2. Tampilkan beeline di jendela terminal SSH.

    beeline -u jdbc:hive2://
    

Anda dapat membuat tabel Iceberg yang tidak dipartisi atau dipartisi di Hive.

Tabel tanpa partisi

Buat tabel Iceberg yang tidak dipartisi di Hive.

CREATE TABLE my_table (
  id INT,
  name STRING,
  created_at TIMESTAMP
) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

Tabel berpartisi

Buat tabel Iceberg berpartisi di Hive dengan menentukan kolom partisi dalam klausa PARTITIONED BY.

CREATE TABLE my_partitioned_table (
  id INT,
  name STRING
) PARTITIONED BY (date_sk INT)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

Menyisipkan data ke Tabel Iceberg di Hive

Anda dapat menyisipkan data ke dalam tabel Iceberg menggunakan pernyataan INSERT Hive standar.

SET hive.execution.engine=mr;

INSERT INTO my_table
SELECT 1, 'Alice', current_timestamp();

Batasan

  • Mesin eksekusi MR (MapReduce) hanya didukung untuk operasi DML (bahasa pengolahan data).
  • Eksekusi MR tidak digunakan lagi di Hive 3.1.3.

Membaca data dari Tabel Iceberg di Hive

Untuk membaca data dari tabel Iceberg, gunakan pernyataan SELECT.

SELECT * FROM my_table;

Menghapus tabel Iceberg di Hive.

Untuk menghapus tabel Iceberg di Hive, gunakan pernyataan DROP TABLE.

DROP TABLE my_table;

Langkah berikutnya