Tutorial: Arsitektur dan cluster aplikasi Spark

Dapatkan buku lengkapnya
Analisis Data dengan Spark Menggunakan Python (Seri Addison-Wesley Data & Analytics) MSRP $ 44,99 Lihat

Artikel ini adalah kutipan dari buku Pearson Addison-Wesley "Analisis Data dengan Spark Menggunakan Python" oleh Jeffrey Aven. Dicetak ulang di sini dengan izin dari Pearson © 2018. Untuk informasi lebih lanjut, kunjungi informit.com/aven/infoworld.

Sebelum memulai perjalanan Anda sebagai programmer Apache Spark, Anda harus memiliki pemahaman yang kuat tentang arsitektur aplikasi Spark dan bagaimana aplikasi dijalankan pada cluster Spark. Artikel ini membahas dengan cermat komponen aplikasi Spark, melihat bagaimana komponen ini bekerja bersama, dan melihat bagaimana aplikasi Spark berjalan di kluster mandiri dan YARN.

Anatomi aplikasi Spark

Aplikasi Spark berisi beberapa komponen, yang semuanya ada baik Anda menjalankan Spark di satu mesin atau di sekumpulan ratusan atau ribuan node.

Setiap komponen memiliki peran khusus dalam menjalankan program Spark. Beberapa peran ini, seperti komponen klien, bersifat pasif selama eksekusi; peran lain aktif dalam menjalankan program, termasuk komponen yang menjalankan fungsi komputasi.

Komponen aplikasi Spark adalah:

  • supir
  • sang master
  • manajer cluster
  • pelaksana

Semuanya berjalan di node pekerja, alias pekerja.

Gambar 1 menunjukkan semua komponen Spark dalam konteks aplikasi mandiri Spark.

Pearson Addison-Wesley

Semua komponen Spark — termasuk proses driver, master, dan eksekutor — berjalan di mesin virtual Java. JVM adalah mesin runtime lintas platform yang dapat menjalankan instruksi yang dikompilasi ke dalam bytecode Java. Scala, tempat Spark ditulis, dikompilasi menjadi bytecode dan berjalan di JVM.

Penting untuk membedakan antara komponen aplikasi runtime Spark dan lokasi serta jenis node tempat komponen tersebut dijalankan. Komponen ini berjalan di tempat yang berbeda menggunakan mode penerapan yang berbeda, jadi jangan pikirkan komponen ini dalam node fisik atau istilah instance. Misalnya, saat menjalankan Spark di YARN, akan ada beberapa variasi dari Gambar 1. Namun, semua komponen yang digambarkan masih terlibat dalam aplikasi dan memiliki peran yang sama.

Pengemudi percikan

Masa pakai aplikasi Spark dimulai dan diakhiri dengan driver Spark. Pengemudi adalah proses yang digunakan klien untuk mengirimkan aplikasi di Spark. Pengemudi juga bertanggung jawab untuk merencanakan dan mengkoordinasikan pelaksanaan program Spark dan mengembalikan status dan / atau hasil (data) ke klien. Pengemudi secara fisik dapat berada di klien atau di node di cluster, seperti yang akan Anda lihat nanti.

SparkSession

Pengemudi Spark bertanggung jawab untuk membuat SparkSession. Objek SparkSession mewakili koneksi ke cluster Spark. SparkSession dibuat di awal aplikasi Spark, termasuk shell interaktif, dan digunakan untuk keseluruhan program.

Sebelum Spark 2.0, titik masuk untuk aplikasi Spark termasuk SparkContext, digunakan untuk aplikasi inti Spark; SQLContext dan HiveContext, digunakan dengan aplikasi Spark SQL; dan StreamingContext, digunakan untuk aplikasi Spark Streaming. Objek SparkSession yang diperkenalkan di Spark 2.0 menggabungkan semua objek ini menjadi satu titik masuk yang dapat digunakan untuk semua aplikasi Spark.

Melalui objek turunan SparkContext dan SparkConf, objek SparkSession berisi semua properti konfigurasi waktu proses yang disetel oleh pengguna, termasuk properti konfigurasi seperti master, nama aplikasi, dan jumlah pelaksana. Gambar 2 menunjukkan objek SparkSession dan beberapa properti konfigurasinya di pysparkshell.

