Iceberg adalah format tabel terbuka untuk data lake. Anda dapat menggunakan Iceberg untuk dengan cepat membangun layanan penyimpanan data lake di Hadoop Distributed File System (HDFS) atau Alibaba Cloud Object Storage Service (OSS). Topik ini menjelaskan cara membaca dari dan menulis ke tabel Iceberg di EMR Serverless Spark.
Prasyarat
Ruang kerja telah dibuat. Buat ruang kerja.
Prosedur
Baik SparkSQL maupun notebook mendukung pembacaan dari dan penulisan ke tabel Iceberg. Topik ini menggunakan pekerjaan SparkSQL sebagai contoh.
Langkah 1: Buat resource session
-
Buka halaman Sessions.
-
Login ke Konsol EMR.
-
Pada panel navigasi kiri, pilih EMR Serverless > Spark.
-
Pada halaman Spark, klik nama ruang kerja yang dituju.
-
Pada halaman EMR Serverless Spark, klik Sessions pada panel navigasi kiri.
-
-
Pada halaman SQL Session, klik Connect to SQL Session.
-
Pada halaman Connect to SQL Session, konfigurasikan parameter berikut pada bagian Spark Configuration, lalu klik Create. Untuk informasi lebih lanjut, lihat Kelola sesi SQL.
Spark membaca dari dan menulis ke tabel Iceberg menggunakan katalog. Anda dapat memilih katalog berdasarkan kasus penggunaan Anda. Untuk informasi lebih lanjut mengenai katalog, lihat Kelola katalog data.
Katalog data
Jika Anda menggunakan katalog data, Anda tidak perlu mengonfigurasi parameter dalam session. Pada halaman Catalog, klik Add Catalog. Anda kemudian dapat langsung memilih katalog data di lingkungan pengembangan SparkSQL Anda.
Catatan-
Untuk mengakses Iceberg di DLF (sebelumnya DLF 2.5), gunakan versi engine esr-4.7.0, esr-3.6.0, atau yang lebih baru.
-
Untuk mengakses Iceberg di DLF 1.0 (sebelumnya DLF-Legacy) atau Hive Metastore, gunakan versi engine esr-4.3.0, esr-3.3.0, esr-2.7.0, atau yang lebih baru.
Katalog kustom
DLF (sebelumnya DLF 2.5)
CatatanPersyaratan versi engine: esr-4.7.0, esr-3.6.0, atau yang lebih baru.
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.iceberg_catalog org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.iceberg_catalog.catalog-impl org.apache.iceberg.rest.RESTCatalog spark.sql.catalog.iceberg_catalog.uri http://<regionID>-vpc.dlf.aliyuncs.com spark.sql.catalog.iceberg_catalog.warehouse <catalog_name> spark.sql.catalog.iceberg_catalog.io-impl org.apache.iceberg.rest.DlfFileIO spark.sql.catalog.iceberg_catalog.rest.auth.type sigv4 spark.sql.catalog.iceberg_catalog.rest.auth.sigv4.delegate-auth-type none spark.sql.catalog.iceberg_catalog.rest.signing-region <regionID> spark.sql.catalog.iceberg_catalog.rest.signing-name DlfNext spark.sql.catalog.iceberg_catalog.rest.access-key-id <access_key_id> spark.sql.catalog.iceberg_catalog.rest.secret-access-key <access_key_secret>Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter
Deskripsi
Contoh nilai
spark.sql.extensionsMengaktifkan ekstensi Spark Iceberg.
Nilai tetap:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.iceberg_catalogMendaftarkan katalog Spark bernama
iceberg_catalog.Nilai tetap:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.iceberg_catalog.catalog-implMenentukan implementasi katalog dasar sebagai katalog REST Iceberg.
org.apache.iceberg.rest.RESTCatalogspark.sql.catalog.iceberg_catalog.uriTitik akhir API REST untuk layanan Iceberg DLF. Formatnya adalah
http://<regionID>-vpc.dlf.aliyuncs.com.http://cn-hangzhou-vpc.dlf.aliyuncs.comspark.sql.catalog.iceberg_catalog.warehouseNama katalog DLF yang terkait.
CatatanJangan mengaitkan katalog DLF yang dibuat dari data share.
<catalog_name>spark.sql.catalog.iceberg_catalog.io-implMenggunakan implementasi FileIO khusus DLF.
Nilai tetap:
org.apache.iceberg.rest.DlfFileIOspark.sql.catalog.iceberg_catalog.rest.auth.typeMengaktifkan mekanisme penandatanganan AWS Signature Version 4 (SigV4) untuk mengotentikasi permintaan REST.
sigv4spark.sql.catalog.iceberg_catalog.rest.auth.sigv4.delegate-auth-typeMenonaktifkan otentikasi delegasi. Klien harus menyediakan ID AccessKey dan AccessKey Secret untuk menandatangani permintaan.
nonespark.sql.catalog.iceberg_catalog.rest.signing-regionWilayah yang digunakan untuk penandatanganan. Nilai ini harus sesuai dengan wilayah tempat layanan DLF dideploy.
cn-hangzhouspark.sql.catalog.iceberg_catalog.rest.signing-nameNama layanan yang digunakan untuk penandatanganan.
Nilai tetap:
DlfNextspark.sql.catalog.iceberg_catalog.rest.access-key-idID AccessKey Akun Alibaba Cloud atau Pengguna RAM Anda.
<access_key_id>spark.sql.catalog.iceberg_catalog.rest.secret-access-keyAccessKey Secret Akun Alibaba Cloud atau Pengguna RAM Anda.
<access_key_secret>DLF 1.0 (sebelumnya DLF-Legacy)
CatatanPersyaratan versi engine: esr-4.3.0, esr-3.3.0, esr-2.7.0, atau yang lebih baru.
Metadata disimpan di DLF 1.0 (sebelumnya DLF-Legacy).
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.<catalogName> org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.<catalogName>.catalog-impl org.apache.iceberg.aliyun.dlf.hive.DlfCatalog spark.sql.catalog.<catalogName>.dlf.catalog.id <catalog_name>Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter
Deskripsi
Contoh nilai
spark.sql.extensionsMengaktifkan ekstensi Spark Iceberg.
Nilai tetap:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.<catalogName>Mendaftarkan katalog bernama
<catalogName>.Nilai tetap:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.<catalogName>.catalog-implMenentukan implementasi kompatibel Hive Alibaba Cloud DLF 1.0, yang terhubung ke layanan metadata DLF 1.0.
Nilai tetap:
org.apache.iceberg.aliyun.dlf.hive.DlfCatalogspark.sql.catalog.<catalogName>.dlf.catalog.idMenentukan nama katalog DLF yang terkait.
<catalog_name>Hive Metastore
Metadata disimpan di Hive Metastore tertentu.
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.<catalogName> org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.<catalogName>.catalog-impl org.apache.iceberg.hive.HiveCatalog spark.sql.catalog.<catalogName>.uri thrift://<yourHMSUri>:<port>Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter
Deskripsi
Contoh nilai
spark.sql.extensionsMengaktifkan ekstensi Spark Iceberg.
Nilai tetap:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.<catalogName>Mendaftarkan katalog bernama
<catalogName>.Nilai tetap:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.<catalogName>.catalog-implMenentukan bahwa katalog menggunakan implementasi resmi Iceberg
HiveCataloguntuk mengelola metadata di Hive Metastore.Nilai tetap:
org.apache.iceberg.hive.HiveCatalogspark.sql.catalog.<catalogName>.uriURI Hive Metastore. Formatnya adalah
thrift://<alamat IP Hive metastore>:9083.<alamat IP Hive metastore>adalah alamat IP internal layanan HMS. Jika Anda perlu menentukan layanan metastore eksternal, lihat Hubungkan ke Layanan Hive Metastore Eksternal.thrift://192.168.**.**:9083Sistem file
Metadata disimpan di sistem file.
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.<catalogName> org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.<catalogName>.type hadoop spark.sql.catalog.<catalogName>.warehouse oss://<yourBucketName>/warehouseTabel berikut menjelaskan parameter-parameter tersebut.
Parameter
Deskripsi
Contoh nilai
spark.sql.extensionsMengaktifkan ekstensi Spark Iceberg.
Nilai tetap:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.<catalogName>Mendaftarkan katalog bernama
<catalogName>.Nilai tetap:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.<catalogName>.typeMenentukan tipe Katalog sebagai
hadoop. Artinya, HadoopCatalog menyimpan metadata langsung di sistem file dan tidak memerlukan Hive Metastore.hadoopspark.sql.catalog.<catalogName>.warehouseMenentukan path untuk penyimpanan metadata. Pada path ini,
<yourBucketName>merepresentasikan nama bucket OSS.oss://<yourBucketName>/warehouse -
Langkah 2: Baca dan tulis tabel Iceberg
-
Buka halaman Data Development.
Pada halaman EMR Serverless Spark, klik Development pada panel navigasi kiri.
-
Pada tab Development, klik ikon
. -
Pada kotak dialog Create, masukkan nama seperti users_task, atur Type ke SparkSQL default, lalu klik OK.
-
Salin kode berikut ke tab SparkSQL baru (users_task).
CatatanJika Anda tidak menentukan database, tabel akan dibuat di database
defaultkatalog tersebut. Anda juga dapat membuat dan menentukan database lain.-- Buat database. CREATE DATABASE IF NOT EXISTS iceberg_catalog.db; -- Buat tabel non-partisi. CREATE TABLE iceberg_catalog.db.tbl ( id BIGINT NOT NULL COMMENT 'id unik', data STRING ) USING iceberg; -- Masukkan data ke tabel non-partisi. INSERT INTO iceberg_catalog.db.tbl VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie'); -- Kueri semua data dari tabel non-partisi. SELECT * FROM iceberg_catalog.db.tbl; -- Kueri tabel non-partisi dengan kondisi. SELECT * FROM iceberg_catalog.db.tbl WHERE id = 2; -- Perbarui data di tabel non-partisi. UPDATE iceberg_catalog.db.tbl SET data = 'David' WHERE id = 3; -- Kueri lagi untuk mengonfirmasi pembaruan. SELECT * FROM iceberg_catalog.db.tbl WHERE id = 3; -- Hapus data dari tabel non-partisi. DELETE FROM iceberg_catalog.db.tbl WHERE id = 1; -- Kueri lagi untuk mengonfirmasi penghapusan. SELECT * FROM iceberg_catalog.db.tbl; -- Buat tabel partisi. CREATE TABLE iceberg_catalog.db.part_tbl ( id BIGINT, data STRING, category STRING, ts TIMESTAMP, dt DATE ) USING iceberg PARTITIONED BY (dt, category); -- Masukkan data ke tabel partisi. INSERT INTO iceberg_catalog.db.part_tbl VALUES (1 , 'data-01', 'A', timestamp'2026-01-01 10:00:00', date'2026-01-01'), (2 , 'data-02', 'A', timestamp'2026-01-01 11:00:00', date'2026-01-01'), (3 , 'data-03', 'A', timestamp'2026-01-02 09:30:00', date'2026-01-02'), (4 , 'data-04', 'B', timestamp'2026-01-02 12:15:00', date'2026-01-02'), (5 , 'data-05', 'B', timestamp'2026-01-03 08:05:00', date'2026-01-03'), (6 , 'data-06', 'B', timestamp'2026-01-03 14:20:00', date'2026-01-03'), (7 , 'data-07', 'C', timestamp'2026-01-04 16:45:00', date'2026-01-04'), (8 , 'data-08', 'C', timestamp'2026-01-04 18:10:00', date'2026-01-04'), (9 , 'data-09', 'C', timestamp'2026-01-05 07:55:00', date'2026-01-05'), (10, 'data-10', 'A', timestamp'2026-01-05 13:35:00', date'2026-01-05'); -- Kueri semua data dari tabel partisi. SELECT * FROM iceberg_catalog.db.part_tbl; -- Kueri data dari partisi dengan dt='2026-01-01'. SELECT * FROM iceberg_catalog.db.part_tbl WHERE dt='2026-01-01'; -- Kueri data untuk kategori tertentu. SELECT * FROM iceberg_catalog.db.part_tbl WHERE category = 'A'; -- Lakukan kueri dengan beberapa kondisi (hari + kategori). SELECT * FROM iceberg_catalog.db.part_tbl WHERE dt='2026-01-01' AND category = 'A'; -- Agregasi dan hitung jumlah catatan di setiap kategori. SELECT category, COUNT(*) AS count FROM iceberg_catalog.db.part_tbl GROUP BY category; -- Hapus database (gunakan dengan hati-hati). Sebelum menghapus database, pastikan tidak ada tabel di dalamnya. -- DROP DATABASE iceberg_catalog.db; -
Pada daftar drop-down session, pilih instans sesi SQL yang telah Anda buat, lalu klik Run. Setelah pekerjaan selesai, hasilnya akan ditampilkan di bawah. Setelah menjalankan kueri agregasi, output-nya adalah sebagai berikut: kategori B (3), kategori C (3), dan kategori A (4).
Referensi
-
Untuk informasi lebih lanjut tentang penggunaan dan konfigurasi Iceberg, lihat Apache Iceberg.
-
Untuk detail tentang pembuatan resource sesi SQL, lihat Kelola sesi SQL.
-
Untuk detail tentang pembuatan resource sesi notebook, lihat Kelola sesi notebook.