

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Gunakan cluster dengan Iceberg
<a name="emr-iceberg-use-cluster"></a>

Bagian ini mencakup informasi untuk menggunakan Iceberg dengan Spark, Trino, Flink, dan Hive.

# Gunakan cluster Iceberg dengan Spark
<a name="emr-iceberg-use-spark-cluster"></a>

Dimulai dengan Amazon EMR versi 6.5.0, Anda dapat menggunakan Iceberg dengan cluster Spark Anda tanpa persyaratan untuk menyertakan tindakan bootstrap. Untuk Amazon EMR versi 6.4.0 dan yang lebih lama, Anda dapat menggunakan tindakan bootstrap untuk pra-instal semua dependensi yang diperlukan.

Dalam tutorial ini, Anda menggunakan AWS CLI untuk bekerja dengan Iceberg pada cluster Amazon EMR Spark. Untuk menggunakan konsol untuk membuat cluster dengan Iceberg diinstal, ikuti langkah-langkah dalam [Membangun danau data Apache Iceberg menggunakan Amazon Athena, Amazon EMR,](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) dan Glue. AWS 

## Buat cluster Iceberg
<a name="emr-iceberg-create-cluster"></a>

Anda dapat membuat cluster dengan Iceberg diinstal menggunakan Konsol Manajemen AWS, AWS CLI atau Amazon EMR API. Dalam tutorial ini, Anda menggunakan AWS CLI untuk bekerja dengan Iceberg di cluster EMR Amazon. Untuk menggunakan konsol untuk membuat cluster dengan Iceberg diinstal, ikuti langkah-langkah dalam [Membangun danau data Apache Iceberg menggunakan Amazon Athena, Amazon EMR,](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) dan Glue. AWS 

Untuk menggunakan Iceberg di Amazon EMR dengan AWS CLI, pertama buat cluster dengan langkah-langkah berikut. Untuk informasi tentang menentukan klasifikasi Gunung Es menggunakan AWS CLI, lihat atau. [Menyediakan konfigurasi menggunakan AWS CLI saat Anda membuat klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Sediakan konfigurasi menggunakan Java SDK ketika Anda membuat sebuah klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk)

1. Buat `configurations.json` file dengan konten berikut:

   ```
   [{
       "Classification":"iceberg-defaults",
       "Properties":{"iceberg.enabled":"true"}
   }]
   ```

1. Selanjutnya, buat cluster dengan konfigurasi berikut. Ganti contoh jalur bucket Amazon S3 dan ID subnet dengan milik Anda sendiri.

   ```
   aws emr create-cluster --release-label emr-6.5.0 \
   --applications Name=Spark \
   --configurations file://configurations.json \
   --region us-east-1 \
   --name My_Spark_Iceberg_Cluster \
   --log-uri s3://amzn-s3-demo-bucket/ \
   --instance-type m5.xlarge \
   --instance-count 2 \
   --service-role EMR_DefaultRole_V2 \ 
   --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef0
   ```

Atau, Anda dapat membuat cluster EMR Amazon termasuk aplikasi Spark dan menyertakan file `/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` sebagai dependensi JAR dalam pekerjaan Spark. Untuk informasi selengkapnya, lihat [Mengirimkan Aplikasi.](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications)

Untuk menyertakan jar sebagai dependensi dalam pekerjaan Spark, tambahkan properti konfigurasi berikut ke aplikasi Spark:

```
--conf "spark.jars=/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar"
```

[Untuk informasi selengkapnya tentang dependensi pekerjaan Spark, lihat [Manajemen](https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management) Ketergantungan dalam dokumen Apache Spark Running Spark di Kubernetes.](https://spark.apache.org/docs/latest/running-on-kubernetes.html)

## Inisialisasi sesi Spark untuk Iceberg
<a name="emr-iceberg-initialize-spark-session"></a>

Contoh berikut menunjukkan cara meluncurkan shell Spark interaktif, menggunakan Spark submit, atau menggunakan Amazon EMR Notebooks untuk bekerja dengan Iceberg di Amazon EMR.

------
#### [ spark-shell ]

1. Connect ke simpul utama menggunakan SSH. Untuk informasi selengkapnya, lihat [Connect ke simpul utama menggunakan SSH](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) di *Panduan Pengelolaan Amazon EMR*.

1. Masukkan perintah berikut untuk meluncurkan shell Spark. Untuk menggunakan PySpark shell, ganti `spark-shell` dengan`pyspark`.

   ```
   spark-shell \
       --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket/prefix/
       --conf spark.sql.catalog.my_catalog.type=glue \
       --conf spark.sql.defaultCatalog=my_catalog \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ spark-submit ]

1. Connect ke simpul utama menggunakan SSH. Untuk informasi selengkapnya, lihat [Connect ke simpul utama menggunakan SSH](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) di *Panduan Pengelolaan Amazon EMR*.

1. Masukkan perintah berikut untuk meluncurkan sesi Spark untuk Iceberg.

   ```
   spark-submit \
   --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
   --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
   --conf spark.sql.catalog.my_catalog.type=glue \
   --conf spark.sql.defaultCatalog=my_catalog \
   --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ EMR Studio notebooks ]

