Arsitektur

Driver, executor, cluster manager, dan percakapan sebuah job dari ujung ke ujung.

Daftar isi

Topik ini membedah cara sebuah program Spark benar-benar berjalan. Tiga peran utama, yaitu driver, cluster manager, dan executor, diperkenalkan satu per satu, kemudian dirangkai menjadi percakapan lengkap sebuah job, yaitu satu unit pekerjaan dari awal hingga selesai. Perbedaan perilaku mode lokal terhadap cluster terdistribusi dibahas di akhir, ditambah beberapa kesalahan pemahaman yang sering muncul.

Tiga peran dalam satu aplikasi#

Setiap aplikasi Spark terdiri atas dua jenis proses dengan tugas berbeda, yaitu satu driver dan banyak executor. Driver menjalankan fungsi utama program, membangun rencana komputasi, dan membagi pekerjaan menjadi potongan yang dapat dikirim. Executor menjalankan potongan pekerjaan yang disebut task atas potongan data yang disebut partisi. Keduanya diperkenalkan oleh komponen ketiga bernama cluster manager, yaitu layanan yang mengatur penggunaan mesin pada cluster.

Cluster manager mengenal seluruh mesin yang tersedia dan memberikan sebagian di antaranya kepada aplikasi yang meminta. Contoh cluster manager yang umum digunakan adalah YARN, Kubernetes, dan standalone, yaitu cluster manager bawaan Spark. Driver tidak perlu mengetahui mesin mana yang dipilih, cukup mengetahui bahwa ada executor yang siap menerima perintah. Pemisahan ini membuat aplikasi Spark tidak perlu diubah ketika cluster managernya berganti.

Diagram berikut merangkum ketiga peran beserta arah percakapan yang terjadi saat aplikasi dimulai.

DriverSparkSession, DAG, dan penjadwalan taskmendaftar aplikasiCluster managerYARN, Kubernetes, atau standalonealokasi executormengirim taskmelaporkan hasilExecutor 1Executor 2Executor 3
Arsitektur Spark: driver, cluster manager, dan executor

Kotak driver berada di puncak karena seluruh keputusan komputasi lahir di sana. Panah dari driver ke cluster manager membawa pendaftaran aplikasi beserta permintaan resource, sedangkan panah dari cluster manager ke bawah menunjukkan alokasi executor tempat task benar-benar berjalan. Dua garis putus-putus di sisi kiri dan kanan menggambarkan alur kerja sesungguhnya, yaitu driver mengirim task ke executor dan executor melaporkan hasil kembali ke driver. Kotak executor di baris bawah mewakili mesin pekerja, yang jumlahnya pada cluster nyata bisa mencapai ratusan.

Percakapan sebuah job dari ujung ke ujung#

Percakapan dimulai ketika aplikasi Spark dijalankan, misalnya melalui perintah spark-submit. Proses driver dimulai, fungsi utama dieksekusi, dan SparkSession dibuat sebagai titik masuk. Pada saat yang sama, driver membangun DAG (directed acyclic graph), yakni graf berarah tanpa siklus yang menggambarkan urutan transformasi atas data. DAG inilah peta yang nantinya dipecah menjadi pekerjaan konkret.

Langkah-langkahnya secara ringkas adalah sebagai berikut.

  1. Driver mendaftarkan aplikasi ke cluster manager dan meminta resource.
  2. Cluster manager menjalankan executor pada mesin pekerja yang tersedia.
  3. Driver membagi DAG menjadi stage, yaitu kelompok task yang dapat berjalan tanpa pertukaran data antar mesin, lalu membuat task untuk setiap partisi.
  4. Driver mengirim task ke executor dan memantau pelaksanaannya.
  5. Executor menjalankan task atas partisinya dan melaporkan status atau hasilnya kembali ke driver.
  6. Setelah seluruh task selesai, driver menutup job dan melaporkan hasil akhirnya.