Pearson Addison-Wesley

Nama SparkSession

Nama objek untuk instance SparkSession bersifat arbitrer. Secara default, Instansiasi SparkSession di shell interaktif Spark diberi nama spark. Untuk konsistensi, Anda selalu membuat instance SparkSession sebagai spark; Namun, nama terserah pada kebijaksanaan pengembang.

Kode di bawah ini menunjukkan cara membuat SparkSession di aplikasi Spark noninteraktif, seperti program yang dikirimkan menggunakan spark-submit.

dari pyspark.sql impor SparkSession

spark = SparkSession.builder \

  .master ("spark: // sparkmaster: 7077") \

  .appName ("Aplikasi Spark Saya") \

  .config ("spark.submit.deployMode", "client") \

  .getOrCreate ()

numlines = spark.sparkContext.textFile ("file: /// opt / spark / licenses") \

  .menghitung()

print ("Jumlah baris adalah" + str (numlines))

Perencanaan aplikasi

Salah satu fungsi utama pengemudi adalah merencanakan aplikasi. Pengemudi mengambil input pemrosesan aplikasi dan merencanakan eksekusi program. Driver mengambil semua transformasi yang diminta (operasi manipulasi data) dan tindakan (permintaan untuk keluaran atau perintah untuk menjalankan program) dan membuat grafik asiklik terarah (DAG) dari node, masing-masing mewakili langkah transformasional atau komputasi.

Grafik asiklik terarah (DAG)

DAG adalah konstruksi matematika yang umum digunakan dalam ilmu komputer untuk merepresentasikan aliran data dan ketergantungannya. DAG mengandung simpul (atau simpul) dan tepi. Simpul dalam konteks aliran data adalah langkah-langkah dalam aliran proses. Tepi dalam DAG menghubungkan simpul satu sama lain dalam orientasi terarah dan sedemikian rupa sehingga tidak mungkin memiliki referensi melingkar.

Aplikasi Spark DAG terdiri dari tugas dan tahapan . Tugas adalah unit terkecil dari pekerjaan yang dapat dijadwalkan dalam program Spark. Dekor adalah sekumpulan tugas yang bisa dijalankan bersama. Tahapannya bergantung satu sama lain; dengan kata lain, ada ketergantungan tahapan .

Dalam pengertian penjadwalan proses, DAG tidak unik untuk Spark. Misalnya, mereka digunakan dalam proyek ekosistem data besar lainnya, seperti Tez, Drill, dan Presto untuk penjadwalan. DAG sangat penting bagi Spark, jadi sebaiknya Anda memahami konsepnya.

Orkestrasi aplikasi

Pengemudi juga mengoordinasikan jalannya tahapan dan tugas yang ditentukan di DAG. Aktivitas pendorong utama yang terlibat dalam penjadwalan dan menjalankan tugas meliputi berikut ini:

  • Melacak sumber daya yang tersedia untuk menjalankan tugas.
  • Penjadwalan tugas untuk menjalankan "dekat" dengan data jika memungkinkan (konsep lokalitas data).

Fungsi lainnya

Selain merencanakan dan mengatur pelaksanaan program Spark, pengemudi juga bertanggung jawab untuk mengembalikan hasil dari aplikasi. Ini bisa berupa kode pengembalian atau data dalam kasus tindakan yang meminta data dikembalikan ke klien (misalnya, kueri interaktif).

Driver juga melayani UI aplikasi pada port 4040, seperti yang ditunjukkan pada Gambar 3. UI ini dibuat secara otomatis; itu tidak tergantung pada kode yang dikirimkan atau bagaimana kode itu dikirimkan (yaitu, penggunaan interaktif pyspark atau penggunaan non- interaktif spark-submit).

Pearson Addison-Wesley

Jika aplikasi berikutnya diluncurkan pada host yang sama, port berurutan digunakan untuk UI aplikasi (misalnya, 4041, 4042, dan seterusnya).

Bangkitkan pekerja dan pelaksana