Untuk menginisialisasi sesi Spark menggunakan notebook EMR Studio, konfigurasikan sesi Spark Anda menggunakan perintah ajaib `%%configure` di notebook Amazon EMR Anda, seperti pada contoh berikut. Untuk informasi selengkapnya, lihat [Menggunakan sihir EMR Notebooks](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics) di Panduan Manajemen *Amazon* EMR.

```
%%configure -f{
"conf":{
    "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
    "spark.sql.catalog.my_catalog.type":"glue",
    "spark.sql.catalog.my_catalog.warehouse":"s3://amzn-s3-demo-bucket1/prefix/",
    "spark.sql.defaultCatalog":"my_catalog",
    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
}
```

------
#### [ CLI ]

Untuk menginisialisasi cluster Spark menggunakan CLI dan mengatur semua konfigurasi default sesi Spark Iceberg, jalankan sampel berikut. Untuk informasi selengkapnya tentang menentukan klasifikasi konfigurasi menggunakan API EMR Amazon AWS CLI dan Amazon, [lihat](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html) Mengonfigurasi aplikasi.

```
[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
      "spark.sql.catalog.my_catalog.type":"glue",
      "spark.sql.catalog.my_catalog.warehouse":"s3://amzn-s3-demo-bucket1/prefix/",
      "spark.sql.defaultCatalog":"my_catalog",
      "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
  }
]
```

------

## Menulis ke meja Iceberg
<a name="emr-iceberg-write-to-table"></a>

Contoh berikut menunjukkan cara membuat DataFrame dan menulisnya sebagai dataset Iceberg. Contoh menunjukkan bekerja dengan kumpulan data menggunakan shell Spark saat terhubung ke node master menggunakan SSH sebagai pengguna hadoop default.

**catatan**  
Untuk menempelkan sampel kode ke dalam shell Spark, ketik `:paste` pada prompt, tempel contoh, lalu tekan`CTRL+D`.

------
#### [ PySpark ]

Spark menyertakan shell berbasis Python,`pyspark`, yang dapat Anda gunakan untuk membuat prototipe program Spark yang ditulis dengan Python. Memanggil `pyspark` pada node master.

```
## Create a DataFrame.
data = spark.createDataFrame([
 ("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
 ("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
 ("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
 ("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
],["id", "creation_date", "last_update_time"])

## Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://amzn-s3-demo-bucket/example-prefix/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------
#### [ Scala ]

```
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.functions._

// Create a DataFrame.
val data = Seq(
("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
).toDF("id", "creation_date", "last_update_time")

// Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://amzn-s3-demo-bucket/example-prefix/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------

## Baca dari tabel Gunung Es
<a name="emr-iceberg-read-from-table"></a>

------
#### [ PySpark ]

```
df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Scala ]

```
val df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Spark SQL ]

```
SELECT * from dev.db.iceberg_table LIMIT 10
```

------

## Menggunakan Katalog Data AWS Glue dengan Spark Iceberg
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Anda dapat terhubung ke AWS Glue Data Catalog dari Spark Iceberg. Bagian ini menunjukkan perintah yang berbeda untuk menghubungkan.

### Connect ke katalog AWS Glue default di wilayah default Anda
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Contoh ini menunjukkan cara menghubungkan, menggunakan jenis katalog Glue. Jika Anda tidak menentukan ID katalog, ID tersebut menggunakan default:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

### Connect ke katalog AWS Glue dengan ID katalog tertentu
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Contoh ini menunjukkan cara menghubungkan, menggunakan ID katalog:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.catalog.my_catalog.glue.id=AWS Glue catalog ID \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

Perintah ini dapat digunakan untuk menghubungkan ke katalog AWS Glue di akun yang berbeda, atau ke katalog RMS, atau ke katalog federasi.

## Menggunakan Iceberg REST Catalog (IRC) dengan Spark Iceberg
<a name="emr-iceberg-rest-catalog-config"></a>

Bagian yang mengikuti detail cara mengkonfigurasi integrasi Iceberg dengan katalog.

