Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Bekerja dengan 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 aktif, Amazon EMR di EKS, EC2 Amazon EMR Tanpa Server, dan Amazon EMR aktif. AWS Outposts Untuk memilih opsi penerapan beban kerja Anda, lihat FAQ EMR
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. Tinjau juga bagian di bawah Gunakan cluster dengan Iceberg 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-7.8.0.
Membuat cluster EMR Amazon dengan Iceberg
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 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 cluster EC2 atau Amazon EMR di titik akhir yang dikelola EKS. Lihat Layanan AWS dokumentasi untuk petunjuk cara menyiapkan EMR Studio untuk Amazon EMR dan Amazon EMR di EC2 EKS.
Untuk menggunakan Iceberg di EMR Studio, ikuti langkah-langkah berikut:
-
Luncurkan klaster EMR Amazon dengan Iceberg diaktifkan, seperti yang diinstruksikan dalam Gunakan klaster dengan Iceberg Installed.
-
Siapkan Studio EMR. Untuk petunjuk, lihat Menyiapkan Amazon EMR Studio.
-
Buka buku catatan EMR Studio Workspace dan jalankan kode berikut sebagai sel pertama di buku catatan 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>.type": "glue", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }
di mana:
-
<catalog_name>
adalah nama katalog sesi Iceberg Spark Anda. Ganti dengan nama pilihan Anda, dan ingat untuk mengubah referensi di semua konfigurasi yang terkait dengan katalog ini. Dalam kode Anda, Anda dapat merujuk ke tabel Iceberg Anda dengan menggunakan nama tabel yang sepenuhnya memenuhi syarat, termasuk nama katalog sesi Spark, sebagai berikut:<catalog_name>.<database_name>.<table_name>
Atau, Anda dapat mengubah katalog default ke katalog Iceberg yang Anda tentukan dengan menyetel
spark.sql.defaultCatalog
ke nama katalog Anda. Pendekatan kedua ini memungkinkan Anda untuk merujuk ke tabel tanpa awalan katalog, yang dapat menyederhanakan kueri Anda. -
<catalog_name>.warehouse
menunjuk ke jalur Amazon S3 tempat Anda ingin menyimpan data dan metadata Anda. -
Untuk membuat katalog AWS Glue Data Catalog, atur
spark.sql.catalog.<catalog_name>.type
keglue
. 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.
-
-
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
Pekerjaan Menjalankan Iceberg di Amazon EMR
Seperti pekerjaan Spark lainnya, Anda dapat mengirimkan pekerjaan ke EMR Amazon EC2 di klaster dengan menambahkan langkah-langkah atau dengan mengirimkan pekerjaan Spark secara interaktif ke node master. Untuk menjalankan pekerjaan Spark, lihat halaman dokumentasi Amazon EMR berikut:
-
Untuk gambaran umum tentang berbagai opsi untuk mengirimkan karya ke EMR Amazon di EC2 klaster dan petunjuk terperinci untuk setiap opsi, lihat Mengirimkan pekerjaan ke klaster.
-
Untuk Amazon EMR di EKS, lihat Menjalankan pekerjaan Spark dengan. StartJobRun
Bagian berikut memberikan contoh untuk setiap opsi penyebaran EMR Amazon.
Amazon EMR aktif EC2
Anda dapat menggunakan langkah-langkah ini untuk mengirimkan pekerjaan Iceberg Spark:
-
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>.type=glue", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
-
Ubah file konfigurasi untuk pekerjaan Spark spesifik Anda dengan menyesuaikan opsi konfigurasi Iceberg yang disorot dengan huruf tebal.
-
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 EMR Tanpa Server dengan menggunakan: AWS CLI
-
Buat file
emr_serverless_iceberg.json
dengan konten berikut di workstation Anda:{ "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "name": "iceberg-test-job", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [] } }, "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>.type": "glue", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "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/" } } } }
-
Ubah file konfigurasi untuk pekerjaan Spark spesifik Anda dengan menyesuaikan opsi konfigurasi Iceberg yang disorot dengan huruf tebal.
-
Kirimkan 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 EMR Tanpa Server dengan menggunakan konsol EMR Studio:
-
Ikuti petunjuk dalam dokumentasi EMR Tanpa Server.
-
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 EKS
Untuk mengirimkan pekerjaan Iceberg Spark ke Amazon EMR di EKS dengan menggunakan: AWS CLI
-
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>.type": "glue", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "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/" } } } }
-
Ubah file konfigurasi untuk pekerjaan Spark Anda dengan menyesuaikan opsi konfigurasi Iceberg yang disorot dengan huruf tebal.
-
Kirimkan 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
- Aturspark.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 MBs) 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.