Menurut Learning Spark
Ingatlah bahwa mempartisi ulang data Anda adalah operasi yang cukup mahal. Spark juga memiliki versi yang
repartition()
dipanggilcoalesce()
yang dioptimalkan yang memungkinkan menghindari perpindahan data, tetapi hanya jika Anda mengurangi jumlah partisi RDD.
Satu perbedaan yang saya dapatkan adalah bahwa dengan repartition()
jumlah partisi dapat ditingkatkan / dikurangi, tetapi dengan coalesce()
jumlah partisi hanya dapat dikurangi.
Jika partisi tersebar di beberapa mesin dan coalesce()
dijalankan, bagaimana bisa menghindari pergerakan data?
sumber
minimize data movement
daripadaavoiding data movement
.repartition
harus digunakan, bukancoalesce
?repartition
dilakukan adalah panggilancoalesce
denganshuffle
parameter yang disetel ke true. Beri tahu saya jika itu membantu.shuffle = true
benderaJawaban Justin luar biasa dan tanggapan ini masuk lebih dalam.
The
repartition
algoritma tidak shuffle penuh dan menciptakan partisi baru dengan data yang merata. Mari kita membuat DataFrame dengan angka dari 1 hingga 12.numbersDf
berisi 4 partisi di mesin saya.Berikut adalah cara membagi data pada partisi:
Mari kita lakukan shuffle penuh dengan
repartition
metode ini dan dapatkan data ini pada dua node.Berikut adalah bagaimana
numbersDfR
data dipartisi di mesin saya:The
repartition
Metode membuat partisi baru dan merata mendistribusikan data dalam partisi baru (distribusi data lebih bahkan untuk set data yang lebih besar).Perbedaan antara
coalesce
danrepartition
coalesce
menggunakan partisi yang ada untuk meminimalkan jumlah data yang dikocok.repartition
membuat partisi baru dan melakukan pengocokan penuh.coalesce
menghasilkan partisi dengan jumlah data yang berbeda (kadang-kadang partisi yang memiliki ukuran yang jauh berbeda) danrepartition
menghasilkan partisi berukuran kurang lebih sama.Apakah
coalesce
ataurepartition
lebih cepat?coalesce
mungkin berjalan lebih cepat daripadarepartition
, tetapi partisi berukuran tidak sama umumnya lebih lambat untuk bekerja dengan dari partisi berukuran sama. Anda biasanya perlu mempartisi ulang dataset setelah memfilter kumpulan data besar. Saya menemukanrepartition
keseluruhan lebih cepat karena Spark dibuat untuk bekerja dengan partisi berukuran sama.NB Saya dengan anehnya mengamati bahwa partisi ulang dapat meningkatkan ukuran data pada disk . Pastikan untuk menjalankan tes saat Anda menggunakan partisi ulang / penggabungan pada kumpulan data besar.
Baca posting blog ini jika Anda ingin lebih detail.
Ketika Anda akan menggunakan gabungan & partisi dalam praktek
sumber
rdd.glom().map(len).collect()
tetapi memberikan banyak kesalahan OOM.repartition
algoritme tidak mendistribusikan data secara merata untuk kumpulan data yang sangat kecil. Saya biasarepartition
mengatur 5 juta catatan menjadi 13 partisi dan setiap file antara 89,3 MB dan 89,6 MB - itu cukup sama!Satu hal tambahan yang perlu diperhatikan di sini adalah, karena prinsip dasar Spark RDD adalah ketetapan. Partisi ulang atau penggabungan akan membuat RDD baru. Basis RDD akan terus memiliki jumlah partisi aslinya. Jika use case menuntut untuk tetap menggunakan RDD dalam cache, maka hal yang sama harus dilakukan untuk RDD yang baru dibuat.
sumber
repartition
- disarankan untuk menggunakannya sambil meningkatkan jumlah partisi, karena ini melibatkan pengocokan semua data.coalesce
- disarankan untuk menggunakannya sambil mengurangi jumlah partisi. Misalnya jika Anda memiliki 3 partisi dan Anda ingin menguranginya menjadi 2,coalesce
akan memindahkan data partisi ke-3 ke partisi 1 dan 2. Partisi 1 dan 2 akan tetap berada di wadah yang sama. Di sisi lain,repartition
akan mengocok data di semua partisi, oleh karena itu penggunaan jaringan antara para pelaksana akan tinggi dan itu akan berdampak pada kinerja.coalesce
berkinerja lebih baik daripadarepartition
mengurangi jumlah partisi.sumber
Apa yang mengikuti dari kode dan kode dokumen adalah
coalesce(n)
sama dengancoalesce(n, shuffle = false)
danrepartition(n)
sama dengancoalesce(n, shuffle = true)
Dengan demikian, keduanya
coalesce
danrepartition
dapat digunakan untuk menambah jumlah partisiCatatan penting lain yang perlu ditekankan adalah bahwa jika Anda secara drastis mengurangi jumlah partisi Anda harus mempertimbangkan untuk menggunakan versi shuffled
coalesce
(sama sepertirepartition
dalam kasus itu). Ini akan memungkinkan perhitungan Anda dilakukan secara paralel pada partisi induk (banyak tugas).Lihat juga jawaban terkait di sini
sumber
Semua jawaban menambahkan beberapa pengetahuan hebat ke dalam pertanyaan yang sangat sering ditanyakan ini.
Jadi mengikuti tradisi garis waktu pertanyaan ini, berikut adalah 2 sen saya.
Saya menemukan partisi ulang lebih cepat daripada penggabungan , dalam kasus yang sangat spesifik.
Dalam aplikasi saya ketika jumlah file yang kami perkirakan lebih rendah dari ambang tertentu, partisi ulang bekerja lebih cepat.
Inilah yang saya maksud
Dalam cuplikan di atas, jika file saya kurang dari 20, penggabungan berlangsung selamanya untuk diselesaikan sementara partisi ulang jauh lebih cepat dan demikian juga kode di atas.
Tentu saja, angka ini (20) akan tergantung pada jumlah pekerja dan jumlah data.
Semoga itu bisa membantu.
sumber
Partisi ulang : Kocok data menjadi sejumlah partisi BARU.
Misalnya. Bingkai data awal dipartisi dalam 200 partisi.
df.repartition(500)
: Data akan diacak dari 200 partisi menjadi 500 partisi baru.Penggabungan : Kocok data menjadi jumlah partisi yang ada.
df.coalesce(5)
: Data akan dikocok dari 195 partisi tersisa menjadi 5 partisi yang ada.sumber
Saya ingin menambahkan jawaban Justin dan Power bahwa -
repartition
akan mengabaikan partisi yang ada dan membuat yang baru. Jadi Anda bisa menggunakannya untuk memperbaiki kemiringan data. Anda bisa menyebutkan kunci partisi untuk menentukan distribusi. Kemiringan data adalah salah satu masalah terbesar dalam ruang masalah 'data besar'.coalesce
akan bekerja dengan partisi yang ada dan mengacak sebagiannya. Itu tidak dapat memperbaiki kemiringan data sebanyakrepartition
halnya. Karena itu, bahkan jika lebih murah, itu mungkin bukan hal yang Anda butuhkan.sumber
Untuk semua jawaban hebat yang ingin saya tambahkan itu
repartition
adalah salah satu pilihan terbaik untuk memanfaatkan paralelisasi data. Meskipuncoalesce
memberikan opsi yang murah untuk mengurangi partisi dan sangat berguna ketika menulis data ke HDFS atau wastafel lain untuk mengambil keuntungan dari penulisan besar.Saya menemukan ini berguna ketika menulis data dalam format parket untuk mendapatkan keuntungan penuh.
sumber
Untuk seseorang yang memiliki masalah menghasilkan file csv tunggal dari PySpark (AWS EMR) sebagai output dan menyimpannya di s3, menggunakan partisi ulang membantu. Alasannya, menyatu tidak bisa melakukan shuffle penuh, tetapi partisi ulang bisa. Pada dasarnya, Anda dapat menambah atau mengurangi jumlah partisi menggunakan partisi ulang, tetapi hanya dapat mengurangi jumlah partisi (tetapi tidak 1) menggunakan gabungan. Ini adalah kode untuk siapa saja yang mencoba menulis csv dari AWS EMR ke s3:
sumber
Dengan cara sederhana COALESCE: - hanya untuk mengurangi jumlah partisi, Tidak ada pengocokan data, itu hanya mengkompres partisi
REPARTISI: - adalah untuk menambah dan mengurangi no dari partisi, Tetapi terjadi pengocokan
Contoh:-
Keduanya bekerja dengan baik
Tapi kita biasanya pergi untuk dua hal ini ketika kita perlu melihat output dalam satu cluster, kita pergi dengan ini.
sumber
Tetapi Anda juga harus memastikan bahwa, data yang akan datang menyatu node harus sangat dikonfigurasi, jika Anda berurusan dengan data besar. Karena semua data akan dimuat ke node tersebut, dapat menyebabkan memori terkecuali. Meskipun reparasi itu mahal, saya lebih suka menggunakannya. Karena itu mengocok dan mendistribusikan data secara merata.
Bijaksana untuk memilih antara penggabungan dan partisi ulang.
sumber
The
repartition
algoritma melakukan mengocok penuh data dan menciptakan partisi berukuran sama data.coalesce
menggabungkan partisi yang ada untuk menghindari pengocokan penuh.Coalesce bekerja dengan baik untuk mengambil RDD dengan banyak partisi dan menggabungkan partisi pada node pekerja tunggal untuk menghasilkan RDD akhir dengan lebih sedikit partisi.
Repartition
akan merombak data dalam RDD Anda untuk menghasilkan jumlah partisi terakhir yang Anda minta. Pemartisian DataFrames tampak seperti detail implementasi tingkat rendah yang harus dikelola oleh kerangka kerja, tetapi tidak. Saat memfilter DataFrame besar menjadi yang lebih kecil, Anda harus selalu selalu mempartisi data. Anda mungkin akan memfilter DataFrame besar menjadi yang lebih kecil sering, jadi biasakan untuk melakukan partisi ulang.Baca posting blog ini jika Anda ingin lebih detail.
sumber