### Hubungkan ke titik AWS akhir IRC Katalog Data Glue
<a name="emr-iceberg-rest-catalog-config-gdc"></a>

Berikut ini menunjukkan contoh `spark-submit` perintah untuk menggunakan Iceberg REST:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=glue catalog ID \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri=glue endpoint URI/iceberg \
    --conf spark.sql.catalog.my_catalog.rest.sigv4-enabled=true \
    --conf spark.sql.catalog.my_catalog.rest.signing-name=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

Untuk menggunakannya pada klaster yang diaktifkan runtime-role, diperlukan pengaturan konfigurasi percikan tambahan berikut:

```
"spark.hadoop.fs.s3.credentialsResolverClass": "software.amazon.glue.GlueTableCredentialsResolver",
"spark.hadoop.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
"spark.hadoop.glue.id": glue catalog ID
"spark.hadoop.glue.endpoint": "glue endpoint"
```

Untuk daftar URL titik akhir AWS Glue untuk setiap wilayah, lihat [AWS Glue endpoint dan](https://docs.aws.amazon.com/general/latest/gr/glue.html) kuota.

### Connect ke endpoint IRC yang sewenang-wenang
<a name="emr-iceberg-rest-catalog-config-arbitrary"></a>

Berikut ini menunjukkan contoh `spark-submit` perintah untuk menggunakan endpoint IRC:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=warehouse name \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri=your rest endpoint \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

## Perbedaan konfigurasi saat Anda menggunakan Iceberg versus SparkCatalog SparkSessionCatalog
<a name="emr-iceberg-spark-catalog"></a>

Iceberg menyediakan dua cara untuk membuat katalog Spark Iceberg. Anda dapat mengatur konfigurasi Spark ke salah satu `SparkCatalog` atau ke`SparkSessionCatalog`. 

### Menggunakan Iceberg SparkCatalog
<a name="emr-iceberg-spark-catalog-spark-catalog"></a>

Berikut ini menunjukkan perintah untuk menggunakan **SparkCatalog**sebagai katalog Spark Iceberg:

```
spark-shell \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.defaultCatalog=my_catalog
```

Pertimbangan untuk pendekatan ini:
+ Anda dapat mengakses tabel Iceberg tetapi tidak ada tabel lain.
+ Nama katalog tidak bisa **spark\$1catalog**. Ini adalah nama katalog awal di Spark. Itu selalu terhubung ke metastore Hive. Ini adalah katalog default di Spark, kecuali pengguna menimpa menggunakan. `spark.sql.defaultCatalog`
+ Anda dapat mengatur `spark.sql.defaultCatalog` ke nama katalog Anda untuk menjadikannya katalog default.

### Menggunakan Iceberg SparkSessionCatalog
<a name="emr-iceberg-spark-catalog-spark-session"></a>

Berikut ini menunjukkan perintah untuk menggunakan **SparkSessionCatalog**sebagai katalog Spark Iceberg:

```
spark-shell \
    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
    --conf spark.sql.catalog.spark_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
    --conf spark.sql.catalog.spark_catalog.type=glue
```

Pertimbangan untuk pendekatan ini:
+ Jika tabel tidak ditemukan sebagai tabel Gunung Es, Spark akan mencoba melihat apakah itu adalah tabel di metastore Hive. Lihat [Menggunakan Katalog Data AWS Glue sebagai katalog untuk Hive untuk](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html) informasi selengkapnya.
+ Nama katalog harus **spark\$1catalog**.

## Menggunakan ekstensi Iceberg Spark
<a name="emr-iceberg-spark-catalog-extensions"></a>

Iceberg menawarkan ekstensi Spark `org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions` yang dapat diatur pengguna melalui konfigurasi ekstensi Spark. `spark.sql.extensions` Ekstensi mengaktifkan fitur Iceberg utama seperti DELETE level baris, UPDATE dan MERGE, pernyataan dan prosedur bahasa definisi data Spark khusus Iceberg, seperti pemadatan, kedaluwarsa snapshot, percabangan dan penandaan, dan sebagainya. Lihat yang berikut ini untuk lebih jelasnya:
+ [Iceberg Spark menulis ekstensi: Spark Writes](https://iceberg.apache.org/docs/nightly/spark-writes/)
+ [Ekstensi Iceberg Spark DDL: ALTER TABLE ekstensi SQL](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)
+ [Ekstensi prosedur Iceberg Spark: Prosedur Spark](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)

## Pertimbangan untuk menggunakan Iceberg dengan Spark
<a name="spark-considerations-catalog"></a>
+ Amazon EMR 6.5.0 tidak mendukung Iceberg yang berjalan di Amazon EMR di EKS secara default. Gambar kustom Amazon EMR 6.5.0 tersedia sehingga Anda dapat meneruskan `--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` sebagai `spark-submit` parameter untuk membuat tabel Iceberg di Amazon EMR di EKS. Untuk informasi selengkapnya, lihat [Mengirimkan beban kerja Spark di Amazon EMR menggunakan gambar kustom di](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-submit) Amazon *EMR* pada Panduan Pengembangan EKS. Anda juga dapat menghubungi Dukungan untuk bantuan. Dimulai dengan Amazon EMR 6.6.0, Iceberg didukung di Amazon EMR di EKS.
+ Saat menggunakan AWS Glue sebagai katalog untuk Iceberg, pastikan database tempat Anda membuat tabel ada di Glue AWS . Jika Anda menggunakan layanan seperti AWS Lake Formation dan Anda tidak dapat memuat katalog, pastikan Anda memiliki akses yang tepat ke layanan untuk menjalankan perintah.
+ Jika Anda menggunakan Iceberg SparkSessionCatalog, seperti yang dijelaskan dalam[Perbedaan konfigurasi saat Anda menggunakan Iceberg versus SparkCatalog SparkSessionCatalog](#emr-iceberg-spark-catalog), Anda harus mengikuti langkah-langkah konfigurasi yang dijelaskan dalam Konfigurasi [Katalog Data AWS Glue sebagai metastore Apache Hive](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html), selain mengonfigurasi pengaturan Katalog Data Glue Spark Iceberg. AWS 

# Gunakan cluster Iceberg dengan Trino
<a name="emr-iceberg-use-trino-cluster"></a>

Dimulai dengan Amazon EMR versi 6.6.0, Anda dapat menggunakan Iceberg dengan cluster Trino Anda. 

Dalam tutorial ini, Anda menggunakan AWS CLI untuk bekerja dengan Iceberg di cluster Amazon EMR Trino. Untuk menggunakan konsol untuk membuat cluster dengan Iceberg diinstal, ikuti langkah-langkah dalam [Membangun danau data Apache Iceberg menggunakan Amazon Athena, Amazon EMR,](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) dan Glue. AWS 

## Buat cluster Iceberg
<a name="emr-iceberg-create-cluster-trino"></a>

Untuk menggunakan Iceberg di Amazon EMR dengan AWS CLI, pertama buat cluster dengan langkah-langkah berikut. Untuk informasi tentang menentukan klasifikasi Gunung Es menggunakan AWS CLI, lihat atau. [Menyediakan konfigurasi menggunakan AWS CLI saat Anda membuat klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Sediakan konfigurasi menggunakan Java SDK ketika Anda membuat sebuah klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk)

1. Buat `configurations.json` file dengan konten berikut. Misalnya, jika Anda ingin menggunakan metastore Hive sebagai katalog Anda, file Anda harus memiliki konten berikut.

   ```
   [
     {
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "hive.metastore.uri": "thrift://localhost:9083"
       }
     }
   ]
   ```

   Jika Anda ingin menggunakan AWS Glue Data Catalog sebagai toko Anda, file Anda harus memiliki konten berikut.

   ```
   [
     {
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "iceberg.catalog.type": "glue"
       }
     }
   ]
   ```

   Dimulai dengan Amazon EMR 7.7.0, termasuk properti *fs.native-s3.enabled=true*

   ```
   [
     { 
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "iceberg.catalog.type": "glue",
         "fs.native-s3.enabled": "true"
       }           
     }                 
   ]
   ```

1. Buat cluster dengan konfigurasi berikut, ganti contoh jalur bucket Amazon S3 dan nama kunci dengan milik Anda sendiri.

   ```
   aws emr create-cluster --release-label emr-6.7.0 \
   --applications Name=Trino \
   --region us-east-1 \
   --name My_Trino_Iceberg_Cluster \
   --log-uri s3://amzn-s3-demo-bucket \
   --configurations file://configurations.json \
   --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=c3.4xlarge InstanceGroupType=CORE,InstanceCount=3,InstanceType=c3.4xlarge \ 
   --use-default-roles \
   --ec2-attributes KeyName=<key-name>
   ```

## Inisialisasi sesi Trino untuk Iceberg
<a name="emr-iceberg-initialize-trino"></a>

Untuk menginisialisasi sesi Trino, jalankan perintah berikut.

```
trino-cli --catalog iceberg
```

## Menulis ke meja Iceberg
<a name="emr-iceberg-write-to-table-trino"></a>

Buat dan tulis ke tabel Anda dengan perintah SQL berikut.

```
trino> SHOW SCHEMAS;
trino> CREATE TABLE default.iceberg_table (
            id int,
            data varchar,
            category varchar)
       WITH (
            format = 'PARQUET',
            partitioning = ARRAY['category', 'bucket(id, 16)'],
            location = 's3://amzn-s3-demo-bucket/<prefix>')
          
trino> INSERT INTO default.iceberg_table VALUES (1,'a','c1'), (2,'b','c2'), (3,'c','c3');
```

## Baca dari tabel untuk Gunung Es
<a name="emr-iceberg-read-from-table-trino"></a>

Untuk membaca dari tabel Iceberg Anda, jalankan perintah berikut.

```
trino> SELECT * from default.iceberg_table;
```

## Pertimbangan untuk menggunakan Iceberg dengan Trino
<a name="trino-considerations"></a>
+ Amazon EMR 6.5 tidak menawarkan dukungan Katalog Gunung Es Trino untuk Iceberg secara asli. Trino membutuhkan Iceberg v0.11, jadi kami sarankan meluncurkan cluster EMR Amazon untuk Trino yang terpisah dari cluster Spark dan termasuk Iceberg v0.11 di cluster itu.
+ Saat menggunakan AWS Glue sebagai katalog untuk Iceberg, pastikan database tempat Anda membuat tabel ada di Glue AWS . Jika Anda menggunakan layanan seperti AWS Lake Formation dan Anda tidak dapat memuat katalog, pastikan Anda memiliki akses yang tepat ke layanan untuk menjalankan perintah.
+ Integrasi Iceberg Glue tidak berfungsi dengan katalog Redshift Managed Storage.

# Gunakan cluster Iceberg dengan Flink
<a name="emr-iceberg-use-flink-cluster"></a>

Dimulai dengan Amazon EMR versi 6.9.0, Anda dapat menggunakan Iceberg dengan cluster Flink tanpa langkah-langkah penyiapan yang diperlukan saat menggunakan Integrasi Iceberg Flink open source.

## Membuat cluster Iceberg
<a name="creating-iceberg-cluster"></a>

Anda dapat membuat cluster dengan Iceberg diinstal menggunakan Konsol Manajemen AWS, AWS CLI, atau Amazon EMR API. Dalam tutorial ini, Anda menggunakan AWS CLI untuk bekerja dengan Iceberg di cluster EMR Amazon. Untuk menggunakan konsol untuk membuat cluster dengan Iceberg diinstal, ikuti langkah-langkah dalam [Membangun danau data Apache Iceberg menggunakan Amazon Athena, Amazon EMR,](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) dan Glue. AWS 

Untuk menggunakan Iceberg di Amazon EMR dengan AWS CLI, pertama buat cluster dengan langkah-langkah berikut. Untuk informasi tentang menentukan klasifikasi Gunung Es menggunakan AWS CLI, lihat atau. [Menyediakan konfigurasi menggunakan AWS CLI saat Anda membuat klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Sediakan konfigurasi menggunakan Java SDK ketika Anda membuat sebuah klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk) Buat file yang disebut `configurations.json` dengan konten berikut:

```
[{
"Classification":"iceberg-defaults",
    "Properties":{"iceberg.enabled":"true"}
}]
```

Selanjutnya, buat cluster dengan konfigurasi berikut, ganti contoh jalur bucket Amazon S3 dan ID subnet dengan nilai Anda sendiri:

```
aws emr create-cluster --release-label emr-6.9.0 \
--applications Name=Flink \
--configurations file://iceberg_configurations.json \
--region us-east-1 \
--name My_flink_Iceberg_Cluster \
--log-uri s3://amzn-s3-demo-bucket/ \
--instance-type m5.xlarge \
--instance-count 2 \
--service-role EMR_DefaultRole \ 
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef
```

Atau, Anda dapat membuat cluster Amazon EMR 6.9.0 dengan aplikasi Flink di dalamnya dan menggunakan file `/usr/share/aws/iceberg/lib/iceberg-flink-runtime.jar` sebagai dependensi JAR dalam pekerjaan Flink.

## Menggunakan Flink SQL Client
<a name="using-flink-sql-client"></a>

Skrip SQL Client terletak di bawah`/usr/lib/flink/bin`. Anda dapat menjalankan skrip dengan perintah berikut:

```
flink-yarn-session -d # starting the Flink YARN Session in detached mode
./sql-client.sh
```

Ini meluncurkan Flink SQL Shell.

## Contoh Flink
<a name="flink-examples"></a>

### Buat tabel Iceberg
<a name="create-iceberg-table"></a>

**Flink SQL**

```
CREATE CATALOG glue_catalog WITH (
   'type'='iceberg',
   'warehouse'='<WAREHOUSE>',
   'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',
    'io-impl'='org.apache.iceberg.aws.s3.S3FileIO'
 );

USE CATALOG  glue_catalog;

CREATE DATABASE IF NOT EXISTS <DB>;

USE <DB>;

CREATE TABLE IF NOT EXISTS `glue_catalog`.`<DB>`.`sample` (id int, data string);
```

**Tabel API**

```
EnvironmentSettings settings =
                EnvironmentSettings.newInstance().inBatchMode().build();

TableEnvironment tEnv = TableEnvironment.create(settings);

String warehouse = "<WAREHOUSE>";
String db = "<DB>";

tEnv.executeSql(
                "CREATE CATALOG glue_catalog WITH (\n"
                        + "   'type'='iceberg',\n"
                        + "   'warehouse'='"
                        + warehouse
                        + "',\n"
                        + "   'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',\n"
                        + "   'io-impl'='org.apache.iceberg.aws.s3.S3FileIO'\n"
                        + " );");

tEnv.executeSql("USE CATALOG  glue_catalog;");
tEnv.executeSql("CREATE DATABASE IF NOT EXISTS " + db + ";");
tEnv.executeSql("USE " + db + ";");
tEnv.executeSql(
        "CREATE TABLE `glue_catalog`.`" + db + "`.`sample` (id bigint, data string);");
```

### Menulis ke meja Iceberg
<a name="write-to-iceberg-table"></a>

**Flink SQL**

```
INSERT INTO `glue_catalog`.`<DB>`.`sample` values (1, 'a'),(2,'b'),(3,'c');
```

**Tabel API**

```
tEnv.executeSql(
        "INSERT INTO `glue_catalog`.`"
                + db
                + "`.`sample` values (1, 'a'),(2,'b'),(3,'c');");
```

**Datastream API**

```
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

final StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

String db = "<DB Name>";

String warehouse = "<Warehouse Path>";

GenericRowData rowData1 = new GenericRowData(2);
rowData1.setField(0, 1L);
rowData1.setField(1, StringData.fromString("a"));

DataStream<RowData> input = env.fromElements(rowData1);

Map<String, String> props = new HashMap<();
props.put("type", "iceberg");
props.put("warehouse", warehouse);
props.put("io-impl", "org.apache.iceberg.aws.s3.S3FileIO");

CatalogLoader glueCatlogLoader =
        CatalogLoader.custom(
                "glue",
                props,
                new Configuration(),
                "org.apache.iceberg.aws.glue.GlueCatalog");

TableLoader tableLoader =
        TableLoader.fromCatalog(glueCatlogLoader, TableIdentifier.of(db, "sample"));

DataStreamSink<Void> dataStreamSink =
        FlinkSink.forRowData(input).tableLoader(tableLoader).append();

env.execute("Datastream Write");
```

### Baca dari tabel Gunung Es
<a name="read-from-iceberg-table"></a>

**Flink SQL**

```
SELECT * FROM `glue_catalog`.`<DB>`.`sample`;
```

**Tabel API**

```
Table result = tEnv.sqlQuery("select * from `glue_catalog`.`" + db + "`.`sample`;");
```

**Datastream API**

```
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

final StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

String db = "<DB Name>";

String warehouse = "<Warehouse Path>";

Map<String, String> props = new HashMap<>();
props.put("type", "iceberg");
props.put("warehouse", warehouse);
props.put("io-impl", "org.apache.iceberg.aws.s3.S3FileIO");

CatalogLoader glueCatlogLoader =
        CatalogLoader.custom(
                "glue",
                props,
                new Configuration(),
                "org.apache.iceberg.aws.glue.GlueCatalog");
                
TableLoader tableLoader =
        TableLoader.fromCatalog(glueCatlogLoader, TableIdentifier.of(db, "sample"));

DataStream<RowData> batch =
                FlinkSource.forRowData().env(env).tableLoader(tableLoader).streaming(false).build();

batch.print().name("print-sink");
```

## Menggunakan katalog Hive
<a name="using-hive-catalog"></a>

Pastikan dependensi Flink dan Hive diselesaikan seperti yang dijelaskan dalam. [Konfigurasikan Flink dengan Hive Metastore dan Glue Catalog](flink-configure.md#flink-configure-hive)

## Menjalankan Job Flink
<a name="running-flink-job"></a>

Salah satu cara untuk mengirimkan pekerjaan ke Flink adalah dengan menggunakan sesi Flink YARN per pekerjaan. Ini dapat diluncurkan dengan perintah berikut:

```
sudo flink run -m yarn-cluster -p 4 -yjm 1024m -ytm 4096m $JAR_FILE_NAME
```

## Pertimbangan untuk menggunakan Iceberg dengan Flink
<a name="flink-considerations"></a>
+ Saat menggunakan AWS Glue sebagai katalog untuk Iceberg, pastikan database tempat Anda membuat tabel ada di Glue AWS . Jika Anda menggunakan layanan seperti AWS Lake Formation dan Anda tidak dapat memuat katalog, pastikan Anda memiliki akses yang tepat ke layanan untuk menjalankan perintah.
+ Integrasi Iceberg Glue tidak berfungsi dengan katalog Redshift Managed Storage.

# Gunakan cluster Iceberg dengan Hive
<a name="emr-iceberg-use-hive-cluster"></a>

Dengan Amazon EMR rilis 6.9.0 dan yang lebih tinggi, Anda dapat menggunakan Iceberg dengan cluster Hive tanpa harus melakukan langkah-langkah penyiapan yang diperlukan untuk Integrasi Sarang Iceberg Sumber Terbuka. Untuk Amazon EMR versi 6.8.0 dan yang lebih lama, Anda dapat menggunakan tindakan bootstrap untuk menginstal `iceberg-hive-runtime` jar untuk mengonfigurasi dukungan Hive for Iceberg.

Amazon EMR 6.9.0 mencakup semua fitur untuk [integrasi Hive 3.1.3 dengan Iceberg 0.14.1 dan](https://iceberg.apache.org/releases/#0140-release) juga menyertakan fitur tambahan Amazon EMR seperti pemilihan otomatis mesin eksekusi yang didukung saat runtime (Amazon EMR di EKS 6.9.0).

## Buat cluster Iceberg
<a name="create-iceberg-cluster"></a>

Anda dapat membuat cluster dengan Iceberg diinstal menggunakan Konsol Manajemen AWS, AWS CLI atau Amazon EMR API. Dalam tutorial ini, Anda menggunakan AWS CLI untuk bekerja dengan Iceberg di cluster EMR Amazon. Untuk menggunakan konsol untuk membuat cluster dengan Iceberg diinstal, ikuti langkah-langkah di [Build a Iceberg data lake menggunakan Amazon Athena, Amazon EMR,](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) dan Glue. AWS 

Untuk menggunakan Iceberg di Amazon EMR dengan AWS CLI, pertama buat cluster menggunakan langkah-langkah di bawah ini. Untuk informasi tentang menentukan klasifikasi Iceberg menggunakan atau Java SDK, lihat AWS CLI atau. [Menyediakan konfigurasi menggunakan AWS CLI saat Anda membuat klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Sediakan konfigurasi menggunakan Java SDK ketika Anda membuat sebuah klaster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk) Buat file bernama `configurations.json` dengan konten berikut:

```
[{
    "Classification":"iceberg-defaults",
    "Properties":{"iceberg.enabled":"true"}
}]
```

Selanjutnya, buat cluster dengan konfigurasi berikut, ganti contoh jalur bucket Amazon S3 dan ID subnet dengan milik Anda sendiri:

```
aws emr create-cluster --release-label emr-6.9.0 \
--applications Name=Hive \
--configurations file://iceberg_configurations.json \
--region us-east-1 \
--name My_hive_Iceberg_Cluster \
--log-uri s3://amzn-s3-demo-bucket/ \
--instance-type m5.xlarge \
--instance-count 2 \
--service-role EMR_DefaultRole \ 
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef
```

Sebuah cluster Hive Iceberg melakukan hal-hal berikut:
+ Memuat jar runtime Iceberg Hive di Hive dan memungkinkan konfigurasi terkait Iceberg untuk mesin Hive.
+ Memungkinkan pemilihan mesin eksekusi dinamis Amazon EMR Hive untuk mencegah pengguna menyetel mesin eksekusi yang didukung untuk kompatibilitas Iceberg.

**catatan**  
Cluster Hive Iceberg saat ini tidak mendukung Katalog Data AWS Glue. Katalog Iceberg default adalah`HiveCatalog`, yang sesuai dengan metastore yang dikonfigurasi untuk lingkungan Hive. Untuk informasi selengkapnya tentang manajemen katalog, lihat [Menggunakan HCatalog](https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat#HCatalogUsingHCat-UsingHCatalog) dalam dokumentasi [Apache Hive](https://cwiki.apache.org/confluence/display/HIVE).

## Dukungan fitur
<a name="feature-support"></a>

Amazon EMR 6.9.0 mendukung Hive 3.1.3 dan Iceberg 0.14.1. Dukungan fitur terbatas pada fitur yang kompatibel dengan Iceberg untuk Hive 3.1.2 dan 3.1.3. Perintah berikut didukung:
+ Dengan Amazon EMR merilis 6.9.0 hingga 6.12.x, Anda harus menyertakan jar di `libfb303` direktori Hive. `auxlib` Gunakan perintah berikut untuk memasukkannya:

  ```
  sudo /usr/bin/ln -sf /usr/lib/hive/lib/libfb303-*.jar /usr/lib/hive/auxlib/libfb303.jar
  ```

  Dengan Amazon EMR rilis 6.13 dan yang lebih tinggi, `libfb303` jar secara otomatis terhubung ke direktori Hive. `auxlib` 
+ **Membuat tabel**
  + Tabel **non-partisi - Tabel** eksternal di Hive dapat dibuat dengan menyediakan handler penyimpanan sebagai berikut:

    ```
    CREATE EXTERNAL TABLE x (i int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    ```
  + **Tabel dipartisi - Tabel** partisi eksternal di Hive dapat dibuat sebagai berikut:

    ```
    CREATE EXTERNAL TABLE x (i int) PARTITIONED BY (j int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    ```
**catatan**  
Format `STORED AS` file tidak ORC/AVRO/PARQUET didukung di Hive 3. Pilihan default dan satu-satunya adalah Parket.
+ **Menjatuhkan tabel** — `DROP TABLE` Perintah ini digunakan untuk menjatuhkan tabel, seperti pada contoh berikut:

  ```
  DROP TABLE [IF EXISTS] table_name [PURGE];
  ```
+ **Membaca tabel** — `SELECT` pernyataan dapat digunakan untuk membaca tabel Iceberg di Hive, seperti dalam contoh berikut. Mesin eksekusi yang didukung adalah MR dan Tez.

  ```
  SELECT * FROM table_name
  ```

  [Untuk informasi tentang sintaks pilih Hive, lihat LanguageManual Memilih.](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select) Untuk informasi tentang pernyataan tertentu dengan tabel Iceberg di Hive, lihat [Apache](https://iceberg.apache.org/docs/latest/hive/#select) Iceberg Select.
+ **Menyisipkan ke dalam tabel** — `INSERT INTO` pernyataan HiveQL bekerja pada tabel Iceberg dengan dukungan untuk mesin eksekusi Map Reduce saja. Pengguna Amazon EMR tidak perlu secara eksplisit mengatur mesin eksekusi karena Amazon EMR Hive memilih mesin untuk Iceberg Tables saat runtime. 
  + **Sisipkan tabel tunggal ke** - Contoh:

    ```
    INSERT INTO table_name VALUES ('a', 1);
    INSERT INTO table_name SELECT...;
    ```
  + **Penyisipan multi-tabel ke** - Penyisipan multi-tabel non-atom ke dalam pernyataan didukung. Contoh:

    ```
    FROM source
     INSERT INTO table_1 SELECT a, b
     INSERT INTO table_2 SELECT c,d;
    ```

Dimulai dengan Amazon EMR 7.3.0, Hive with Iceberg mendukung AWS Glue Data Catalog sebagai metastore. Untuk menggunakan AWS Glue Data Catalog sebagai metastore, atur properti berikut.

```
SET iceberg.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog;
```

Atau, Anda juga dapat mengatur properti berikut.

```
SET iceberg.catalog.<catalog_name>.type=glue;
```

Anda kemudian dapat membuat tabel menggunakan contoh berikut.

```
CREATE EXTERNAL TABLE table_name (col1 type1, col2 type2,..)
ROW FORMAT SERDE 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location '<location>'
TBLPROPERTIES ('table_type'='iceberg', 'iceberg.catalog'='<catalog_name>');
```

## Pertimbangan untuk menggunakan Iceberg dengan Hive
<a name="hive-considerations"></a>
+ Iceberg mendukung jenis kueri berikut:
  + MEMBUAT TABEL
  + Membatalkan tabel
  + Masukkan ke dalam tabel
  + Baca tabel
+ Hanya mesin eksekusi MR (MapReduce) yang didukung untuk operasi DHTML (bahasa manipulasi data), dan MR tidak digunakan lagi di Hive 3.1.3.
+ Untuk Amazon EMR sebelum 7.3.0, AWS Glue Data Catalog saat ini tidak didukung untuk Iceberg with Hive.
+ Penanganan kesalahan tidak cukup kuat. Dalam kasus kesalahan konfigurasi, penyisipan ke kueri mungkin berhasil diselesaikan. Namun, kegagalan untuk memperbarui metadata dapat mengakibatkan hilangnya data.
+ Integrasi Iceberg Glue tidak berfungsi dengan katalog Redshift Managed Storage.