Bekerja dengan Apache Iceberg di Amazon EMR - AWS Panduan] Panduan: Panduan

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

Bekerja dengan Apache Iceberg di Amazon EMR

Amazon EMR menyediakan pemrosesan data skala petabyte, analitik interaktif, dan pembelajaran mesin di cloud dengan menggunakan kerangka kerja open source seperti Apache Spark, Apache Hive, Flink, dan Trino.

catatan

Panduan ini menggunakan Apache Spark sebagai contoh.

Amazon EMR mendukung beberapa opsi penerapan: Amazon EMR di Amazon EC2, Amazon EMR di Amazon EKS, Amazon EMR Tanpa Server, dan Amazon EMR aktif. AWS Outposts Untuk memilih opsi penerapan beban kerja Anda, lihat FAQ EMR Amazon.

Versi dan kompatibilitas fitur

Amazon EMR versi 6.5.0 dan versi yang lebih baru mendukung Apache Iceberg secara asli. Untuk daftar versi Iceberg yang didukung untuk setiap rilis EMR Amazon, lihat Riwayat rilis Iceberg dalam dokumentasi Amazon EMR. Juga tinjau pertimbangan dan batasan untuk menggunakan Iceberg di Amazon EMR untuk melihat fitur Iceberg mana yang didukung di Amazon EMR pada kerangka kerja yang berbeda.

Kami menyarankan Anda menggunakan versi EMR Amazon terbaru untuk mendapatkan keuntungan dari versi Iceberg terbaru yang didukung. Contoh kode dan konfigurasi di bagian ini mengasumsikan bahwa Anda menggunakan Amazon EMR rilis emr-6.9.0.

Membuat cluster EMR Amazon dengan Iceberg

Untuk membuat cluster EMR Amazon di Amazon EC2 dengan Iceberg diinstal, ikuti petunjuk dalam dokumentasi Amazon EMR. 

Secara khusus, cluster Anda harus dikonfigurasi dengan klasifikasi berikut:

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

Anda juga dapat memilih untuk menggunakan Amazon EMR Tanpa Server atau Amazon EMR di Amazon EKS sebagai opsi penerapan untuk beban kerja Iceberg Anda, mulai dari Amazon EMR 6.6.0.

Mengembangkan aplikasi Iceberg di Amazon EMR

Untuk mengembangkan kode Spark untuk aplikasi Iceberg Anda, Anda dapat menggunakan Amazon EMR Studio, yang merupakan lingkungan pengembangan terintegrasi berbasis web (IDE) untuk notebook Jupyter yang dikelola sepenuhnya yang berjalan di klaster EMR Amazon. 

Menggunakan notebook Amazon EMR Studio

Anda dapat mengembangkan aplikasi Spark secara interaktif di notebook Amazon EMR Studio Workspace dan menghubungkan notebook tersebut ke EMR Amazon Anda di kluster Amazon EC2 atau Amazon EMR di titik akhir yang dikelola Amazon EKS. Lihat Layanan AWS dokumentasi untuk petunjuk cara menyiapkan EMR Studio untuk Amazon EMR di Amazon EC2 dan Amazon EMR di Amazon EKS.