Eksekutor Spark adalah proses yang menjalankan tugas-tugas Spark DAG. pelaksana memesan CPU dan sumber daya memori pada node budak, atau pekerja, di cluster Spark. Eksekutor didedikasikan untuk aplikasi Spark tertentu dan diakhiri ketika aplikasi selesai. Program Spark biasanya terdiri dari banyak pelaksana, seringkali bekerja secara paralel.

Biasanya, node pekerja — yang menghosting proses eksekutor — memiliki sejumlah eksekutor yang terbatas atau tetap yang dialokasikan pada titik waktu mana pun. Oleh karena itu, cluster — menjadi sejumlah node yang diketahui — memiliki jumlah eksekutor terbatas yang tersedia untuk dijalankan pada waktu tertentu. Jika sebuah aplikasi memerlukan pelaksana yang melebihi kapasitas fisik kluster, mereka dijadwalkan untuk mulai saat pelaksana lain menyelesaikan dan melepaskan sumber daya mereka.

Seperti disebutkan sebelumnya, JVM menjadi host pelaksana Spark. JVM untuk eksekutor dialokasikan pada heap , yang merupakan ruang memori khusus untuk menyimpan dan mengelola objek.

Jumlah memori berkomitmen untuk tumpukan JVM untuk pelaksana diatur oleh properti spark.executor.memoryatau sebagai --executor-memoryargumen ke pyspark, spark-shellatau spark-submitperintah.

Pelaksana menyimpan data keluaran dari tugas di memori atau di disk. Penting untuk dicatat bahwa pekerja dan pelaksana hanya mengetahui tugas yang dialokasikan untuk mereka, sedangkan pengemudi bertanggung jawab untuk memahami set lengkap tugas dan dependensi masing-masing yang menyusun aplikasi.

Dengan menggunakan UI aplikasi Spark pada port 404 x dari host driver, Anda dapat memeriksa eksekutor untuk aplikasi tersebut, seperti yang ditunjukkan pada Gambar 4.

Pearson Addison-Wesley

Untuk penerapan kluster mandiri Spark, node pekerja memperlihatkan antarmuka pengguna di port 8081, seperti yang ditunjukkan pada Gambar 5.

Pearson Addison-Wesley

Master Spark dan manajer cluster

Pengemudi Spark merencanakan dan mengoordinasikan serangkaian tugas yang diperlukan untuk menjalankan aplikasi Spark. Tugas itu sendiri dijalankan di eksekutor, yang dihosting di node pekerja.

Master dan manajer klaster adalah proses pusat yang memantau, mencadangkan, dan mengalokasikan sumber daya klaster terdistribusi (atau kontainer, dalam kasus YARN atau Mesos) di mana eksekutor dijalankan. Master dan manajer cluster dapat menjadi proses yang terpisah, atau keduanya dapat digabungkan menjadi satu proses, seperti yang terjadi saat menjalankan Spark dalam mode mandiri.

Spark master

Master Spark adalah proses yang meminta sumber daya di cluster dan membuatnya tersedia untuk driver Spark. Dalam semua mode penerapan, master menegosiasikan sumber daya atau kontainer dengan node pekerja atau node budak dan melacak statusnya serta memantau kemajuannya.

Saat menjalankan Spark dalam mode Standalone, proses master Spark menyajikan UI web pada port 8080 pada host master, seperti yang ditunjukkan pada Gambar 6.

Pearson Addison-Wesley

Master percikan versus pengemudi Spark

Penting untuk membedakan fungsi runtime dari driver dan master. Nama master dapat disimpulkan bahwa proses ini mengatur pelaksanaan aplikasi — tetapi bukan ini masalahnya. Master hanya meminta sumber daya dan membuat sumber daya tersebut tersedia untuk pengemudi. Meskipun master memantau status dan kesehatan sumber daya ini, ia tidak terlibat dalam pelaksanaan aplikasi dan koordinasi tugas dan tahapannya. Itu adalah tugas pengemudi.

Manajer cluster

Manajer cluster adalah proses yang bertanggung jawab untuk memantau node pekerja dan memesan sumber daya pada node ini berdasarkan permintaan master. Master kemudian membuat sumber cluster ini tersedia untuk driver dalam bentuk eksekutor.

