Hadoop

Dağıtık sistemlerde en çok kullanılan program Hadoop’tur. Hadoop, Java programlama dilinde yazılmış framework’tür. Amacı Google Dosya Sistemi teknolojisi olan Map-Reduce algoritmasını birçok bilgisayara dağıtarak uygulayı sağlamaktır.

Google, Yahoo ve Facebook gibi şirketler devasa boyutlarda veriyi analiz etmek için artık SQL, RDBMS kullanmıyorlar. Hadoop adlı  anahtar-değer tekniğini kullanan bir ürünü kullanıyorlar. Arama motoru pazarında başarılı olmak öncelikle teknolojik altyapının dağıtımlı çalışmasından geçiyor. Yani bütün arama, depolama, ve indeksleme gibi işleri birden fazla bilgisayara dağıtarak yapmak. Hatta böyle bir altyapısı olduğu için Google’dan aslında bir dağıtımlı bilgisayar şirketi diye bahsedilir. Yani herkes internetten bilgileri toplayıp depolayabilir ama bunu yüksek performansta yapmak yükü bir bilgisayar tarlasına dağıtabilmekten geçiyor. Bilgisayarlar arasındaki bu iş bölümünü Google kendi geliştirdiği MapReduce denilen bir yazılım platformu ile yapıyor. Ancak MapReduce ile aynı işi yapan ve açık kaynaklı olan bir yazılım platformu daha var: Hadoop.

Hadoop’un temelindeki teknik “eşle/indirge (map/reduce)” adindaki bir tekniktir. Bu teknik Apache tarafindan open source ortama getirildi ve Hadoop bu şekilde dünyaya geldi. Teknolojinin çıkış noktası Google; bu şirketin Web’den çektiği terabaytlarca veriyi analiz etmesi gerektiği için eşle/indirge teknolojisini geliştirdiler, geliştirmeye mecbur oldular.

Eşle/indirge nedir? Online tabanlarda anahtar değeri belli bir makinaya yönlendirmek için kullanılıyor. Eşle/indirge tabanlarında ise, anahtar değeri eşle sürecinde her node(düğüm) üzerindeki veriye bakılarak bir “özet” çıkarmak için kullanılıyor. Indirge sürecinde ise her ayrı node’daki anahtar-deger çiftleri alınarak uyuşan anahtarlar bir daha birleştiriliyor. Bu son birleşim bize nihai sonucu veriyor.

Hadoop, yatay olarak ölçeklenebilen bir teknoloji, bu sebeple kümedeki her makina kendi verisine sahip, yani tüm işlem o makinaya yerel. Aynı online dünyada oldugu gibi (mesela Voldemort) her node kendi verisini çöküşten kurtulmak amacıyla kümede birkaç diger bilgisayara yedek olarak gönderebilmekte. Hadoop’ta değişik olan bir “idare edici” yani “görev verici” makinanın olması. Burada bir mahsur yok; Eşle/indirge arka planda çalışan bir teknoloji olduğu için dağıtıcı kondüktör sistem, eger iyi tasarlanmışsa, bir hassas nokta haline gelmez. İşin en ağır kısmı zaten kümedeki işlemci nodelar tarafindan üstlenmekte. Hadoop’ta yapılacak işlemler tipik olarak bir “Job” olarak yazılıyor. Job’ınızı yazıyorsunuz, ve Hadoop kümenize veriyorsunuz.

Bir örnek düşünelim: Elimizde koca bir dosya var, bu dosyada her satırda bir meyve ismi, ve o meyve satın alındığında ne kadar para ödenmiş olduğu yazılı olsun (alttaki koca bir dosya değil ama olduğunu düşünelim). Amacımız her meyve için toplam ne kadar harcandığını bulmak.
armut 10
portakal 3
incir 9
armut 9
armut 10
incir 3
mandalin 2
erik 29

Burada anahtar değerleri meyve isimleri olacak. Diyelim ki Hadoop kümemizde 2 node var, ve üstteki dosyayı Hadoop’a verdik.

Hadoop bu dosyayı iki eşit parcaya bölecektir (anahtar değerlerine hiç bakmadan, burası online’dan farklı), ve diyelim ki bölünme tam ortadan yapıldı:
armut 10
portakal 3
incir 9
armut 9
—-
armut 10
incir 3
mandalin 2
incir 29

Her node, kendi içinde “eşle” yaparken, benzer anahtar degerlerini aynı toplama yazacak. Bölüm 1) armut = 19, portakal = 3, incir = 9. Bolum 2) armut 10, incir = 32, mandalin = 2.

