Saya selalu menganggap ini perlu karena output dari mapper adalah input untuk peredam, jadi itu diurutkan berdasarkan ruang kunci dan kemudian dibagi menjadi beberapa keranjang untuk setiap masukan peredam.
BasicHorizon
Jawaban:
171
Pertama-tama shufflingadalah proses mentransfer data dari pembuat peta ke pereduksi, jadi saya pikir sudah jelas bahwa pereduksi itu perlu, karena jika tidak, mereka tidak akan dapat memiliki masukan (atau masukan dari setiap pembuat peta) . Pengacakan dapat dimulai bahkan sebelum fase peta selesai, untuk menghemat waktu. Itulah mengapa Anda dapat melihat status pengurangan lebih besar dari 0% (tetapi kurang dari 33%) ketika status peta belum 100%.
Sortingmenghemat waktu untuk peredam, membantunya dengan mudah membedakan kapan tugas pengurangan baru harus dimulai. Ini hanya memulai tugas pengurangan baru, ketika kunci berikutnya dalam data masukan yang diurutkan berbeda dari sebelumnya, untuk membuatnya lebih sederhana. Setiap tugas pengurangan mengambil daftar pasangan nilai-kunci, tetapi harus memanggil metode reduce () yang mengambil input daftar kunci (nilai), sehingga harus mengelompokkan nilai berdasarkan kunci. Sangat mudah untuk melakukannya, jika data masukan telah diurutkan sebelumnya (secara lokal) dalam fase peta dan cukup disortir-gabung dalam fase pengurangan (karena reduksi mendapatkan data dari banyak pembuat peta).
Partitioning, yang Anda sebutkan di salah satu jawaban, adalah proses yang berbeda. Ini menentukan di mana peredam pasangan (kunci, nilai), keluaran dari fase peta, akan dikirim. Partisi default menggunakan hashing pada kunci untuk mendistribusikannya ke tugas pengurangan, tetapi Anda dapat menimpanya dan menggunakan Partisi kustom Anda sendiri.
Sumber informasi yang bagus untuk langkah-langkah ini adalah tutorial Yahoo ini .
Representasi grafis yang bagus dari ini adalah sebagai berikut (shuffle disebut "copy" dalam gambar ini):
Perhatikan itu shufflingdan sortingtidak dilakukan sama sekali jika Anda menetapkan pereduksi nol (setNumReduceTasks (0)). Kemudian, tugas MapReduce berhenti di fase peta, dan fase peta tidak menyertakan jenis penyortiran apa pun (bahkan fase peta lebih cepat).
PEMBARUAN: Karena Anda mencari sesuatu yang lebih resmi, Anda juga dapat membaca buku Tom White "Hadoop: The Definitive Guide". Inilah bagian yang menarik untuk pertanyaan Anda.
Tom White telah menjadi komiter Apache Hadoop sejak Februari 2007, dan merupakan anggota dari Apache Software Foundation, jadi saya rasa ini cukup kredibel dan resmi ...
"Penyortiran menghemat waktu untuk peredam, membantunya dengan mudah membedakan kapan tugas pengurangan baru harus dimulai. Ini hanya memulai tugas pengurangan baru, ketika kunci berikutnya dalam data masukan yang diurutkan berbeda dari sebelumnya, sederhananya." Saya tidak mengerti bagian ini. Mapper menggunakan pemartisi untuk membagi tumpahan menjadi beberapa partisi secara lokal, setiap partisi kemudian mengirim ke pengurangan. Bagaimana penyortiran membantu di sini?
MaxNevermind
1
@MaxNevermind Jika Anda memiliki tugas x pengurangan (partisi), itu tidak berarti bahwa Anda akhirnya akan memanggil metode reduce () sebanyak x kali. Ini akan dipanggil sekali untuk setiap kunci yang berbeda. Jadi satu tugas reduce bisa memanggil metode reduce () beberapa kali.
vefthym
"Ini akan dipanggil sekali untuk setiap kunci yang berbeda" Mengapa? Mapper membentuk partisi sesuai keinginannya (tidak perlu satu partisi untuk setiap kunci yang berbeda), lalu setiap partisi masuk ke reducer, apakah salah?
MaxNevermind
1
@MaxNevermind Mapper mengeluarkan kunci dan nilai, itu tidak membentuk partisi. Partisi ditentukan oleh jumlah tugas pengurangan yang ditentukan pengguna dan implementasi Pemartisi. Output dari semua Mappers yang memiliki kunci yang sama akan menggunakan metode reduce () yang sama. Ini tidak bisa diubah. Tetapi yang dapat diubah adalah kunci lain apa (jika ada) yang akan ditempatkan di partisi yang sama dan dengan demikian, akan ditangani oleh tugas yang sama. Tugas pengurangan bisa memanggil fungsi reduce () lebih dari sekali, tetapi hanya sekali untuk setiap tombol.
vefthym
2
ok saya pikir saya sudah mendapatkannya. Masalah saya adalah saya lupa bahwa pengurangan mengambil daftar nilai sebagai argumen bukan hanya satu pasangan nilai kunci. Saya pikir Anda harus menguraikan ini dalam jawaban Anda: "Setiap tugas pengurangan mengambil daftar pasangan nilai-kunci tetapi harus memanggil metode pengurangan yang mengambil <value> Daftar kunci, jadi harus mengelompokkan nilai berdasarkan kunci, mudah yang harus dilakukan jika data masukan telah diurutkan sebelumnya dalam tahap pemeta "
MaxNevermind
42
Mari kita lihat kembali fase utama program Mapreduce.
The fase peta dilakukan dengan pembuat peta. Pemetaan berjalan pada pasangan kunci / nilai masukan yang tidak diurutkan. Setiap mapper mengeluarkan nol, satu, atau beberapa pasangan kunci / nilai keluaran untuk setiap pasangan kunci / nilai masukan.
The menggabungkan fase dilakukan dengan combiners. The combiner harus menggabungkan pasangan nilai / kunci dengan kunci yang sama. Setiap penggabung dapat menjalankan nol, sekali, atau beberapa kali.
The shuffle dan semacam fase dilakukan oleh framework. Data dari semua pembuat peta dikelompokkan berdasarkan kunci, dipisahkan di antara pereduksi dan diurutkan berdasarkan kunci. Setiap peredam mendapatkan semua nilai yang terkait dengan kunci yang sama. Pemrogram dapat menyediakan fungsi perbandingan khusus untuk pengurutan dan pemartisi untuk pemisahan data.
The partitioner yang memutuskan peredam akan mendapatkan kunci pasangan nilai tertentu.
The peredam Memperoleh diurutkan kunci / [daftar nilai] pasang, diurutkan berdasarkan kunci. Daftar nilai berisi semua nilai dengan kunci yang sama yang dihasilkan oleh pembuat peta. Setiap peredam mengeluarkan nol, satu atau beberapa pasangan kunci / nilai keluaran untuk setiap pasangan kunci / nilai masukan .
Lihat artikel javacodegeeks ini oleh Maria Jurcovicova dan artikel mssqltips oleh Datta untuk pemahaman yang lebih baik
Saya pikir ada kesalahan ketik pada gambar (yang saya sadari baru saja disalin di sini). Saya percaya iestring di bawah Pengurang dan Output seharusnya benar-benar is.
Jeff Evans
32
Saya berpikir untuk menambahkan beberapa poin yang hilang dalam jawaban di atas. Diagram yang diambil dari sini dengan jelas menyatakan apa yang sebenarnya terjadi.
Jika saya menyatakan lagi tujuan sebenarnya dari
Split: Meningkatkan pemrosesan paralel dengan mendistribusikan beban pemrosesan ke berbagai node (Mappers), yang akan menghemat waktu pemrosesan secara keseluruhan.
Gabungkan: Kecilkan output dari setiap Mapper. Ini akan menghemat waktu yang dihabiskan untuk memindahkan data dari satu node ke node lainnya.
Sortir (Acak & Urutkan): Memudahkan run-time untuk menjadwalkan (menelurkan / memulai) reduksi baru, di mana saat menelusuri daftar item yang diurutkan, setiap kali kunci saat ini berbeda dari sebelumnya, ia dapat menelurkan peredam baru .
Di manakah langkah partisi masuk ke grafik ini? Setelah peta dan sebelum digabungkan?
Joel
@ Joel Saya harap Anda mengacu pada langkah 'split'?
Supun Wijerathne
Tidak, maksud saya langkah partisi, ini memutuskan peredam apa untuk mengirim data ke, menggunakan modulo hash sederhana secara default, setelah beberapa penelitian lebih lanjut saya yakin itu datang setelah langkah penggabungan, sebelum mengocok & mengurutkan.
Joel
1
@ Joel Saya tidak begitu jelas apa yang ingin Anda gambarkan. Singkatnya, urutan langkah yang tepat bisa sangat spesifik untuk masalah tertentu. Saya dapat mengatakan bahwa untuk beberapa skenario bahkan penyortiran tidak diperlukan. Kembali ke masukan Anda, jika saya secara khusus berbicara tentang contoh wordcount sederhana di atas, saya tidak benar-benar melihat perlunya partisi seperti itu untuk memutuskan reduksi. Di sini cukup mudah untuk mengurangi spawn per kunci. Tetapi saya dapat menebak bahwa maksud Anda dapat berlaku untuk beberapa skenario. Terus terang, saya tidak tahu pasti tentang itu.
Supun Wijerathne
4
Beberapa persyaratan pemrosesan data tidak perlu disortir sama sekali. Syncsort telah membuat penyortiran di Hadoop dapat dicolokkan. Ini adalah blog yang bagus dari mereka tentang penyortiran. Proses memindahkan data dari pembuat peta ke pereduksi disebut pengocokan, lihat artikel ini untuk informasi lebih lanjut tentang hal yang sama.
Saya selalu menganggap ini perlu karena output dari mapper adalah input untuk peredam, jadi itu diurutkan berdasarkan ruang kunci dan kemudian dibagi menjadi beberapa keranjang untuk setiap masukan peredam. Anda ingin memastikan semua nilai yang sama dari Kunci berakhir di keranjang yang sama menuju ke peredam sehingga dikurangi bersama-sama. Tidak ada gunanya mengirim K1, V2 dan K1, V4 ke reduksi yang berbeda karena mereka harus bersama-sama untuk dikurangi.
Jika kita ingin mengirim k1, v1 dan k1, v4 ke reducer yang sama kita bisa melakukan shuffling. lalu apa tujuan sortir?
Nithin K Anil
Itu melakukan penyortiran karena beberapa alasan satu alasan adalah, ketika Pekerjaan MapReduce mengirim semua pasangan KV ke peredam jika input tidak diurutkan Itu harus memindai semua output Mapper untuk mengambil setiap contoh K1, VX . sedangkan jika output Mapper diurutkan segera setelah K2, VX diambil, Anda tahu bahwa semua K1, VX telah diambil dan set itu dapat dikirim ke reducer untuk diproses, manfaatnya adalah Anda tidak harus menunggu setiap peredam siap agar masing-masing mulai berkurang.
BasicHorizon
Juga ketika datang ke agregasi, jika Anda menentukan Anda ingin Mengumpulkan semua K1, V1 jika input ke peredam diurutkan segera setelah peredam mengambil K2, V2 itu tahu bahwa tidak ada lagi contoh K1, V1 ada jadi itu dapat menyelesaikan agregatnya sedangkan jika input peredam tidak diurutkan, ia harus memindai seluruh input untuk K1, V1
BasicHorizon
2
Pengacakan adalah proses di mana data perantara dari pembuat peta ditransfer ke 0,1 atau lebih pereduksi. Setiap peredam menerima 1 atau lebih kunci dan nilai terkaitnya tergantung pada jumlah pereduksi (untuk beban seimbang). Selanjutnya nilai yang terkait dengan setiap kunci diurutkan secara lokal.
Ini bacaan yang bagus. Semoga membantu. Dalam hal penyortiran Anda mengkhawatirkan, saya pikir ini untuk operasi penggabungan pada langkah terakhir Peta. Ketika operasi peta selesai, dan perlu menulis hasilnya ke disk lokal, multi-penggabungan akan dioperasikan pada pemisahan yang dihasilkan dari buffer. Dan untuk operasi penggabungan, mengurutkan setiap partisi di tingkat lanjut sangat membantu.
Nah, Di Mapreduce ada dua frase penting yang disebut Mapper dan reducer keduanya terlalu penting, tapi Reducer itu wajib. Dalam beberapa program, reduksi bersifat opsional. Sekarang datanglah ke pertanyaan Anda. Mengocok dan menyortir adalah dua operasi penting di Mapreduce. Framework Hadoop pertama mengambil data terstruktur / tidak terstruktur dan memisahkan data menjadi Key, Value.
Sekarang program Mapper memisahkan dan menyusun data menjadi key dan values untuk diproses. Hasilkan nilai Kunci 2 dan nilai 2. Nilai-nilai ini harus diolah dan diatur ulang dalam urutan yang tepat untuk mendapatkan solusi yang diinginkan. Sekarang pengocokan dan penyortiran ini dilakukan di sistem lokal Anda (Kerangka kerja urus) dan proses di sistem lokal setelah kerangka proses membersihkan data di sistem lokal. Baik
Di sini kami menggunakan penggabung dan partisi juga untuk mengoptimalkan proses shuffle dan sortir ini. Setelah pengaturan yang tepat, nilai-nilai kunci tersebut diteruskan ke Reducer untuk mendapatkan keluaran Klien yang diinginkan. Akhirnya Reducer mendapatkan output yang diinginkan.
K1, V1 -> K2, V2 (kita akan menulis program Mapper), -> K2, V '(disini shuffle dan soft data) -> K3, V3 Generate the output. K4, V4.
Harap dicatat semua langkah ini hanya operasi logis, bukan mengubah data asli.
Pertanyaan Anda: Apa tujuan fase pengocokan dan pengurutan pada peredam dalam Pemrograman Pengurangan Peta?
Jawaban singkat: Untuk mengolah data untuk mendapatkan keluaran yang diinginkan. Mengocok adalah menggabungkan data, mengurangi adalah mendapatkan keluaran yang diharapkan.
Jawaban:
Pertama-tama
shuffling
adalah proses mentransfer data dari pembuat peta ke pereduksi, jadi saya pikir sudah jelas bahwa pereduksi itu perlu, karena jika tidak, mereka tidak akan dapat memiliki masukan (atau masukan dari setiap pembuat peta) . Pengacakan dapat dimulai bahkan sebelum fase peta selesai, untuk menghemat waktu. Itulah mengapa Anda dapat melihat status pengurangan lebih besar dari 0% (tetapi kurang dari 33%) ketika status peta belum 100%.Sorting
menghemat waktu untuk peredam, membantunya dengan mudah membedakan kapan tugas pengurangan baru harus dimulai. Ini hanya memulai tugas pengurangan baru, ketika kunci berikutnya dalam data masukan yang diurutkan berbeda dari sebelumnya, untuk membuatnya lebih sederhana. Setiap tugas pengurangan mengambil daftar pasangan nilai-kunci, tetapi harus memanggil metode reduce () yang mengambil input daftar kunci (nilai), sehingga harus mengelompokkan nilai berdasarkan kunci. Sangat mudah untuk melakukannya, jika data masukan telah diurutkan sebelumnya (secara lokal) dalam fase peta dan cukup disortir-gabung dalam fase pengurangan (karena reduksi mendapatkan data dari banyak pembuat peta).Partitioning
, yang Anda sebutkan di salah satu jawaban, adalah proses yang berbeda. Ini menentukan di mana peredam pasangan (kunci, nilai), keluaran dari fase peta, akan dikirim. Partisi default menggunakan hashing pada kunci untuk mendistribusikannya ke tugas pengurangan, tetapi Anda dapat menimpanya dan menggunakan Partisi kustom Anda sendiri.Sumber informasi yang bagus untuk langkah-langkah ini adalah tutorial Yahoo ini .
Representasi grafis yang bagus dari ini adalah sebagai berikut (shuffle disebut "copy" dalam gambar ini):
Perhatikan itu
shuffling
dansorting
tidak dilakukan sama sekali jika Anda menetapkan pereduksi nol (setNumReduceTasks (0)). Kemudian, tugas MapReduce berhenti di fase peta, dan fase peta tidak menyertakan jenis penyortiran apa pun (bahkan fase peta lebih cepat).PEMBARUAN: Karena Anda mencari sesuatu yang lebih resmi, Anda juga dapat membaca buku Tom White "Hadoop: The Definitive Guide". Inilah bagian yang menarik untuk pertanyaan Anda.
Tom White telah menjadi komiter Apache Hadoop sejak Februari 2007, dan merupakan anggota dari Apache Software Foundation, jadi saya rasa ini cukup kredibel dan resmi ...
sumber
Mari kita lihat kembali fase utama program Mapreduce.
The fase peta dilakukan dengan pembuat peta. Pemetaan berjalan pada pasangan kunci / nilai masukan yang tidak diurutkan. Setiap mapper mengeluarkan nol, satu, atau beberapa pasangan kunci / nilai keluaran untuk setiap pasangan kunci / nilai masukan.
The menggabungkan fase dilakukan dengan combiners. The combiner harus menggabungkan pasangan nilai / kunci dengan kunci yang sama. Setiap penggabung dapat menjalankan nol, sekali, atau beberapa kali.
The shuffle dan semacam fase dilakukan oleh framework. Data dari semua pembuat peta dikelompokkan berdasarkan kunci, dipisahkan di antara pereduksi dan diurutkan berdasarkan kunci. Setiap peredam mendapatkan semua nilai yang terkait dengan kunci yang sama. Pemrogram dapat menyediakan fungsi perbandingan khusus untuk pengurutan dan pemartisi untuk pemisahan data.
The partitioner yang memutuskan peredam akan mendapatkan kunci pasangan nilai tertentu.
The peredam Memperoleh diurutkan kunci / [daftar nilai] pasang, diurutkan berdasarkan kunci. Daftar nilai berisi semua nilai dengan kunci yang sama yang dihasilkan oleh pembuat peta. Setiap peredam mengeluarkan nol, satu atau beberapa pasangan kunci / nilai keluaran untuk setiap pasangan kunci / nilai masukan .
Lihat artikel javacodegeeks ini oleh Maria Jurcovicova dan artikel mssqltips oleh Datta untuk pemahaman yang lebih baik
Di bawah ini adalah gambar dari artikel safaribooksonline
sumber
ie
string di bawah Pengurang dan Output seharusnya benar-benaris
.Saya berpikir untuk menambahkan beberapa poin yang hilang dalam jawaban di atas. Diagram yang diambil dari sini dengan jelas menyatakan apa yang sebenarnya terjadi.
Jika saya menyatakan lagi tujuan sebenarnya dari
Split: Meningkatkan pemrosesan paralel dengan mendistribusikan beban pemrosesan ke berbagai node (Mappers), yang akan menghemat waktu pemrosesan secara keseluruhan.
Gabungkan: Kecilkan output dari setiap Mapper. Ini akan menghemat waktu yang dihabiskan untuk memindahkan data dari satu node ke node lainnya.
Sortir (Acak & Urutkan): Memudahkan run-time untuk menjadwalkan (menelurkan / memulai) reduksi baru, di mana saat menelusuri daftar item yang diurutkan, setiap kali kunci saat ini berbeda dari sebelumnya, ia dapat menelurkan peredam baru .
sumber
Beberapa persyaratan pemrosesan data tidak perlu disortir sama sekali. Syncsort telah membuat penyortiran di Hadoop dapat dicolokkan. Ini adalah blog yang bagus dari mereka tentang penyortiran. Proses memindahkan data dari pembuat peta ke pereduksi disebut pengocokan, lihat artikel ini untuk informasi lebih lanjut tentang hal yang sama.
sumber
Saya selalu menganggap ini perlu karena output dari mapper adalah input untuk peredam, jadi itu diurutkan berdasarkan ruang kunci dan kemudian dibagi menjadi beberapa keranjang untuk setiap masukan peredam. Anda ingin memastikan semua nilai yang sama dari Kunci berakhir di keranjang yang sama menuju ke peredam sehingga dikurangi bersama-sama. Tidak ada gunanya mengirim K1, V2 dan K1, V4 ke reduksi yang berbeda karena mereka harus bersama-sama untuk dikurangi.
Mencoba menjelaskannya sesederhana mungkin
sumber
Pengacakan adalah proses di mana data perantara dari pembuat peta ditransfer ke 0,1 atau lebih pereduksi. Setiap peredam menerima 1 atau lebih kunci dan nilai terkaitnya tergantung pada jumlah pereduksi (untuk beban seimbang). Selanjutnya nilai yang terkait dengan setiap kunci diurutkan secara lokal.
sumber
Hanya ada dua hal yang MapReduce lakukan SECARA ASLI: Mengurutkan dan (diimplementasikan dengan mengurutkan) GroupBy yang dapat diskalakan.
Sebagian besar aplikasi dan Pola Desain di atas MapReduce dibangun di atas dua operasi ini, yang disediakan oleh shuffle dan sortir.
sumber
Ini bacaan yang bagus. Semoga membantu. Dalam hal penyortiran Anda mengkhawatirkan, saya pikir ini untuk operasi penggabungan pada langkah terakhir Peta. Ketika operasi peta selesai, dan perlu menulis hasilnya ke disk lokal, multi-penggabungan akan dioperasikan pada pemisahan yang dihasilkan dari buffer. Dan untuk operasi penggabungan, mengurutkan setiap partisi di tingkat lanjut sangat membantu.
sumber
Nah, Di Mapreduce ada dua frase penting yang disebut Mapper dan reducer keduanya terlalu penting, tapi Reducer itu wajib. Dalam beberapa program, reduksi bersifat opsional. Sekarang datanglah ke pertanyaan Anda. Mengocok dan menyortir adalah dua operasi penting di Mapreduce. Framework Hadoop pertama mengambil data terstruktur / tidak terstruktur dan memisahkan data menjadi Key, Value.
Sekarang program Mapper memisahkan dan menyusun data menjadi key dan values untuk diproses. Hasilkan nilai Kunci 2 dan nilai 2. Nilai-nilai ini harus diolah dan diatur ulang dalam urutan yang tepat untuk mendapatkan solusi yang diinginkan. Sekarang pengocokan dan penyortiran ini dilakukan di sistem lokal Anda (Kerangka kerja urus) dan proses di sistem lokal setelah kerangka proses membersihkan data di sistem lokal. Baik
Di sini kami menggunakan penggabung dan partisi juga untuk mengoptimalkan proses shuffle dan sortir ini. Setelah pengaturan yang tepat, nilai-nilai kunci tersebut diteruskan ke Reducer untuk mendapatkan keluaran Klien yang diinginkan. Akhirnya Reducer mendapatkan output yang diinginkan.
K1, V1 -> K2, V2 (kita akan menulis program Mapper), -> K2, V '(disini shuffle dan soft data) -> K3, V3 Generate the output. K4, V4.
Harap dicatat semua langkah ini hanya operasi logis, bukan mengubah data asli.
Pertanyaan Anda: Apa tujuan fase pengocokan dan pengurutan pada peredam dalam Pemrograman Pengurangan Peta?
Jawaban singkat: Untuk mengolah data untuk mendapatkan keluaran yang diinginkan. Mengocok adalah menggabungkan data, mengurangi adalah mendapatkan keluaran yang diharapkan.
sumber