Yazan : Şadi Evren ŞEKER

Bu yazının amacı, bilgisayar bilimlerinde, özellikle son dönemde oldukça kullanışlı hale gelen Map-Reduce, bindirme – biriktirme tipi yaklaşımı açıklamaktır.

Aslında basitçe iki tip işlem, veri kaynağı üzerine uygulanmaktadır.

Bu iki tip fonksiyon verinin dağılımına göre farklı şekillerde uygulanabilir (bkz. Flynn sınıflandırması, Flynn’s taxonomy).

Konuyu bir LISP örneği üzerinden açıklamaya çalışalım.

Yukarıdaki lisp kodunda kare alma fonksiyonu ‘(1 2 3 4 5) listesine uygulanmış ve sonuç olarak ‘(1 3 9 16 25) sonuçlarını içeren, yani listedeki her elemanın karesini içeren bir liste bulunmuştur. Burada yapılan kare alma fonksiyonunu bahsi geçen listeye bindirmek (haritalamak, map) ve ardından yeni bir liste elde etmektir. Bunu aşağıdaki şekilde düşünebiliriz:

Yani 5 elemanın hepsi ayrı ayrı aynı fonksiyona tabi tutulmuş ve 5 ayrı sonuç elde edilerek saklanmıştır.

Gelelim biriktirme tipi fonksiyonumuza (accumulator style).

Lispte bulunan bu fonksiyon, basitçe bir fonksiyon, bir başlangıç değeri (initial value) ve bir liste alarak bu fonksiyonu başlangıç değeri ve liste elemanlarına sırasıyla uygular. Buradaki fonksiyonun bindirme tipindeki fonksiyondan farkı iki parametereli olmasıdır. Örneğin toplama işlemi için iki elemana ihtiyaç vardır. Burada da yapılan işlem önce 0+1 sonra sonuç olan 1+2 sonra sonuç olan 3 + 3 sonra sonuç olan 6 + 4 ve en nihayetinde sonuç olan 10 + 5 = 15 sonucunu bulmaktır.

Bu yaklaşımı da aşağıdaki şekilde düşünebiliriz:

Başlangıç değeri ile başlanan f fonksiyonu, her seferinde ilave bir parametre alarak bu iki parametreden tek bir sonuç çıkarmata, bir sonraki adımda ise bir önceki adımdan elde edilen sonuca yeni bir parametre ilave edilerek netice adımına kadar ilerlenmektedir.

İşte Map-Reduce (bindirme ve biriktirme) işlemi tam da burada devreye girebilir. Örneğin aşağıdaki fonksiyonu ele alalım:

Bu fonksiyonda öncelikle lambda(x) (* x x) şeklinde tanımlanan isimsiz fonksiyon ile verilen parametrenin karesi alınmaktadır. Bu fonksiyon verilen parametre listenin üzerine bindirilecek (map) ve ardından listedeki bütün elemanlar tek bir sonuçta biriktirilecektir (reduce).

Bu yaklaşım aşağıdaki temsili şekilde gösterilmiştir.

Veri kaynağı öncelikle parçalara bölünmüş ve her parça üzerinde bir bindirme işlemi yapılmıştır. Ardından çıkan sonuçlar tek bir biriktirme tipi fonksiyonta toplanmış ve yeniden bir veri kaynağına indirgenmiş olarak yazılmıştır (örneğin daha küçük bir liste).

Yukarıdaki bu durumu şu şekilde düşünmek mümkün olabilir. Örneğin yüzlerce yazarın yazıları üzerinde çalışan bir arama motoru geliştirmek isteyelim. Öncelikle yazarların yazılarının herbirisi üzerinde bir indeksleme (fihristleme) işlemi yapılıyor ve ardınıdan bu indeksler tek bir kaynakta işlenerek her kelimenin hangi yazıda bulunduğu tutuluyor. Son aşamada ise bu kelimeler ve bağlı oldukları yazılar ayrı birer kaynakta saklanıyor.


Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir