MapReduce adalah cara yang mapan untuk memparalelkan kueri data, tetapi dapatkah alternatif ini menawarkan lebih banyak manfaat?
Takeaway kunci
- MapReduce dan pipa agregasi adalah dua metode untuk pemrosesan data yang kompleks di MongoDB. Kerangka agregasi lebih baru dan lebih efisien.
- MapReduce melibatkan penetapan peta terpisah dan fungsi pengurangan menggunakan JavaScript, sedangkan pipeline agregasi menggunakan operator MongoDB bawaan.
- Pipa agregasi direkomendasikan oleh MongoDB untuk kinerja yang lebih baik, tetapi MapReduce menawarkan lebih banyak fleksibilitas dan cocok untuk sistem file terdistribusi seperti Hadoop.
MapReduce dan pipa agregasi adalah dua metode yang dapat Anda gunakan untuk menangani pemrosesan data yang kompleks di MongoDB. Kerangka agregasi lebih baru dan dikenal karena efisiensinya. Tetapi beberapa pengembang masih memilih untuk tetap menggunakan MapReduce, yang menurut mereka lebih nyaman.
Secara praktis, Anda ingin memilih salah satu dari metode kueri kompleks ini karena keduanya mencapai tujuan yang sama. Tapi bagaimana cara kerjanya? Bagaimana mereka berbeda, dan mana yang harus Anda gunakan?
Bagaimana MapReduce Bekerja di MongoDB
MapReduce di MongoDB memungkinkan Anda menjalankan kalkulasi kompleks pada volume data yang besar dan menggabungkan hasilnya menjadi potongan yang lebih komprehensif. Metode MapReduce memiliki dua fungsi: map dan reduce.
Saat bekerja dengan MapReduce di MongoDB, Anda akan menentukan peta dan fungsi pengurangan secara terpisah menggunakan JavaScript dan menyisipkan masing-masing ke dalam bawaan mapReduce pertanyaan.
Fungsi map pertama-tama membagi data yang masuk menjadi pasangan kunci-nilai—biasanya berdasarkan pengelompokan yang dipetakan. Di sinilah Anda menentukan bagaimana Anda ingin mengelompokkan data. Fungsi pengurangan kemudian menjalankan penghitungan khusus pada nilai di setiap grup data dan menggabungkan hasilnya ke dalam kumpulan terpisah yang disimpan di database.
Bagaimana Pipeline Agregasi Bekerja di MongoDB
Pipa agregasi di MongoDB adalah alternatif yang lebih baik untuk MapReduce. Seperti MapReduce, ini memungkinkan Anda untuk melakukan kalkulasi kompleks dan transformasi data secara langsung di dalam database. Namun agregasi tidak memerlukan penulisan fungsi JavaScript khusus yang dapat mengurangi kinerja kueri.
Sebagai gantinya, ia menggunakan operator MongoDB bawaan untuk memanipulasi, mengelompokkan, dan menghitung data. Ini kemudian menggabungkan hasil setelah setiap kueri. Dengan demikian, pipa agregasi lebih dapat disesuaikan karena Anda dapat menyusun output sesuka Anda.
Bagaimana Kueri Berbeda Antara MapReduce dan Agregasi
Asumsikan Anda ingin menghitung total penjualan barang berdasarkan kategori produk. Dalam kasus MapReduce dan agregasi, kategori produk menjadi kunci, sedangkan jumlah item di bawah setiap kategori menjadi nilai yang sesuai.
Ambil beberapa contoh data mentah untuk pernyataan masalah yang dijelaskan, yang terlihat seperti ini:
Mari selesaikan skenario masalah ini menggunakan MapReduce dan pipa agregasi untuk membedakan antara kueri dan metode pemecahan masalah mereka.
Metode MapReduce
Menggunakan Python sebagai bahasa pemrograman dasar, the mapReduce kueri dari skenario masalah yang dijelaskan sebelumnya terlihat seperti ini:
import pymongo
client = pymongo.MongoClient(
"mongodb://localhost/"
)db = client.my_database
sales = db["sales"]
map_function =
function() {
emit(this.Section, this.Sold);
}reduce_function =
function(key, values) {
return Array.sum(values);
}result = db.command(
"mapReduce",
"sales",
map=map_function,
reduce=reduce_function,
out="section_totals"
)
doc = [doc for doc in db.section_totals.find()]
print(doc)
Jika Anda menjalankan ini terhadap data sampel asli, Anda akan melihat keluaran seperti ini:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Perhatikan baik-baik, dan Anda akan melihat peta dan pengurangan prosesor fungsi JavaScript di dalam variabel Python. Kode melewati ini ke mapReduce kueri, yang menentukan koleksi keluaran khusus (bagian_total).
Menggunakan Pipa Agregasi
Selain memberikan hasil yang lebih lancar, kueri pipa agregasi lebih langsung. Inilah yang terlihat seperti operasi sebelumnya dengan pipa agregasi:
import pymongo
client = pymongo.MongoClient("mongodb://localhost/")
db = client.funmi
sales = db["sales"]pipeline = [
{
"$group": {
"_id": "$Section",
"totalSold": { "$sum": "$Sold" }
}
},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$totalSold"
}
}
]
result = list(sales.aggregate(pipeline))
print(result)
Menjalankan kueri agregasi ini akan memberikan hasil berikut, yang serupa dengan hasil dari pendekatan MapReduce:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Kinerja Kueri dan Kecepatan
Pipa agregasi adalah versi terbaru dari MapReduce. MongoDB merekomendasikan penggunaan pipa agregasi daripada MapReduce, karena yang pertama lebih efisien.
Kami mencoba menegaskan klaim ini saat menjalankan kueri di bagian sebelumnya. Dan ketika dieksekusi berdampingan pada mesin RAM 12GB, pipa agregasi tampak lebih cepat, rata-rata 0,014 detik selama eksekusi. Butuh mesin yang sama rata-rata 0,058 detik untuk menjalankan kueri MapReduce.
Itu bukan tolok ukur untuk menyimpulkan kinerja mereka, tetapi tampaknya mendukung rekomendasi MongoDB. Anda mungkin menganggap perbedaan waktu ini tidak signifikan, tetapi ini akan bertambah secara signifikan di antara ribuan atau jutaan kueri.
Pro dan Kontra dari MapReduce
Pertimbangkan kelebihan dan kekurangan MapReduce untuk menentukan keunggulannya dalam pemrosesan data.
Pro
- Ini memberi lebih banyak fleksibilitas untuk penyesuaian karena Anda menulis peta dan mengurangi fungsi secara terpisah.
- Anda dapat dengan mudah menyimpan hasilnya ke koleksi MongoDB baru di dalam database.
- Anda dapat gunakan MapReduce dalam sistem file terdistribusi seperti Hadoop, yang mudah diintegrasikan dengan MongoDB.
- Dukungannya untuk skrip pihak ketiga membuatnya lebih terukur dan mudah dipelajari daripada saluran agregasi. Jadi seseorang dengan latar belakang pengembangan JavaScript dapat mengimplementasikan MapReduce.
Kontra
- Itu membutuhkan skrip pihak ketiga; ini berkontribusi pada kinerjanya yang lebih rendah daripada pipa agregasi.
- MapReduce dapat menjadi memori yang tidak efisien, membutuhkan beberapa node, terutama ketika berhadapan dengan data yang terlalu rumit.
- Itu tidak cocok untuk pemrosesan data real-time karena kueri bisa lambat.
Pro dan Kontra dari Pipa Agregasi
Bagaimana dengan pipa agregasi? Mempertimbangkan kekuatan dan kelemahannya memberikan lebih banyak wawasan.
Pro
- Kueri bertingkat, biasanya lebih pendek, lebih ringkas, dan lebih mudah dibaca.
- Pipa agregasi lebih efisien, menawarkan peningkatan yang signifikan dibandingkan MapReduce.
- Ini mendukung operator MongoDB bawaan yang memungkinkan Anda merancang kueri Anda secara fleksibel.
- Ini mendukung pemrosesan data waktu nyata.
- Pipa agregasi mudah diserap ke dalam MongoDB dan tidak memerlukan skrip pihak ketiga.
- Kamu bisa buat koleksi MongoDB baru untuk output jika Anda perlu menyimpannya.
Kontra
- Ini mungkin tidak sefleksibel MapReduce ketika berhadapan dengan struktur data yang lebih kompleks. Karena tidak menggunakan skrip pihak ketiga, ini membatasi Anda pada metode khusus untuk menggabungkan data.
- Kurva penerapan dan pembelajarannya dapat menjadi tantangan bagi pengembang dengan sedikit atau tanpa pengalaman dengan MongoDB.
Kapan Anda Harus Menggunakan MapReduce atau Agregation Pipeline?
Secara umum, sebaiknya pertimbangkan persyaratan pemrosesan data Anda saat memilih antara MapReduce dan pipeline agregasi.
Idealnya, jika data Anda lebih kompleks, memerlukan logika dan algoritme lanjutan dalam sistem file terdistribusi, MapReduce dapat berguna. Ini karena Anda dapat dengan mudah menyesuaikan fungsi pengurangan peta dan menyuntikkannya ke beberapa node. Gunakan MapReduce jika tugas pemrosesan data Anda memerlukan skalabilitas horizontal daripada efisiensi.
Di sisi lain, pipa agregasi lebih cocok untuk menghitung data kompleks yang tidak memerlukan logika atau algoritme khusus. Jika data Anda hanya berada di MongoDB, masuk akal untuk menggunakan pipa agregasi karena memiliki banyak operator bawaan.
Pipa agregasi juga paling baik untuk pemrosesan data real-time. Jika persyaratan perhitungan Anda memprioritaskan efisiensi daripada faktor lain, Anda ingin memilih pipa agregasi.
Jalankan Komputasi Kompleks di MongoDB
Meskipun kedua metode MongoDB adalah kueri pemrosesan data besar, keduanya memiliki banyak perbedaan. Alih-alih mengambil data sebelum melakukan penghitungan, yang bisa jadi lebih lambat, kedua metode ini langsung melakukan penghitungan pada data yang disimpan di database, membuat kueri menjadi lebih efisien.
Namun, yang satu menggantikan yang lain dalam performa, dan tebakan Anda benar. Pipa agregasi mengalahkan MapReduce dalam hal efisiensi dan kinerja. Tapi sementara Anda mungkin ingin mengganti MapReduce dengan aggregation pipeline dengan segala cara, masih ada area aplikasi tertentu di mana menggunakan MapReduce lebih masuk akal.