Seperti disebutkan sebelumnya, manajer cluster dapat dipisahkan dari proses master. Ini adalah kasus saat menjalankan Spark di Mesos atau YARN. Dalam kasus Spark yang berjalan dalam mode mandiri, proses master juga menjalankan fungsi manajer kluster. Secara efektif, ini bertindak sebagai manajer klasternya sendiri.

Contoh yang baik dari fungsi manajer klaster adalah proses YARN ResourceManager untuk aplikasi Spark yang berjalan di kluster Hadoop. ResourceManager menjadwalkan, mengalokasikan, dan memantau kesehatan container yang berjalan di YARN NodeManagers. Aplikasi Spark kemudian menggunakan kontainer ini untuk menghosting proses eksekutor, serta proses master jika aplikasi berjalan dalam mode cluster.

Percikan aplikasi menggunakan penjadwal mandiri

Di Bab 2, “Menerapkan Spark,” saya menjelaskan penjadwal mandiri sebagai opsi penerapan untuk Spark. Di sana, saya menerapkan cluster mandiri Spark multinode yang berfungsi penuh di salah satu latihan di Bab 2. Seperti disebutkan sebelumnya, dalam cluster Spark yang berjalan dalam mode mandiri, proses master Spark juga menjalankan fungsi manajer cluster, mengatur sumber daya yang tersedia di cluster dan memberikannya ke proses master untuk digunakan dalam aplikasi Spark.

Aplikasi Spark yang berjalan di YARN

Hadoop adalah platform penerapan yang sangat populer dan umum untuk Spark. Beberapa pakar industri percaya bahwa Spark akan segera menggantikan MapReduce sebagai platform pemrosesan utama untuk aplikasi di Hadoop. Aplikasi Spark di YARN berbagi arsitektur runtime yang sama tetapi memiliki sedikit perbedaan dalam implementasinya.

ResourceManager sebagai manajer cluster

Berbeda dengan Penjadwal mandiri, manajer cluster dalam cluster YARN adalah YARN ResourceManager. ResourceManager memantau penggunaan dan ketersediaan sumber daya di semua node dalam cluster. Klien mengirimkan aplikasi Spark ke YARN ResourceManager. ResourceManager mengalokasikan wadah pertama untuk aplikasi, wadah khusus yang disebut ApplicationMaster.

ApplicationMaster sebagai master Spark

ApplicationMaster adalah proses master Spark. Seperti yang dilakukan proses master dalam penerapan klaster lain, ApplicationMaster merundingkan sumber daya antara pengandar aplikasi dan manajer klaster (atau ResourceManager dalam kasus ini); kemudian membuat sumber daya ini (wadah) tersedia untuk driver untuk digunakan sebagai pelaksana untuk menjalankan tugas dan menyimpan data untuk aplikasi.

ApplicationMaster tetap digunakan selama masa pakai aplikasi.

Mode penyebaran untuk aplikasi Spark yang berjalan di YARN

Dua mode penerapan dapat digunakan saat mengirimkan aplikasi Spark ke cluster YARN: mode klien dan mode cluster. Mari kita lihat sekarang.

Mode klien

Dalam mode klien, proses pengandar berjalan pada klien yang mengirimkan aplikasi. Ini pada dasarnya tidak dikelola; jika driver host gagal, aplikasi gagal. Modus klien didukung untuk kedua sesi shell interaktif ( pyspark, spark-shell, dan sebagainya) dan pengajuan aplikasi noninteractive ( spark-submit). Kode di bawah ini menunjukkan cara memulai pysparksesi menggunakan mode penerapan klien.

$ SPARK_HOME / bin / pyspark \

--master yarn-client \

--num-eksekutor 1 \

--driver-memory 512m \

--executor-memory 512m \

--executor-core 1

# ATAU

$ SPARK_HOME / bin / pyspark \

- benang master \

--deploy-mode client \

--num-eksekutor 1 \

--driver-memory 512m \

--executor-memory 512m \

--executor-core 1

Gambar 7 memberikan gambaran umum tentang aplikasi Spark yang berjalan di YARN dalam mode klien.

