MapReduce, veri sorgularını paralelleştirmenin yerleşik bir yoludur, ancak bu alternatif daha da fazla fayda sağlayabilir mi?
Temel Çıkarımlar
- MapReduce ve toplama işlem hattı, MongoDB'de karmaşık veri işlemeye yönelik iki yöntemdir. Toplama çerçevesi daha yeni ve daha verimli.
- MapReduce, JavaScript kullanarak ayrı harita ve azaltma işlevleri belirtmeyi içerirken, toplama boru hattı yerleşik MongoDB operatörlerini kullanır.
- Toplama boru hattı, daha iyi performans için MongoDB tarafından önerilir, ancak MapReduce daha fazla esneklik sunar ve Hadoop gibi dağıtılmış dosya sistemleri için uygundur.
MapReduce ve toplama boru hattı, MongoDB'de karmaşık veri işlemeyle başa çıkmak için kullanabileceğiniz iki yöntemdir. Toplama çerçevesi daha yenidir ve verimliliği ile bilinir. Ancak bazı geliştiriciler hala daha rahat buldukları MapReduce'a bağlı kalmayı tercih ediyor.
Pratik olarak, aynı amaca ulaştıkları için bu karmaşık sorgulama yöntemlerinden birini seçmek istersiniz. Ama nasıl çalışıyorlar? Nasıl farklılar ve hangisini kullanmalısınız?
MapReduce MongoDB'de Nasıl Çalışır?
MongoDB'deki MapReduce, büyük hacimli veriler üzerinde karmaşık hesaplamalar yapmanıza ve sonucu daha kapsamlı bir yığın halinde toplamanıza olanak tanır. MapReduce yönteminde iki işlev bulunur: haritalama ve azaltma.
MongoDB'de MapReduce ile çalışırken, JavaScript kullanarak haritayı ve azaltma işlevlerini ayrı ayrı belirleyecek ve her birini yerleşik Harita indirgeme sorgu.
Eşleme işlevi önce, gelen verileri, genellikle eşlenen gruplamaya dayalı olarak, anahtar-değer çiftlerine böler. Bu, verileri nasıl gruplandırmak istediğinizi belirttiğiniz yerdir. Daha sonra azaltma işlevi, her veri grubundaki değerler üzerinde özel hesaplamalar yapar ve sonucu veritabanında depolanan ayrı bir koleksiyonda toplar.
Toplama Boru Hattı MongoDB'de Nasıl Çalışır?
MongoDB'deki toplama boru hattı, MapReduce'a geliştirilmiş bir alternatiftir. MapReduce gibi, doğrudan veritabanı içinde karmaşık hesaplamalar ve veri dönüşümleri gerçekleştirmenize olanak tanır. Ancak toplama, sorgu performansını azaltabilen özel JavaScript işlevleri yazmayı gerektirmez.
Bunun yerine verileri işlemek, gruplandırmak ve hesaplamak için yerleşik MongoDB operatörlerini kullanır. Ardından, her sorgudan sonra sonuçları toplar. Böylece, çıktıyı istediğiniz gibi yapılandırabileceğiniz için toplama işlem hattı daha özelleştirilebilir.
MapReduce ve Toplama Arasındaki Sorgular Nasıl Farklı?
Ürün kategorilerine göre ürünlerin toplam satışını hesaplamak istediğinizi varsayalım. MapReduce ve toplama durumunda, ürün kategorileri anahtar olurken, her kategori altındaki öğelerin toplamları karşılık gelen değerler olur.
Açıklanan sorun bildirimi için şuna benzeyen bazı örnek ham verileri ele alalım:
Sorguları ve problem çözme yöntemleri arasında ayrım yapmak için MapReduce ve bir toplama işlem hattını kullanarak bu sorun senaryosunu çözelim.
MapReduce Yöntemi
Python'u temel programlama dili olarak kullanan, Harita indirgeme Daha önce açıklanan sorun senaryosunun sorgusu şöyle görünür:
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)
Bunu orijinal örnek verilere karşı çalıştırırsanız, şöyle bir çıktı görürsünüz:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Yakından bakın ve haritanın ve azaltılmış işlemcilerin olduğunu görmelisiniz. JavaScript işlevleri Python değişkenlerinin içinde. Kod bunları şuraya iletir: Harita indirgeme adanmış bir çıktı koleksiyonunu belirten sorgu (bölüm_toplamları).
Toplama Ardışık Düzeni Kullanma
Daha düzgün bir çıktı vermenin yanı sıra, toplama boru hattı sorgusu daha doğrudandır. Toplama ardışık düzeninde önceki işlemin nasıl göründüğü aşağıda açıklanmıştır:
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)
Bu toplama sorgusunu çalıştırmak, MapReduce yaklaşımından elde edilen sonuçlara benzer aşağıdaki sonuçları verecektir:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Sorgu Performansı ve Hızı
Toplama boru hattı, MapReduce'un güncellenmiş bir versiyonudur. MongoDB, MapReduce yerine toplama boru hattının kullanılmasını önerir, çünkü ilki daha verimlidir.
Önceki bölümdeki sorguları çalıştırırken bu iddiayı öne sürmeye çalıştık. Ve 12 GB RAM'li bir makinede yan yana çalıştırıldığında, toplama ardışık düzeni yürütme sırasında ortalama 0,014 saniye ile daha hızlı görünüyordu. Aynı makinede MapReduce sorgusunun çalıştırılması ortalama 0,058 saniye sürmüştür.
Bu, performansları hakkında bir sonuca varmak için bir kıstas değil, ancak MongoDB'nin tavsiyesini destekliyor gibi görünüyor. Bu zaman farkını önemsiz düşünebilirsiniz, ancak binlerce veya milyonlarca sorguda önemli ölçüde artacaktır.
MapReduce'un Artıları ve Eksileri
Veri işlemede nerede üstün olduğunu belirlemek için MapReduce'un olumlu ve olumsuz yanlarını göz önünde bulundurun.
Artıları
- Haritayı ayrı ayrı yazdığınız ve işlevleri azalttığınız için özelleştirme için daha fazla esneklik sağlar.
- Çıktıyı veritabanı içindeki yeni bir MongoDB koleksiyonuna kolayca kaydedebilirsiniz.
- Kullanabilirsiniz Dağıtılmış dosya sistemlerinde MapReduce MongoDB ile kolayca entegre olan Hadoop gibi.
- Üçüncü taraf komut dizisi desteği, onu toplama boru hattından daha ölçeklenebilir ve öğrenmesi kolay hale getirir. Böylece, JavaScript geliştirme geçmişi olan biri MapReduce'u uygulayabilir.
Eksileri
- Üçüncü taraf komut dosyası gerektirir; bu, toplama boru hattından daha düşük performansına katkıda bulunur.
- MapReduce, özellikle aşırı karmaşık verilerle uğraşırken, birkaç düğüm gerektiren, bellek açısından verimsiz olabilir.
- Sorgulama yavaş olabileceğinden gerçek zamanlı veri işleme için uygun değildir.
Toplama İşlem Hattının Artıları ve Eksileri
Toplama boru hattına ne dersiniz? Güçlü ve zayıf yanlarını göz önünde bulundurmak daha fazla içgörü sağlar.
Artıları
- Sorgu çok aşamalıdır, genellikle daha kısa, daha özlü ve daha okunaklıdır.
- Toplama işlem hattı daha verimlidir ve MapReduce'a göre önemli bir gelişme sunar.
- Sorgunuzu esnek bir şekilde tasarlamanıza izin veren yerleşik MongoDB operatörlerini destekler.
- Gerçek zamanlı veri işlemeyi destekler.
- Toplama işlem hattı, MongoDB'ye kolayca alınabilir ve üçüncü taraf komut dosyası oluşturmayı gerektirmez.
- Yapabilirsiniz yeni bir MongoDB koleksiyonu oluştur kaydetmeniz gerekiyorsa çıktılar için.
Eksileri
- Daha karmaşık veri yapılarıyla uğraşırken MapReduce kadar esnek olmayabilir. Üçüncü taraf komut dizisini kullanmadığından, sizi belirli bir veri toplama yöntemiyle sınırlandırır.
- Uygulaması ve öğrenme eğrisi, MongoDB ile çok az deneyimi olan veya hiç deneyimi olmayan geliştiriciler için zorlayıcı olabilir.
MapReduce veya Aggregation Pipeline'ı Ne Zaman Kullanmalısınız?
Genel olarak, MapReduce ve toplama ardışık düzeni arasında seçim yaparken veri işleme gereksinimlerinizi göz önünde bulundurmanız en iyisidir.
İdeal olarak, verileriniz daha karmaşıksa ve dağıtılmış bir dosya sisteminde gelişmiş mantık ve algoritmalar gerektiriyorsa, MapReduce kullanışlı olabilir. Bunun nedeni, harita küçültme işlevlerini kolayca özelleştirebilmeniz ve bunları birkaç düğüme enjekte edebilmenizdir. Veri işleme göreviniz verimlilik yerine yatay ölçeklenebilirlik gerektiriyorsa MapReduce'u tercih edin.
Öte yandan, toplama boru hattı, özel mantık veya algoritmalar gerektirmeyen karmaşık verileri hesaplamak için daha uygundur. Verileriniz yalnızca MongoDB'de bulunuyorsa, birçok yerleşik işleç içerdiğinden toplama ardışık düzenini kullanmak mantıklıdır.
Toplama boru hattı, gerçek zamanlı veri işleme için de en iyisidir. Hesaplama gereksiniminiz verimliliği diğer faktörlere göre önceliklendiriyorsa, toplama ardışık düzenini tercih etmek istersiniz.
MongoDB'de Karmaşık Hesaplamaları Çalıştırın
Her iki MongoDB yöntemi de büyük veri işleme sorguları olsa da, birçok farklılığı paylaşırlar. Daha yavaş olabilen hesaplamaları yapmadan önce verileri almak yerine, her iki yöntem de doğrudan veritabanında depolanan veriler üzerinde hesaplamalar yaparak sorguları daha verimli hale getirir.
Ancak performansta biri diğerinin yerini alıyor ve doğru tahmin ettiniz. Toplama boru hattı, verimlilik ve performansta MapReduce'u gölgede bırakır. Ancak ne pahasına olursa olsun MapReduce'u toplama işlem hattıyla değiştirmek isteseniz de, MapReduce kullanmanın daha mantıklı olduğu belirli uygulama alanları vardır.