Percakapan seperti ini berulang untuk setiap job, sehingga satu aplikasi dapat menjalankan banyak job. Executor tidak dihentikan di antara dua job karena menyiapkan proses baru berbiaya besar, melainkan tetap berjalan sampai aplikasi diakhiri atau resource dicabut oleh cluster manager. Selama pelaksanaan, driver juga mencatat status tiap task dan mengganti task yang gagal dengan salinan task di executor lain.

Satu hal yang penting untuk dibedakan adalah letak kerja dan letak keputusan. Komputasi data seluruhnya terjadi di executor, sedangkan driver hanya menyusun rencana, membagi task, dan mengumpulkan status. Karena itu kapasitas driver tidak perlu sebesar total data yang diolah, cukup besar untuk menyimpan rencana serta hasil akhir yang kecil.

Mode lokal: seluruh peran dalam satu proses#

Mode lokal (local mode) memadatkan seluruh peran ke dalam satu proses JVM (Java virtual machine). Driver, cluster manager, dan executor berbagi proses yang sama, dan executor tidak lagi berupa proses terpisah melainkan sekelompok thread, yaitu unit eksekusi terkecil di dalam JVM. Penanda local[2] pada SparkSession berarti dua thread pemroses dibuat di dalam JVM itu. Panah pada diagram sebelumnya tetap sah secara logika, hanya saja jaraknya menjadi panggilan internal proses yang sama.

Mode lokal adalah mode yang lazim untuk belajar dan untuk menguji kebenaran logika. Program yang ditulis pada mode lokal berpindah ke cluster tanpa perubahan logika, cukup dengan mengganti penanda master dan mengirim aplikasi melalui spark-submit. Yang berubah secara mendasar adalah topologi, yaitu jumlah mesin, besaran memori, dan jaringan di antaranya.

Batas mode lokal perlu dipahami sejak awal. Kinerja yang diukur pada satu komputer tidak mewakili kinerja cluster karena partisi, paralelisme, dan biaya jaringan belum berperan. Mode lokal juga menaruh seluruh beban pada satu komputer, sehingga data yang diolah tetap dibatasi oleh mesin itu. Kedua batas itu wajar, sebab tujuan mode lokal adalah kebenaran logika, bukan pengukuran kinerja.

Kesalahan umum#

Kesalahan pertama adalah menganggap cluster manager ikut mengolah data. Komponen yang mengeksekusi transformasi hanyalah executor, sedangkan cluster manager menyediakan dan mencabut resource. Akibat kekeliruan ini, upaya penyetelan sering diarahkan ke tempat yang salah, misalnya menambah mesin pada cluster padahal hambatannya ada pada jumlah partisi. Perbaikannya adalah mengingat pembagian tugas pada diagram, yaitu resource dari cluster manager dan komputasi dari executor.

Kesalahan kedua adalah menarik data besar ke driver dengan collect(). Driver memiliki memori terbatas, sehingga hasil yang melebihi kapasitasnya berakhir dengan error OutOfMemoryError dan aplikasi mati. Data sebaiknya diolah di executor sampai hasilnya benar-benar kecil, misalnya melalui agregasi, sebelum ditarik ke driver.

Kesalahan ketiga adalah menyamakan hasil pengukuran mode lokal dengan cluster. Jumlah core, memori, dan jaringan yang berbeda membuat rencana yang cepat pada satu komputer bisa lambat di cluster, begitu pula sebaliknya. Mode lokal digunakan untuk memastikan logika benar, sedangkan kinerja diukur pada cluster yang sebenarnya dengan data yang sebanding.

Ringkasan#

  • Driver menjalankan program, membangun DAG, dan menjadwalkan task.
  • Cluster manager mengalokasikan resource dan menjalankan executor atas permintaan driver.
  • Executor mengeksekusi task per partisi dan melaporkan hasilnya kembali ke driver.
  • Pada mode lokal, ketiga peran berbagi satu proses JVM yang sama.

Referensi#