Her bölümün işi böylece bitiyor, yani eşle sahfası sona eriyor. Bundan sonra “indirge” kısmında her bölümdeki anahtarlar bir de kendi aralarında toplanıyorlar. Böylece armut = 29, portakal = 3, incir = 41, mandalin = 2. Bu en son sonuç.

Aktarılan bilgilere göre, saşırtıcı derecede çok sayıdaki analiz işlemi, üstteki eşle/indirge mentalitesine uyarlanabilmektedir.

Haberdar olunması gereken müthiş örneklerden biri, makina ögrenimi algoritmalarının aynı eşle/indirge sistemine uyarlanabilmiş olmasıdır. Mahout projesi bunu open source ortamına taşımaya aday oldu. Rapor edilen sonuçlara göre eklenen her mikroişlemci core’u (Hadoop node’u gibi) eşle/indirge ile kodlanmış makina ögrenimi algoritmasını bir o kadar hızlandırmaktadır. Yani performans kazanımı “lineer” şekilde artabilmektedir. Her eklenen core bir o kadar hızlanma getirmektedir.

Hadoop’un Google’un MapReduce’undan en büyük farkı tabii ki açık kaynaklı olması. Dolayısıyla Hadoop kullanarak isteyen herkes Google kadar hızlı çalışabilen bir arama motoru yapabilir, tabii bir miktar bütçeyle bir bilgisayar tarlası kurabiliyorsanız. Burada durup bir kere daha düşünün. Hadoop açık kaynaklı olduğundan Google’a bir değil binlerce rakip çıkabilir.
MapReduce işlemleri küçük parçalara bölüyor ve farklı bilgisayarlara dağıtıyor, sonra işlenenleri toplayıp sonucu veriyor.

Hadoop giderek bir endüstri standardı olmaya başlıyor. Mesela Facebook Hadoop kullanarak kullanıcı davranışlarının analizini yapıyor (50 milyon kişi ve ilişkileri) ve sosyal reklamların etkisini ölçüyor. Geçtiğimiz aylarda New York Times bilgi işlem ekibi Hadoop kullanarak 150 yıllık arşivindeki 11 milyon makaleyi dijitalleştirdi ve aranabilir hale getirdi. Normalde aylar sürebilecek bilgi işleme bir kaç günde bitirildi. Amazon ile Hadoop kullanarak EC2 (dağııtmlı işlemci) ve S3 (dağıtımlı depolama) servislerinden faydalanabilirsiniz.

Hadoop projesini başlatan Doug Cutting aynı zamanda Yahoo ArGe bölümünde çalışmaya başladı, haliyle Yahoo içinde arama dahil bir çok başka bilgi işleme sisteminin performansını geliştiriyor. Daha fazla geliştiricinin katılmasıyla Hadoop giderek daha da iyileşiyor ve tabii üniversitelerde de yayılmaya başlıyor. Hadoop kullanabilmek / programlayabilmek önemli bir beceri haline geliyor. Sonuçta Hadoop kullanabilen yeni mezunlar piyasaya çıktıkça sadece Google gibi şirketler değil daha fazla kişi veya şirket yüksek performanslı iş yapabilecek.

Bir zamanlar dağıtımlı bilgisayar sistemlerine bilgisayar tarlası denilmekteydi, bugünlerde ise bilgisayar bulutu (“cloud computing”) diyoruz. Çok daha dinamik bir dünyanın tasviri bu. Nasıl bugün herkesin kişisel bilgisayarı varsa yakında hepimiz günlük hayatımızdaki bilgileri düzenleyebilmek için bilgisayar bulutu kullanıyor olabiliriz. Aslında yaptığımız her Google aramasında kullanıyoruz bile.

Paralel Programlama(Hesaplama) Temelleri
Posted in Distributed Systems, Parallel Computing by Burak IŞIKLI on 18 Ocak 2010