Untuk menggunakan Iceberg di EMR Studio, ikuti langkah-langkah berikut: 

  1. Luncurkan klaster EMR Amazon dengan Iceberg diaktifkan, seperti yang diinstruksikan dalam Gunakan klaster dengan Iceberg Installed. 

  2. Siapkan Studio EMR. Untuk petunjuk, lihat Menyiapkan Amazon EMR Studio.

  3. Buka buku catatan EMR Studio Workspace dan jalankan kode berikut sebagai sel pertama di notebook untuk mengonfigurasi sesi Spark Anda untuk menggunakan Iceberg:

    %%configure -f { "conf": { "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }

    di mana:

    • <catalog_name>adalah nama katalog sesi Iceberg Spark Anda. Ganti dengan nama katalog Anda, dan ingat untuk mengubah referensi di semua konfigurasi yang terkait dengan katalog ini. Dalam kode Anda, Anda kemudian harus merujuk ke tabel Iceberg Anda dengan nama tabel yang sepenuhnya memenuhi syarat, termasuk nama katalog sesi Spark, sebagai berikut:

      <catalog_name>.<database_name>.<table_name>
    • <catalog_name>.warehousemenunjuk ke jalur Amazon S3 tempat Anda ingin menyimpan data dan metadata Anda.

    • Untuk membuat katalog AWS Glue Data Catalog, atur <catalog_name>.catalog-impl keorg.apache.iceberg.aws.glue.GlueCatalog. Kunci ini diperlukan untuk menunjuk ke kelas implementasi untuk setiap implementasi katalog kustom. Bagian praktik terbaik umum nanti dalam panduan ini menjelaskan berbagai katalog yang didukung Iceberg.

    • Gunakan org.apache.iceberg.aws.s3.S3FileIO sebagai untuk memanfaatkan unggahan multipart Amazon S3 untuk paralelisme tinggi. <catalog_name>.io-impl

  4. Anda sekarang dapat mulai secara interaktif mengembangkan aplikasi Spark Anda untuk Iceberg di notebook, seperti yang Anda lakukan untuk aplikasi Spark lainnya.

Untuk informasi selengkapnya tentang mengonfigurasi Spark untuk Apache Iceberg dengan menggunakan Amazon EMR Studio, lihat posting blog Membangun data lake berperforma tinggi, sesuai ACID, dan berkembang menggunakan Apache Iceberg di Amazon EMR. 

Pekerjaan Menjalankan Iceberg di Amazon EMR

Setelah Anda mengembangkan kode aplikasi Spark untuk beban kerja Iceberg Anda, Anda dapat menjalankannya di opsi penyebaran EMR Amazon apa pun yang mendukung Iceberg (lihat FAQ Amazon EMR).

Seperti pekerjaan Spark lainnya, Anda dapat mengirimkan pekerjaan ke EMR Amazon di klaster Amazon EC2 dengan menambahkan langkah-langkah atau dengan mengirimkan pekerjaan Spark secara interaktif ke node master. Untuk menjalankan pekerjaan Spark, lihat halaman dokumentasi Amazon EMR berikut:

Bagian berikut memberikan contoh untuk setiap opsi penyebaran EMR Amazon.

Amazon EMR di Amazon EC2

Anda dapat menggunakan langkah-langkah ini untuk mengirimkan pekerjaan Iceberg Spark:

  1. Buat file emr_step_iceberg.json dengan konten berikut di workstation Anda:

    [{ "Name": "iceberg-test-job", "Type": "spark", "ActionOnFailure": "CONTINUE", "Args": [ "--deploy-mode", "client", "--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>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "--conf", "spark.sql.catalog.<catalog_name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
  2. Ubah file konfigurasi untuk pekerjaan Spark spesifik Anda dengan menyesuaikan opsi konfigurasi Iceberg yang disorot dengan huruf tebal.

  3. Kirim langkah dengan menggunakan AWS Command Line Interface (AWS CLI). Jalankan perintah di direktori tempat emr_step_iceberg.json file berada.

    aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json

Amazon EMR Tanpa Server

Untuk mengirimkan pekerjaan Iceberg Spark ke Amazon EMR Tanpa Server dengan menggunakan: AWS CLI

  1. Buat file emr_serverless_iceberg.json dengan konten berikut di workstation Anda:

    { "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars /usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar", "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. Ubah file konfigurasi untuk pekerjaan Spark spesifik Anda dengan menyesuaikan opsi konfigurasi Iceberg yang disorot dengan huruf tebal.

  3. Kirim pekerjaan dengan menggunakan AWS CLI. Jalankan perintah di direktori tempat emr_serverless_iceberg.json file berada:

    aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json

Untuk mengirimkan pekerjaan Iceberg Spark ke Amazon EMR Tanpa Server dengan menggunakan konsol EMR Studio:

  1. Ikuti petunjuk dalam dokumentasi Amazon EMR Tanpa Server.

  2. Untuk konfigurasi Job, gunakan konfigurasi Iceberg untuk Spark yang disediakan untuk AWS CLI dan sesuaikan bidang yang disorot untuk Iceberg. Untuk petunjuk terperinci, lihat Menggunakan Apache Iceberg dengan EMR Tanpa Server di dokumentasi Amazon EMR.

Amazon EMR di Amazon EKS

Untuk mengirimkan pekerjaan Iceberg Spark ke Amazon EMR di Amazon EKS dengan menggunakan: AWS CLI

  1. Buat file emr_eks_iceberg.json dengan konten berikut di workstation Anda:

    { "name": "iceberg-test-job", "virtualClusterId": "<VIRTUAL_CLUSTER_ID>", "executionRoleArn": "<ROLE_ARN>", "releaseLabel": "emr-6.9.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. Ubah file konfigurasi untuk pekerjaan Spark Anda dengan menyesuaikan opsi konfigurasi Iceberg yang disorot dengan huruf tebal.

  3. Kirim pekerjaan dengan menggunakan AWS CLI. Jalankan perintah berikut di direktori tempat emr_eks_iceberg.json file berada:

    aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json

Untuk petunjuk terperinci, lihat Menggunakan Apache Iceberg dengan Amazon EMR di EKS di Amazon EMR pada dokumentasi EKS

Praktik terbaik untuk Amazon EMR

Bagian ini memberikan pedoman umum untuk menyetel pekerjaan Spark di Amazon EMR untuk mengoptimalkan membaca dan menulis data ke tabel Iceberg. Untuk praktik terbaik khusus Iceberg, lihat bagian Praktik terbaik nanti di panduan ini.

  • Gunakan versi terbaru Amazon EMR - Amazon EMR menyediakan pengoptimalan Spark di luar kotak dengan runtime Amazon EMR Spark. AWS meningkatkan kinerja mesin runtime Spark dengan setiap rilis baru.

  • Tentukan infrastruktur optimal untuk beban kerja Spark Anda — Beban kerja Spark mungkin memerlukan berbagai jenis perangkat keras untuk karakteristik pekerjaan yang berbeda guna memastikan kinerja yang optimal. Amazon EMR mendukung beberapa jenis instans (seperti komputasi yang dioptimalkan, dioptimalkan memori, tujuan umum, dan penyimpanan yang dioptimalkan) untuk mencakup semua jenis persyaratan pemrosesan. Saat Anda melakukan onboard beban kerja baru, sebaiknya Anda melakukan benchmark dengan tipe instans umum seperti M5 atau M6g. Pantau metrik sistem operasi (OS) dan YARN dari Ganglia dan Amazon CloudWatch untuk menentukan kemacetan sistem (CPU, memori, penyimpanan, dan I/O) pada beban puncak dan pilih perangkat keras yang sesuai.

  • Tune spark.sql.shuffle.partitions - Atur spark.sql.shuffle.partitions properti ke jumlah total inti virtual (vCores) di cluster Anda atau ke kelipatan dari nilai itu (biasanya, 1 hingga 2 kali jumlah total vCores). Pengaturan ini memengaruhi paralelisme Spark saat Anda menggunakan partisi hash dan rentang sebagai mode distribusi tulis. Ini meminta shuffle sebelum menulis untuk mengatur data, yang memastikan keselarasan partisi.

  • Aktifkan penskalaan terkelola — Untuk hampir semua kasus penggunaan, sebaiknya aktifkan penskalaan terkelola dan alokasi dinamis. Namun, jika Anda memiliki beban kerja yang memiliki pola yang dapat diprediksi, kami sarankan Anda menonaktifkan penskalaan otomatis dan alokasi dinamis. Saat penskalaan terkelola diaktifkan, sebaiknya gunakan Instans Spot untuk mengurangi biaya. Gunakan Instans Spot untuk node tugas alih-alih node inti atau master. Saat Anda menggunakan Instans Spot, gunakan armada instans dengan beberapa jenis instans per armada untuk memastikan ketersediaan spot.

  • Gunakan broadcast join bila memungkinkan — Broadcast (mapside) join adalah gabungan yang paling optimal, selama salah satu tabel Anda cukup kecil untuk muat dalam memori node terkecil Anda (dalam urutan MB) dan Anda melakukan equi (=) join. Semua jenis gabungan kecuali gabungan luar penuh didukung. Sebuah broadcast join menyiarkan tabel yang lebih kecil sebagai tabel hash di semua node pekerja dalam memori. Setelah tabel kecil disiarkan, Anda tidak dapat mengubahnya. Karena tabel hash secara lokal di mesin virtual Java (JVM), maka dapat digabungkan dengan mudah dengan tabel besar berdasarkan kondisi gabungan dengan menggunakan gabungan hash. Broadcast join memberikan kinerja tinggi karena overhead shuffle minimal.

  • Setel pengumpul sampah — Jika siklus pengumpulan sampah (GC) lambat, pertimbangkan untuk beralih dari pengumpul sampah paralel default ke G1GC untuk kinerja yang lebih baik. Untuk mengoptimalkan kinerja GC, Anda dapat menyempurnakan parameter GC. Untuk melacak kinerja GC, Anda dapat memantaunya dengan menggunakan UI Spark. Idealnya, waktu GC harus kurang dari atau sama dengan 1 persen dari total runtime tugas.