Pearson Addison-Wesley

Langkah-langkah yang ditunjukkan pada Gambar 7 adalah:

  1. Klien mengirimkan aplikasi Spark ke manajer cluster (YARN ResourceManager). Proses driver, SparkSession, dan SparkContext dibuat dan dijalankan di klien.
  2. ResourceManager menetapkan ApplicationMaster (master Spark) untuk aplikasi tersebut.
  3. ApplicationMaster meminta kontainer untuk digunakan sebagai pelaksana dari ResourceManager. Dengan wadah yang ditetapkan, pelaksana menelurkan.
  4. Pengemudi, terletak di klien, kemudian berkomunikasi dengan pelaksana untuk marshal pemrosesan tugas dan tahapan program Spark. Pengemudi mengembalikan kemajuan, hasil, dan status ke klien.

Mode penerapan klien adalah mode paling sederhana untuk digunakan. Namun, itu tidak memiliki ketahanan yang dibutuhkan untuk sebagian besar aplikasi produksi.

Mode cluster

Berbeda dengan mode penerapan klien, dengan aplikasi Spark yang berjalan dalam mode Cluster YARN, driver itu sendiri berjalan di cluster sebagai subproses dari ApplicationMaster. Ini memberikan ketahanan: Jika proses ApplicationMaster yang menghosting driver gagal, itu dapat dibuat ulang di node lain di cluster.

Kode di bawah ini menunjukkan cara mengirimkan aplikasi dengan menggunakan spark-submitdan mode penyebaran cluster YARN. Karena driver adalah proses asynchronous yang berjalan di cluster, mode cluster tidak didukung untuk aplikasi shell interaktif ( pysparkdan spark-shell).

$ SPARK_HOME / bin / spark-submit \

--master benang-cluster \

--num-eksekutor 1 \

--driver-memory 512m \

--executor-memory 512m \

--executor-core 1

$ SPARK_HOME / example / src / main / python / pi.py 10000

# ATAU

- benang master \

--deploy-mode cluster \

--num-eksekutor 1 \

--driver-memory 512m \

--executor-memory 512m \

--executor-core 1

$ SPARK_HOME / example / src / main / python / pi.py 10000

Gambar 8 memberikan gambaran umum tentang aplikasi Spark yang berjalan di YARN dalam mode cluster.

Pearson Addison-Wesley

Langkah-langkah yang ditunjukkan pada Gambar 8 adalah:

  1. Klien, proses pengguna yang memanggil spark-submit, mengirimkan aplikasi Spark ke manajer cluster (YARN ResourceManager).
  2. ResourceManager menetapkan ApplicationMaster (master Spark) untuk aplikasi tersebut. Proses pengandar dibuat pada node cluster yang sama.
  3. ApplicationMaster meminta kontainer untuk pelaksana dari ResourceManager. eksekutor muncul dalam container yang dialokasikan ke ApplicationMaster oleh ResourceManager. Pengemudi kemudian berkomunikasi dengan pelaksana untuk marshal pemrosesan tugas dan tahapan program Spark.
  4. Pengemudi, yang berjalan pada sebuah node di cluster, mengembalikan kemajuan, hasil, dan status ke klien.

UI web aplikasi Spark, seperti yang ditampilkan sebelumnya, tersedia dari host ApplicationMaster di cluster; tautan ke antarmuka pengguna ini tersedia dari YARN ResourceManager UI.

Modus lokal ditinjau kembali

Dalam mode lokal, driver, master, dan pelaksana semuanya berjalan dalam satu JVM. Seperti disebutkan sebelumnya dalam bab ini, ini berguna untuk pengembangan, pengujian unit, dan debugging, tetapi penggunaannya terbatas untuk menjalankan aplikasi produksi karena tidak didistribusikan dan tidak diskalakan. Selain itu, tugas yang gagal dalam aplikasi Spark yang berjalan dalam mode lokal tidak dijalankan ulang secara default. Namun, Anda dapat mengganti perilaku ini.

Saat menjalankan Spark dalam mode lokal, UI aplikasi tersedia di // localhost: 4040. UI master dan pekerja tidak tersedia saat berjalan dalam mode lokal.