Layanan EMR Remote Shuffle Service (ESS) merupakan ekstensi untuk E-MapReduce (EMR) yang mengoptimalkan operasi shuffle pada Mesin komputasi.
Latar Belakang
Mekanisme shuffle tradisional menghadirkan beberapa tantangan:
-
Pada skenario dengan volume data besar, operasi shuffle write dapat menyebabkan spill ke disk, yang mengakibatkan amplifikasi tulis.
-
Operasi shuffle read menghasilkan volume tinggi paket jaringan kecil, yang dapat menyebabkan error koneksi terputus.
-
Operasi shuffle read melibatkan banyak permintaan I/O kecil dan pembacaan acak, sehingga memberikan beban berat pada disk dan CPU.
-
Ketika jumlah mapper (M) dan reducer (N) mencapai ribuan, jumlah total koneksi jaringan (M × N) dapat mencegah pekerjaan selesai.
-
NodeManager dan Spark Shuffle Service berjalan dalam proses yang sama. Ketika volume data shuffle sangat besar, NodeManager dapat restart, yang berdampak pada stabilitas penjadwalan YARN.
ESS memberikan keunggulan berikut:
-
Menggunakan mekanisme shuffle bergaya dorong (push-style) alih-alih bergaya tarik (pull-style), sehingga mengurangi tekanan memori pada mapper.
-
Mendukung agregasi I/O, yang mengurangi jumlah koneksi shuffle read dari M × N menjadi N serta menggantikan pembacaan acak dengan pembacaan sekuensial.
-
Mendukung mekanisme dua replika untuk mengurangi kemungkinan kegagalan fetch.
-
Mendukung arsitektur pemisahan komputasi dan penyimpanan, memungkinkan Anda men-deploy Shuffle Service di lingkungan perangkat keras terpisah yang tidak terikat dengan kluster komputasi.
-
Menghilangkan ketergantungan pada disk lokal saat menjalankan Spark di Kubernetes.
Gambar berikut menunjukkan arsitektur ESS.
Batasan
Dokumen ini hanya berlaku untuk versi EMR sebelum EMR-3.39.1, seri versi EMR-4.x, dan versi sebelum EMR-5.5.0. Untuk EMR-3.39.1 atau versi lebih baru serta EMR-5.5.0 atau versi lebih baru, lihat RSS.
Membuat kluster
Sebagai contoh, pada EMR-4.5.0, Anda dapat membuat kluster dengan ESS melalui dua cara:
-
Buat kluster E-MapReduce Shuffle Service. Pada halaman Konfigurasi Perangkat Lunak, untuk Jenis Kluster, pilih Shuffle Service. Layanan yang diperlukan adalah ESS (1.0.0).
-
Buat kluster E-MapReduce Hadoop. Pada halaman Software Configuration, di bagian Cluster Type, pilih jenis seperti Hadoop, Kafka, atau Druid. Kemudian, konfigurasikan Cloud Native Options (misalnya, pada ECS) dan Product Version (misalnya, EMR-4.5.0). Halaman tersebut kemudian akan menampilkan layanan wajib yang sesuai (seperti HDFS, YARN, dan Spark) dan layanan opsional (seperti ESS, HBase, dan Flink) beserta versinya.
Untuk informasi selengkapnya tentang cara membuat kluster, lihat Create a cluster.
Menggunakan ESS
Untuk menggunakan ESS dengan Spark, tambahkan parameter berikut ke pengiriman pekerjaan Spark Anda. Untuk informasi selengkapnya tentang cara mengonfigurasi parameter, lihat Edit jobs.
Untuk informasi selengkapnya tentang parameter Spark, lihat Spark Configuration.
|
Parameter |
Deskripsi |
|
spark.shuffle.manager |
Nilainya harus org.apache.spark.shuffle.ess.EssShuffleManager. |
|
spark.ess.master.address |
Tentukan alamat dalam format <ess-master-ip>:<ess-master-port>. Parameter tersebut adalah sebagai berikut:
|
|
spark.shuffle.service.enabled |
Atur nilainya ke Anda harus menonaktifkan layanan shuffle eksternal bawaan untuk menggunakan EMR Remote Shuffle Service. |
|
spark.shuffle.useOldFetchProtocol |
Atur nilainya ke Ini mengaktifkan kompatibilitas dengan protokol shuffle lama. |
|
spark.sql.adaptive.enabled |
Atur nilainya ke EMR Remote Shuffle Service tidak mendukung Adaptive Execution. |
|
spark.sql.adaptive.skewJoin.enabled |
Parameter
Halaman konfigurasi layanan ESS mencantumkan semua parameter ESS.
|
Parameter |
Deskripsi |
Bawaan |
|
ess.push.data.replicate |
Mengaktifkan atau menonaktifkan fitur dua replika. Nilai yang valid:
Catatan
Kami menyarankan Anda mengaktifkan fitur ini di lingkungan produksi. |
true |
|
ess.worker.flush.queue.capacity |
Jumlah buffer flush per direktori. Catatan
Untuk meningkatkan kinerja, Anda dapat mengonfigurasi beberapa disk. Untuk throughput baca dan tulis optimal, kami menyarankan agar Anda menggunakan tidak lebih dari dua direktori per disk. Memori heap yang dikonsumsi oleh buffer flush untuk setiap direktori adalah ess.worker.flush.buffer.size * ess.worker.flush.queue.capacity, yaitu |
512 |
|
ess.flush.timeout |
Periode timeout untuk flushing data ke lapisan penyimpanan. |
240s |
|
ess.application.timeout |
Timeout heartbeat aplikasi. Jika heartbeat tidak diterima dalam periode ini, ESS membersihkan sumber daya aplikasi tersebut. |
240s |
|
ess.worker.flush.buffer.size |
Ukuran buffer flush. Saat buffer melebihi ukuran ini, ESS melakukan flushing data ke disk. |
256k |
|
ess.metrics.system.enable |
Mengaktifkan atau menonaktifkan Pemantauan. Nilai yang valid:
|
false |
|
ess_worker_offheap_memory |
Ukuran memori off-heap untuk node core. |
4g |
|
ess_worker_memory |
Ukuran memori heap untuk node core. |
4g |
|
ess_master_memory |
Ukuran memori heap untuk node master. |
4g |