Membagi masalah menjadi yang lebih kecil sampai masalah individual dapat diselesaikan secara mandiri dan kemudian menggabungkannya untuk menjawab pertanyaan awal dikenal sebagai teknik desain algoritma divide and conquer . [Lihat: Pengantar Algoritma oleh CLR]
Baru-baru ini, pendekatan ini untuk memecahkan masalah komputasi terutama dalam domain set data yang sangat besar telah disebut sebagai MapReduce daripada membagi dan menaklukkan.
Pertanyaan saya adalah sebagai berikut: Apakah MapReduce lebih dari sekadar kerangka kerja berpemilik yang mengandalkan pendekatan memecah belah dan menaklukkan, atau adakah detailnya yang membuatnya unik dalam beberapa hal?
algorithms
otto
sumber
sumber
Jawaban:
Jika Anda bertanya tentang arsitektur MapReduce, maka itu sangat banyak teknik membagi dan menaklukkan . Namun, arsitektur MapReduce apa pun yang bermanfaat akan memiliki banyak infrastruktur lain untuk secara efisien "membagi", "menaklukkan", dan akhirnya "mengurangi" set masalah. Dengan penyebaran MapReduce yang besar (1000's dari node komputasi) langkah-langkah ini untuk mempartisi pekerjaan, menghitung sesuatu, dan akhirnya mengumpulkan semua hasil adalah non-sepele. Hal-hal seperti penyeimbangan beban, deteksi titik mati, penghematan kondisi sementara (untuk masalah yang berjalan lama), merupakan masalah sulit sendiri.
sumber
MapReduce adalah kerangka kerja untuk menerapkan algoritma divide-and-menaklukkan dengan cara yang sangat scalable , dengan secara otomatis mendistribusikan unit-of-work ke node dalam sekelompok besar komputer yang sewenang-wenang dan secara otomatis menangani kegagalan masing-masing node dengan mendistribusikan kembali unit-of-work ke simpul lain.
Ini bukan konsep yang sangat canggih, tetapi infrastruktur yang sangat berguna.
sumber
MapReduce menyimpang dari sebagian besar sistem divide dan menaklukkan dengan cara yang cukup mendasar, tetapi yang begitu sederhana sehingga banyak orang hampir melewatkannya. Jenius yang sebenarnya adalah dalam memberi tag hasil menengah.
Dalam sistem membagi dan menaklukkan (sebelumnya) yang khas, Anda membagi pekerjaan secara seri, menjalankan paket kerja secara paralel, dan kemudian menggabungkan hasil dari pekerjaan itu secara seri lagi.
Di MapReduce, Anda membagi pekerjaan secara seri, mengeksekusi paket kerja secara paralel, dan menandai hasilnya untuk menunjukkan hasil mana yang sesuai dengan hasil lainnya. Penggabungan ini kemudian serial untuk semua hasil dengan tag yang sama, tetapi dapat dieksekusi secara paralel untuk hasil yang memiliki tag yang berbeda.
Dalam kebanyakan sistem sebelumnya, langkah penggabungan menjadi penghambat bagi semua kecuali tugas yang paling sepele. Dengan MapReduce itu dapat tetap jika sifat tugas mensyaratkan bahwa semua penggabungan dilakukan secara serial. Namun, jika tugas tersebut memungkinkan penggabungan beberapa tingkat hasil paralel, maka MapReduce memberikan cara sederhana untuk memanfaatkan kemungkinan itu. Sebagian besar sistem lain melakukan satu dari dua hal: menjalankan semua penggabungan secara serial hanya karena mungkin diperlukan untuk beberapa tugas, atau dengan cara lain mendefinisikan penggabungan paralel untuk tugas tertentu. MapReduce memberi Anda cukup data pada langkah penggabungan untuk secara otomatis menjadwalkan sebanyak mungkin paralel, sambil tetap memastikan (dengan asumsi Anda tidak membuat kesalahan dalam langkah pemetaan) bahwa koherensi dipertahankan.
Perhatikan juga bahwa di MapReduce, tersirat bahwa semua langkah bisa bersifat rekursif, jadi saya mungkin memiliki langkah pemetaan awal yang memecah tugas besar menjadi 5 tugas kecil yang dapat dieksekusi secara paralel - tetapi masing-masing mungkin (dalam turn) dipetakan ke sejumlah tugas paralel lain yang lebih kecil, dan seterusnya.
Ini mengarah ke struktur pohon pada pemetaan dan sisi pengurang untuk dengan cepat memecah tugas besar menjadi beberapa bagian untuk mengambil keuntungan dari banyak mesin.
sumber
MapReduce bukan hanya teknik membagi dan menaklukkan, meskipun terlihat seperti itu dalam banyak contoh.
Pada langkah pemetaan Anda dapat dan sering ingin melakukan hubungan satu-ke-banyak. Dengan demikian Anda tidak hanya membagi menjadi beberapa kasus.
Antara peta dan mengurangi ada baik (tergantung pada implementasi) semacam atau langkah hashing. Efisiensi operasi ini sangat penting untuk kebutuhan sumber daya secara keseluruhan. Detailnya tidak terlihat oleh programmer aplikasi, tetapi langkah ini adalah jantung dari framework.
Operasi pengurangan adalah jenis penggabungan. Yang dapat dianggap sebagai penakluk, tetapi dalam praktiknya cenderung menjadi, "memancarkan data untuk penggunaan nanti" atau "menyimpan data di penyimpanan data". (Catatan, jika Anda memiliki set data besar, Anda benar-benar ingin semuanya didistribusikan, termasuk input dan hasil akhir. Jadi penyimpanan kunci / nilai yang didistribusikan masuk akal baik sebagai tempat untuk mendapatkan input dan untuk menyimpan output.)
sumber