C# / MongoDb – MapReduce

Herkese merhaba. Bugün yazacağım makalede MongoDb ile MapReduce işlemleri yapacağız. Öncelikle MapReduce yapısı hakkında kısaca bir giriş bölümü yazacağım.

MapReduce dağıtık mimari üzerinde büyük verilerin kısa zamanda analiz edilebilmesini sağlayan bir sistemdir. Verileri analiz edip onlardan aggregate sonuçlar üretmek için kullanılır. Map fonksiyonu ile belirtilen key/value değerlerine göre veriler toplanır. Ardından Reduce fonksiyonu ile toplanan veriler aggregate sonuçlara çevrilir.

  • Map fonksiyonunu SQL select sorgusu olarak düşünebiliriz.
  • Reduce fonksiyonunu ise; count, having, avg gibi SQL sorguları olarak düşünebiliriz.

Hesaplama map fonksiyonu içerisinde key/value değerleri alır ve reduce işlemi sonrasında key/value değerlerine göre bir çıktı üretir. Her iki fonksiyonda kullanıcı tarafından yazılmaktadır.

Aşağıda gösterilen örnekte her kelimeden kaç adet bulunduğu hesaplanıyor. Öncelikle değerler 3 gruba ayrılıyor. Ardından mapping kısmında her grupta bulunan kelimeler sayılıyor. Sonrasında her grupta aynı olan kelimeler bir bölümde toplanıyor. Reduce aşamasına geçildiği zaman ise her bölümde toplanan kelimeler sayılıyor ve en son değerimiz ekrana çıkarılıyor. Giriş değerimizin büyük boyutta olduğunu düşünelim. Böylece istenilen sorgu map reduce ile kolayca elde edilmektedir. Map reduce ile ilgiyi geniş bilgi internette fazlasıyla mevcuttur. Detaylı bilgi için; research.google, wikipedia

map-reduce-flow

Örnek: Bu yazıda göstereceğim map reduce işlemi daha önce üzerinde örnekler yaptığım restaurants collection üzerinde olacaktır. Collectionda bulunan her documentta restaurantın bulunduğu semt adı bulunmaktadır. Map fonksiyonu ile semt değerine göre gruplama yapılacak. Ardından Reduce fonksiyonu ile her semt değeri için mevcut olan restaurant değerleri toplanıp çıkış değeri olacak gösterilecektir. Ekstra olarak restaurantları yemek türüne göre filtreleyip hangi yemek tipinden nerede kaç restaurant var görebiliriz.

  • Veritabanı için gerekli bağlantılar

1

  • MapReduce işlemleri için gerekli javascript fonksiyonlarını yazalım. MongoDb’de MapReduce işlemini uygulamak için fonksiyonlar javascript formatında yazılmalıdır. Map fonksiyonu ile borough (ilçe) değeri anahtar olarak belirtilmiştir. Value değeri olarak 1 yani her value değeri için o değer üzerine +1 eklenecektir. Reduce fonksiyonu ile values dizisine biriken değerler her key değeri için toplanıyor. Finalize fonksiyonu içerisinde toplanan değerler integer olarak ekrana döndürülüyor. Finalize fonksiyonu reduce işleminden sonra yapılacak olan düzenlemelerin uygulandığı fonksiyondur.

 

2

  • Restaurant tipine göre filtreleme yapmak istersek;

3

  • Öncelikle MapReduceOptions ile gerekli ayarları yapıyoruz. Giriş değeri restaurant sınıfı, çıkış değeri ise BsonDocument olarak belirtilmiştir. MapReduce metodunda tanımlarını yaptığımız fonksiyonlar (map-reduce) ile options parametresine belirttiğimiz ayar değerlerini yazıyoruz. Ardından tüm sonuçları await results.ToListAsync() ile docs değişkenine atıyoruz. Bütün bu işlemleri yaptığımız metod async değer döndürmelidir. Çünkü MongoDb yeni sürümü ile async/await olarak sorguları çekmekteyiz. Foreach kısmında ekrana yazma işlemleri yapılmaktadır.

4

  • Filtresiz ekran çıktısı. Sonuçta görüldüğü gibi 25.360 değer mevcuttur. MapReduce işlemi ile tüm verileri tarayıp az sürede sorgu gerçekleşmektedir.

restaurantoutput

  • Filtre kullanılarak yapılan sorgu sonucu oluşan ekran çıktısı. Restaurant yemek tipi “irish” olan restaurantları sorguluyor.

restaurantoutputfilter

Mevcut veriler için MapReduce işlemini gerçekleştirdik. Peki yeni veriler eklendiği zaman tekrar tüm veriler aynı işlemden geçirilmeli mi? Geçirilirse büyük veriler için maliyet kaybı olacaktır. Bu durumlar için Incremental MapReduce uygulanır. Sadece yeni eklenen verilere işlem uygulamak için, örneğin belli bir tarihten sonraki eklenen değerleri almak için bir sorgu yazarız. Böylece sadece yeni veriler MapReduce işlemine tabi olur. İşlem bitince eski sonuçlara yeni sonuçlar eklenir.

İngilizce versiyonu

Kaynaklar

MapReduce Doc

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s