All Products
Search
Document Center

E-MapReduce:Gunakan Iceberg

Last Updated:Jun 21, 2026

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

Catatan

Baik SparkSQL maupun notebook mendukung pembacaan dari dan penulisan ke tabel Iceberg. Topik ini menggunakan pekerjaan SparkSQL sebagai contoh.

Langkah 1: Buat resource session

  1. Buka halaman Sessions.

    1. Login ke Konsol EMR.

    2. Pada panel navigasi kiri, pilih EMR Serverless > Spark.

    3. Pada halaman Spark, klik nama ruang kerja yang dituju.

    4. Pada halaman EMR Serverless Spark, klik Sessions pada panel navigasi kiri.

  2. Pada halaman SQL Session, klik Connect to SQL Session.

  3. 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)

    Catatan

    Persyaratan 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.extensions

    Mengaktifkan ekstensi Spark Iceberg.

    Nilai tetap: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.iceberg_catalog

    Mendaftarkan katalog Spark bernama iceberg_catalog.

    Nilai tetap: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.iceberg_catalog.catalog-impl

    Menentukan implementasi katalog dasar sebagai katalog REST Iceberg.

    org.apache.iceberg.rest.RESTCatalog

    spark.sql.catalog.iceberg_catalog.uri

    Titik akhir API REST untuk layanan Iceberg DLF. Formatnya adalah http://<regionID>-vpc.dlf.aliyuncs.com.

    http://cn-hangzhou-vpc.dlf.aliyuncs.com

    spark.sql.catalog.iceberg_catalog.warehouse

    Nama katalog DLF yang terkait.

    Catatan

    Jangan mengaitkan katalog DLF yang dibuat dari data share.

    <catalog_name>

    spark.sql.catalog.iceberg_catalog.io-impl

    Menggunakan implementasi FileIO khusus DLF.

    Nilai tetap: org.apache.iceberg.rest.DlfFileIO

    spark.sql.catalog.iceberg_catalog.rest.auth.type

    Mengaktifkan mekanisme penandatanganan AWS Signature Version 4 (SigV4) untuk mengotentikasi permintaan REST.

    sigv4

    spark.sql.catalog.iceberg_catalog.rest.auth.sigv4.delegate-auth-type

    Menonaktifkan otentikasi delegasi. Klien harus menyediakan ID AccessKey dan AccessKey Secret untuk menandatangani permintaan.

    none

    spark.sql.catalog.iceberg_catalog.rest.signing-region

    Wilayah yang digunakan untuk penandatanganan. Nilai ini harus sesuai dengan wilayah tempat layanan DLF dideploy.

    cn-hangzhou

    spark.sql.catalog.iceberg_catalog.rest.signing-name

    Nama layanan yang digunakan untuk penandatanganan.

    Nilai tetap: DlfNext

    spark.sql.catalog.iceberg_catalog.rest.access-key-id

    ID AccessKey Akun Alibaba Cloud atau Pengguna RAM Anda.

    <access_key_id>

    spark.sql.catalog.iceberg_catalog.rest.secret-access-key

    AccessKey Secret Akun Alibaba Cloud atau Pengguna RAM Anda.

    <access_key_secret>

    DLF 1.0 (sebelumnya DLF-Legacy)

    Catatan

    Persyaratan 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.extensions

    Mengaktifkan ekstensi Spark Iceberg.

    Nilai tetap: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.<catalogName>

    Mendaftarkan katalog bernama <catalogName>.

    Nilai tetap: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.<catalogName>.catalog-impl

    Menentukan implementasi kompatibel Hive Alibaba Cloud DLF 1.0, yang terhubung ke layanan metadata DLF 1.0.

    Nilai tetap: org.apache.iceberg.aliyun.dlf.hive.DlfCatalog

    spark.sql.catalog.<catalogName>.dlf.catalog.id

    Menentukan 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.extensions

    Mengaktifkan ekstensi Spark Iceberg.

    Nilai tetap: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.<catalogName>

    Mendaftarkan katalog bernama <catalogName>.

    Nilai tetap: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.<catalogName>.catalog-impl

    Menentukan bahwa katalog menggunakan implementasi resmi Iceberg HiveCatalog untuk mengelola metadata di Hive Metastore.

    Nilai tetap: org.apache.iceberg.hive.HiveCatalog

    spark.sql.catalog.<catalogName>.uri

    URI 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.**.**:9083

    Sistem 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>/warehouse

    Tabel berikut menjelaskan parameter-parameter tersebut.

    Parameter

    Deskripsi

    Contoh nilai

    spark.sql.extensions

    Mengaktifkan ekstensi Spark Iceberg.

    Nilai tetap: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.<catalogName>

    Mendaftarkan katalog bernama <catalogName>.

    Nilai tetap: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.<catalogName>.type

    Menentukan tipe Katalog sebagai hadoop. Artinya, HadoopCatalog menyimpan metadata langsung di sistem file dan tidak memerlukan Hive Metastore.

    hadoop

    spark.sql.catalog.<catalogName>.warehouse

    Menentukan path untuk penyimpanan metadata. Pada path ini, <yourBucketName> merepresentasikan nama bucket OSS.

    oss://<yourBucketName>/warehouse

Langkah 2: Baca dan tulis tabel Iceberg

  1. Buka halaman Data Development.

    Pada halaman EMR Serverless Spark, klik Development pada panel navigasi kiri.

  2. Pada tab Development, klik ikon image.

  3. Pada kotak dialog Create, masukkan nama seperti users_task, atur Type ke SparkSQL default, lalu klik OK.

  4. Salin kode berikut ke tab SparkSQL baru (users_task).

    Catatan

    Jika Anda tidak menentukan database, tabel akan dibuat di database default katalog 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;
  5. 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