Paralel hesaplama en basit şekliyle şöyle tarif edebiliriz. Bir problemi çözmek için kaynaklaı eşzamanlı çoklu olarak kullanmaktır. Örneğin bir integrali hesaplamak için iki bilgisayarı veya iki işlemci(çekirdeği) kullanarak yapabiliriz. Bu örnekleri çoğaltabiliriz. Fakat paralel programlama yaparken dikkat edeceğimiz ilk önemli konulardan biri mimarilerdir. Bu konuda şöyle bir yasa vardır:
Moore Yasası:
Intel şirketinin kurucularından Gordon Moore’un 19 Nisan 1965 yılında Electronics Magazine dergisinde yayınlanan makalesi ile teknoloji tarihine kendi adıyla geçen yasa.
Her 18 ayda bir tümleşik devre üzerine yerleştirilebilecek bileşen sayısının iki katına çıkacacağını, bunun bilgisayarların işlem kapasitelerinde büyük artışlar yaratacağını, üretim maliyetlerinin ise aynı kalacağını, hatta düşme eğilimi göstereceğini öngören deneysel (ampirik) gözlem. Bu gözlem kendini doğrulamıştır. Bu durumda bu teoriye göre tasarım karmaşıklığı, performans artışının nasıl olacağı, ölü alanlarla ne yapacağız gibi engeller önümüze çıkıyor. İşte bu noktada paralellik önümüze çıkıyor.
Paralel sistemlerin birçok kullanım alanı vardır. Hava tahmini modelleme, termonükleer proses, fizik, kimya, biyoteknoloji, matematik, veri madenciliği, web indeksleme, veritabanları gibi birçok alanda kullanılıyor.
Paralel programlama başlamadan önce bazı dar boğazları aşmamız gerekiyor:

Bu konuyu 3 farklı şekilde çözebiliriz:
* Multiple Datapath(Çoklu Veriyolu)
* Multiple Memory Units(Çoklu Hafıza Birimleri)
* Multiple Processing Units(Çoklu İşlemci Birimleri)
Bu konuda sıkça kullanılan iki mimari mevcuttur.
1-) SIMD(Single Instruction Multiple Data): Bir kontrol birimini(bir direktif) farklı veri setlerinde işlem yapılarak sonuca ulaşılıyor. Yani bir programımız olurken, programlarımız aynı veri setini kullanıyor.
2-) MIMD(Multiple Instruciton Multiple Data): Farklı direktifleri farklı veri setlerine işlem yaparak sonuca ulaşılıyor. Yani birden fazla programımız farklı veya bölünmüş veri setinde işlem yapıyor.
Bu mimarilerden istediğimiz birini kullanarak darboğazı aşabiliriz. Programlamaya başlamadan önce bize uygun paralel mimarimizi seçtikten sonra hangi paralel algoritmayı kullanacağımıza karar vermemiz gerekiyor.

Paralel Algoritmalar:
– Data Paralel
– Task-Graph
– Work Pool
– Master Slave
– Pipeline
– Hybrid
Bu algoritmaları araştırarak detaylı bulabilirsiniz. Ben zamanı geldikçe anlatacağım. Bize uyan paralel algoritmayı da seçtikten sonra programlamaya geçebiliriz. Literatürde kullanabileceğimiz iki paralel programlama modeli vardır.
* Message-Passing
* Shared Adress Space

1-) Message-Passing
* Genelde büyük çaptaki bilgisayar sistemlerinde kullanılan program türü(Örneğin Cluster sistemlerde)
* Paylaştırılmış adres alanı
* Implicit paralelleme
* Proses etkileşimi veriyi gönderip alarak sağlanıyor
* Haberleşme mesajları gönderip alarak sağlanıyor
* Primitive
+ Send
+ Recieve
+ Blocking vs non-blocking
+ Buffered vs non-buffered
* En iyi bilinen bu konuda kullanılan kütüphanesi MPI(Message-Passing Interface)

2-) Shared Address Space
* Genelde SMP makinalarda kullanılır.(Multicore chip)
* Paylaşılmış adres alanı
* Thread
* Shmget/shmat unix operasyonları
* Explicit Paralelleştirme
* Proses/Thread haberleşmesi ile iletişim sağlanır.
* Memory oku/yaz ile haberleşme gerçekleşir.(Örnek x++;)
* En iyi bilinen bu konuda kullanılan kütüphanesi POSIX Thread(PThreads) API
+ Thread oluşumu ve silinmesi
+ Thread yönetimi
+ Senkronizasyon

Paralel Programlama Görünmez Tehlikeleri(Pitfalls)

– Senkronizasyon
+ Deadlock
+ Livelock
+ Fairness
– Verimlilik
+ Paralelleştirmeyi maksimum hale getirmek
– Güvenilirlik
+ Doğruluk
+ Debugging

Kaynak: burakisikli.wordpress.com

Cevapla

E-posta adresiniz yayınlanmayacak. Gerekli alanlar işaretlenmelidir *

*

bool(false)