MapReduce Nedir?

13 Eylül 2011 Salı 04:03 Gönderen Merve Yüzbaşıoğlu 1 yorum
Günümüzün en popüler arama motoru elbette Google fakat bu popülerlik Google bu performansı nasıl sağlıyor sorusunuda beraberinde getiriyor. Herkes internetteki bilgileri depolayabilir ama bunu iyi bi performansta yapabilmek, elindeki bilgisayarlara iş yükünü doğru şekilde dağıtabilmekten geçiyor. Bilgisayarlar arasındaki iş yükünü dağıtma işini Google kendi geliştirdiği MapReduce denilen bir yazılım platformu ile gerçekleştiriyor.

MapReduce; büyük veri setleri ile yapılacak işlemlerin birden fazla iş birimine dağıtılmasını sağlayan yöntemdir. Burada büyük veri setleri derken birkaç bilgisayarın bile işleyemeyeceği kadar verinin topladığı setlerden bahsediyorum. Bu setler üzerindeki işlemler serisi çeşitli birimlere dağıtılıyor ve sonra çıktıları birleştirilip sonuç üretiliyor. İki katmandan oluşuyor Map, Reduce.
Map katmanı; İsim-değer çiftlerini girdi olarak alır, yapılacak işlemi gerçekleştirir. Ürettiği sonuç listesini ise girdideki isim ile birlikte çıktı olarak verir.
Reduce katmanı: Map katmanındaki sonuç listelerini toplar ve tek sonuca indirgeme işlemini yapar. Birde fazla iş birimi map işiyle uğraşırken, bir sonraki karman sonuçları toplayıp tek sonuç haline getirir.

Bu sistemin performanslı olması dışındaki bir diğer getirisi ise iş birimlerinden herhangi biri arızalandığında diğerleri çalışmaya devam eder ve arızalanan iş birimindeki görev başka bir iş birimine devredilir. MapReduce kavramını araştırıken Hadoop ismini epeyce gördüm ve bu kavramı anlayabilmek içinde araştırılabilir.

Hadoop Nedir?

Hadoop, google dosya sistemi teknolojisi olan MapReduce algoritmasinı birçok bilgisayara dağıtarak uygulamamızı sağlayan, Java ile yazılmış Açık kaynaklı bir yazılım. Hadoop yatay olarak ölçeklenebilen bir teknoloji bu sebeple kümedeki her makina kendi verisine sahip.

Hadoop'un kullandığı MapReduce tekniğini daha iyi anlamak için karşılaştığım şu örneği verebilirim;

Elimizde büyük bir dosyanın ve bu dosyanın her satırında bir mevye ismi ve yanlarındada o meyve satın alındığında ne kadar para ödendiği yazsın. Amacımız her meyve için toplam ne kadar para harcandığını bulmak. (Aşağıda küçük bir dosyadan örnek veriyorum ama bunun tek tek bakılamayacak kadar büyük bir veri olduğunu düşünelim..)

armut 10
portakal 3
incir 9
armut 9
armut 10
incir 3
mandalina 2
incir 29

Burada Anahtar değer meyve isimleri olacak ve diyelim ki Hadoop kümemizde iki iş birimimiz var. Üstteki dosyayı Hadoop'a verdik ve Hadoop bize bu dosyayı iki birime dağıtacaktır. Anahtar değerine bakmadan dağıtacak ve diyelim ki tam ortadan ikiye bölerek dağıttı.

armut 10
portakal 3
incir 9
armut 9
___________
armut 10
incir 3
mandalina 2
incir 29

Her bölüm kendi eşleme(map) işlemini yaparken benzer anahtar değerlerini aynı toplama yazacak.
Bölüm-1: armut=19, portakal=3, incir=9
Bölüm-2: armut=10, incir=32, mandalina=2
Her bölümün kendi işlemi sona erdikten sonra ingirgeme(reduce) işlemi yapılıyor ve her bölümdeki anahtarlar birde kendi aralarında toplanıyor. Bunun sonucunda;
Armut=29, incir=41, portakal=3, mandalina=2 Bu en son sonuç oluyor.

Hadoop kullanılarak yapılmış birkaç işe bakarsak;
  • Facebook Hadoop kullanarak kullancı davranışlarının analizini yapmakta ve sosyal reklamların etkisini ölçmektedir.
  • New York Times bilgi işlem ekibi Hadoop kullanrak 150 yıllık arşivlerindeki 11 milyon makaleyi dijitalleştirmiş ve aranabilir hale getirmiş.
