Saya mencoba memahami hubungan jumlah core dan jumlah eksekutor ketika menjalankan pekerjaan Spark di BENANG.
Lingkungan pengujian adalah sebagai berikut:
- Jumlah node data: 3
- Spesifikasi mesin simpul data:
- CPU: Core i7-4790 (# core: 4, # utas: 8)
- RAM: 32GB (8GB x 4)
- HDD: 8TB (2TB x 4)
Jaringan: 1Gb
Versi percikan: 1.0.0
Versi Hadoop: 2.4.0 (Hortonworks HDP 2.1)
Alur pekerjaan percikan: sc.textFile -> filter -> map -> filter -> mapToPair -> kurangiByKey -> map -> saveAsTextFile
Memasukan data
- Ketik: file teks tunggal
- Ukuran: 165GB
- Jumlah baris: 454.568.833
Keluaran
- Jumlah baris setelah filter kedua: 310.640.717
- Jumlah baris file hasil: 99.848.268
- Ukuran file hasil: 41GB
Pekerjaan dijalankan dengan konfigurasi berikut:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(pelaksana per simpul data, gunakan sebanyak inti)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(# core berkurang)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(kurang inti, lebih banyak eksekutor)
Waktu yang berlalu:
50 mnt 15 dtk
55 mnt 48 dtk
31 mnt 23 dtk
Yang mengejutkan saya, (3) jauh lebih cepat.
Saya berpikir bahwa (1) akan lebih cepat, karena akan ada lebih sedikit komunikasi antar-pelaksana saat pengocokan.
Meskipun # core dari (1) lebih kecil dari (3), #of core bukanlah faktor kunci karena 2) berkinerja baik.
(Berikut ini ditambahkan setelah jawaban pwilmot.)
Sebagai informasi, tangkapan layar monitor kinerja adalah sebagai berikut:
- Ringkasan simpul data ganglia untuk (1) - pekerjaan dimulai pada 04:37.
- Ringkasan simpul data ganglia untuk (3) - pekerjaan dimulai pada 19:47. Harap abaikan grafik sebelum waktu itu.
Grafik secara kasar dibagi menjadi 2 bagian:
- Pertama: dari mulai hingga mengurangiByKey: CPU intensif, tidak ada aktivitas jaringan
- Kedua: setelah mengurangiByKey: CPU lebih rendah, jaringan I / O selesai.
Seperti yang ditunjukkan grafik, (1) dapat menggunakan daya CPU sebanyak yang diberikan. Jadi, mungkin bukan masalah jumlah utas.
Bagaimana cara menjelaskan hasil ini?
sumber
Jawaban:
Penjelasannya diberikan dalam sebuah artikel di blog Cloudera, How-to: Tune Your Apache Spark Jobs (Bagian 2) .
sumber
yarn.scheduler.capacity.resource-calculator
dinonaktifkan, yang merupakan default. Ini karena secara default itu menjadwalkan oleh Memori dan bukan oleh CPU.Saat Anda menjalankan aplikasi percikan Anda di atas HDFS, menurut Sandy Ryza
Jadi saya percaya bahwa konfigurasi pertama Anda lebih lambat dari yang ketiga adalah karena throughput HDFS I / O yang buruk
sumber
Saya belum bermain dengan pengaturan ini sendiri jadi ini hanya spekulasi tetapi jika kita menganggap masalah ini sebagai inti dan utas normal dalam sistem terdistribusi maka di kluster Anda, Anda dapat menggunakan hingga 12 inti (mesin 4 * 3) dan 24 utas (8 * 3 mesin). Dalam dua contoh pertama Anda, Anda memberikan pekerjaan Anda sejumlah inti (ruang komputasi potensial) tetapi jumlah utas (pekerjaan) untuk dijalankan pada inti tersebut sangat terbatas sehingga Anda tidak dapat menggunakan banyak daya pemrosesan yang dialokasikan dan dengan demikian pekerjaan lebih lambat meskipun ada lebih banyak sumber daya komputasi yang dialokasikan.
Anda menyebutkan bahwa kekhawatiran Anda adalah pada langkah acak - sementara itu bagus untuk membatasi overhead pada langkah acak itu umumnya jauh lebih penting untuk memanfaatkan paralelisasi cluster. Pikirkan tentang kasus ekstrim - program berulir tunggal dengan nol acak.
sumber
Saya pikir jawabannya di sini mungkin sedikit lebih sederhana daripada beberapa rekomendasi di sini.
Petunjuk bagi saya adalah dalam grafik jaringan cluster. Untuk menjalankan 1 pemanfaatannya stabil pada ~ 50 M byte / s. Untuk menjalankan 3 utilisasi stabil digandakan, sekitar 100 M byte / s.
Dari posting blog cloudera yang dibagikan oleh DzOrd , Anda dapat melihat kutipan penting ini:
Jadi, mari kita lakukan beberapa perhitungan untuk melihat kinerja apa yang kita harapkan jika itu benar.
Jalankan 1: 19 GB, 7 core, 3 eksekutor
Jalankan 3: 4 GB, 2 core, 12 pelaksana
Jika pekerjaan itu 100% dibatasi oleh konkurensi (jumlah utas). Kami perkirakan runtime akan berkorelasi terbalik sempurna dengan jumlah utas.
Jadi
ratio_num_threads ~= inv_ratio_runtime
, dan sepertinya jaringan kami terbatas.Efek yang sama ini menjelaskan perbedaan antara Run 1 dan Run 2.
Jalankan 2: 19 GB, 4 core, 3 eksekutor
Membandingkan jumlah utas efektif dan runtime:
Ini tidak sesempurna perbandingan terakhir, tapi kami masih melihat penurunan kinerja yang sama ketika kami kehilangan utas.
Sekarang untuk bagian terakhir: mengapa kita mendapatkan kinerja yang lebih baik dengan lebih banyak utas, khususnya. lebih banyak utas daripada jumlah CPU?
Penjelasan yang baik tentang perbedaan antara paralelisme (apa yang kita dapatkan dengan membagi data ke banyak CPU) dan konkurensi (apa yang kita dapatkan ketika kita menggunakan banyak utas untuk melakukan pekerjaan pada satu CPU) disediakan dalam pos yang luar biasa ini oleh Rob Pike: Concurrency bukan paralelisme .
Penjelasan singkatnya adalah bahwa jika pekerjaan Spark berinteraksi dengan sistem file atau jaringan CPU menghabiskan banyak waktu menunggu komunikasi dengan antarmuka tersebut dan tidak menghabiskan banyak waktu sebenarnya "melakukan pekerjaan". Dengan memberikan CPU lebih dari 1 tugas untuk dikerjakan sekaligus, mereka menghabiskan lebih sedikit waktu menunggu dan lebih banyak waktu untuk bekerja, dan Anda melihat kinerja yang lebih baik.
sumber
Dari sumber daya luar biasa yang tersedia di halaman paket Sparklyr RStudio :
sumber
Alokasi Spark Dinamis memberi fleksibilitas dan mengalokasikan sumber daya secara dinamis. Dalam jumlah ini, eksekutif minimum dan maksimum dapat diberikan. Juga jumlah pelaksana yang harus diluncurkan pada awal aplikasi juga dapat diberikan.
Baca di bawah ini pada yang sama:
sumber
Ada masalah kecil dalam dua konfigurasi pertama yang saya pikir. Konsep-konsep utas dan inti seperti berikut. Konsep threading adalah jika core ideal maka gunakan core itu untuk memproses data. Jadi memori tidak sepenuhnya digunakan dalam dua kasus pertama. Jika Anda ingin menandai contoh ini pilih mesin yang memiliki lebih dari 10 core pada setiap mesin. Kemudian lakukan tanda bench.
Tapi jangan memberikan lebih dari 5 core per pelaksana, akan ada neck bottle pada kinerja i / o.
Jadi mesin terbaik untuk melakukan penandaan bangku ini mungkin data node yang memiliki 10 core.
Spesifikasi mesin simpul data: CPU: Core i7-4790 (# inti: 10, # utas: 20) RAM: 32GB (8GB x 4) HDD: 8TB (2TB x 4)
sumber
Saya pikir salah satu alasan utama adalah lokalitas. Ukuran file input Anda adalah 165G, blok terkait file tersebut pasti didistribusikan lebih dari beberapa DataNodes, lebih banyak pelaksana dapat menghindari salinan jaringan.
Cobalah untuk mengatur jumlah blok sama dengan pelaksana, saya pikir bisa lebih cepat.
sumber