İşin güzel yanı çok fazla zaman alabilecek işlemlerin dağtılarak yüksek performansta, kısa sürede yapılıyor olabilmesi:)

Kaynaklar

UTF-8 (Unicode Translate Format-8)

12 Eylül 2011 Pazartesi 06:56 Gönderen Merve Yüzbaşıoğlu 1 yorum
UTF-8 nedir sorusuna cevap vermeden önce Unix tarzı sistemlerde UTF8 kullanılmasının sebebinden başlamak istiyorum. UCS(Universal Character Set) ve Unicode, karakterlere karşılık integer sayıların atandığı kod tablolarının ilkiydi. Karakter dizilerinin ve bunların integer değerlerinin, byte'larla temsil edilmesiyle ilgili birçok alternatif var ve unicode metinlerin 2 yada 4 bytelık depolanması en bilinen kodlamalardan(UCS-2 ve UCS-4). Unix altında UCS-2 (yada UCS-4) kullanımı ciddi sorunlara yol açıyor. Unix araçların çoğu ASCII dosyalarını bekler ve önemli değişiklikler yapılmaksızın karakter olarak 16 bit kelimeleri okuyamaz. Bu gibi nedenlerden dolayı UCS-2 dosya isimleri, metin dosyaları, çevre değişkenleri vb.. yerlerde uygun bir kodlama değildir.

ISO 10646-1:2000 'de tanımlanan UTF-8 kodlamasında bu problemler yoktur. Açıkcası Unix tarzı işletim sistemleri altında Unicode kullanılmasını sağlamak için kullanılmıştır.
UTF-8'in Özellikleri

  • U+0000 dan U+007F (ASCII) USC karakterleri basi olarak 0x00 dan 0x7F olarak kodlanır. Bunun anlamı ise, 7 bit ASCII karakterleri içeren string ve dosyalar ASCII ve UTF-8'in her ikisinde de aynı kodlamaya sahiptir.
  • Bigendian UCS-4 byte stringlerinin sıralaması korunur.
  • 0xFE ve 0xFF byteları UTF-8 kodlamasında asla kullanılmaz.
  • ASCII olmayan bir karakteri temsil eden çokbyte'lı bir serinin ilk byte'ı daima 0xC0-0xFD aralığındadır ve bu karakter için takip eden kaç byte'ın olduğunu gösterir. Çokbyte'lı bir serideki tüm ilave bytelar ise 0x80-0xBF aralığındadır. Bu senkronizasyon kolaylığı sağlar ve eksik byte olmasına karşın sağlam ve durum bilgisiz kodlama sağlar.
  • UTF-8 ile kodlanmış karakterler teorik olarak 6 byte uzunluğunda olabilir, ancak 16-bit BMP karakterleri sadece 3 byte uzunluğundadır.
Aşağıdaki byte dizisi bir karakteri temsil etmek için kullanılır. Kullanılan dizi, karakterin Unicode sayıına göre değişir.

U-00000000 – U-0000007F:0xxxxxxx
U-00000080 – U-000007FF:110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


xxx ile yazılan kısımlar, karakter kod sayılarının ikili gösterimindeki bitlerle doldurulur. En sağdaki x bit, en az anlamlı bittir.

Örnek: Unicode karakteri U+00A9 = 1010 1001 bunu UTF-8 'e kodladığımızda;

11000010 10101001=0xC2 0xA9 olarak kodlanıyor.

Python programlama dilinde "şarkıcı" kelimesini utf-8 formatına dönüştürmek için;

>>> s="şarkıcı"
>>> u=unicode(s,"utf-8")
>>> utf8=u.encode("utf-8")
>>> utf8
'\xc5\x9fark\xc4\xb1c\xc4\xb1'

örneğin burada "ş" karakterinin utf-8 kodlaması: \xc5 \x9f şeklinde gösteriliyor.
Buradaki "şarkıcı" kelimesinin uzunluğuna baktığımızda ise

>>> s.__len__()
10

yanıtını alırız. Buradanda anlayacağımız gibi ş, ı karakterleri unicode da 2 bytelık karakter seti olarak ifade ediliyor ve ilk baktığımızda uzunluğunun 7 olduğunu düşündüğümüz kelimenin uzunluğu 10 oluyor.

Sonuç olarak UTF-8 Unicode karakterlerini 1-6 byte uzunluğunda diziler olarak kodluyor. ASCII'deki 0-127 arasındaki karakterler UTF-8 de kendi kodları ile kullanılıyor, diğerleri ise byte dizileri haline gelir. UTF kullanılarak 1 milyondan fazla karakter kodlanabiliyormuş:)

KAYNAK: