DevVeri.com

Boğulacaksan büyük veride boğul!

Hadoop

Hadoop, sıradan sunuculardan (commodity hardware) oluşan küme (cluster) üzerinde  büyük verileri işlemek amaçlı uygulamaları çalıştıran ve Hadoop Distributed File System (HDFS) olarak adlandırılan bir dağıtık dosya sistemi ile Hadoop MapReduce özelliklerini bir araya getiren, Java ile geliştirilmiş açık kaynaklı bir kütüphanedir. Daha yalın bir dille anlatmak gerekirse, Hadoop, HDFS ve MapReduce bileşenlerinden oluşan bir yazılımdır.

HDFS sayesinde sıradan sunucuların diskleri bir araya gelerek büyük, tek bir sanal disk oluştururlar. Bu sayede çok büyük boyutta bir çok dosya bu dosya sisteminde saklanabilir. Bu dosyalar bloklar halinde (varsayılan 64MB) birden fazla ve farklı sunucu üzerine (varsayılan 3 kopya) dağıtılarak RAID benzeri bir yapıyla yedeklenir. Bu sayede veri kaybı önlenmiş olur. Ayrıca HDFS çok büyük boyutlu dosyalar üzerinde okuma işlemi (streaming) imkanı sağlar, ancak rastlantısal erişim (random access) özelliği bulunmaz. HDFS, NameNode ve DataNode süreçlerinden (process) oluşmaktadır.

NameNode ana (master) süreç olarak blokların sunucular üzerindeki dağılımınından, yaratılmasından, silinmesinden, bir blokta sorun meydana geldiğinde yeniden oluşturulmasından ve her türlü dosya erişiminden sorumludur. Kısacası HDFS üzerindeki tüm dosyalar hakkındaki bilgiler (metadata) NameNode tarafından saklanır ve yönetilir. Her kümede yalnızca bir adet NameNode olabilir.

DataNode ise işlevi blokları saklamak olan işçi (slave) süreçtir. Her DataNode kendi yerel diskindeki veriden sorumludur. Ayrıca diğer DataNode’lardaki verilerin yedeklerini de barındırır. DataNode’lar küme içerisinde birden fazla olabilir.

Hadoop MapReduce ise HDFS üzerindeki büyük dosyaları verileri işleyebilmek amacıyla kullanılan bir yöntemdir. İstediğiniz verileri filtrelemek için kullanılan Map fonksiyonu ve bu verilerden sonuç elde etmenizi sağlayan Reduce fonksiyonlarından oluşan program yazıldıktan sonra Hadoop üzerinde çalıştırılır. Hadoop Map ve Reduce’lerden oluşan iş parçacıklarını küme üzerinde dağıtarak aynı anda işlenmesini ve bu işler sonucunda oluşan verilerin tekrar bir araya getirilmesinden sorumludur. Hadoop’un gücü işlenen dosyaların her zaman ilgili düğümün (node) yerel diskinden okunması ile ağ trafiğini meşkul etmemesinden ve birden fazla işi aynı anda işleyerek doğrusal olarak ölçeklenmesinden geliyor diyebiliriz. Yani aşağıdaki grafikte olduğu gibi Hadoop kümesindeki düğüm sayısı arttıkça performansı da doğrusal olarak artmaktadır.

MapReduce, JobTracker ve TaskTracker süreçlerinden oluşur. JobTracker yazılan MapReduce programının küme üzerinde dağıtılarak çalıştırılmasından sorumludur. Ayrıca dağıtılan iş parçacıklarının çalışması sırasında oluşabilecek herhangi bir problemde o iş parçacığının sonlandırılması ya da yeniden başlatılması da JobTracker’ın sorumluluğundadır. TaskTracker, DataNode’ların bulunduğu sunucularda çalışır ve JobTracker’dan tamamlanmak üzere iş parçacığı talep eder. JobTracker, NameNode’un yardımıyla DataNode’un lokal diskindeki veriye göre en uygun Map işini TaskTracker’a verir. Bu şekilde verilen iş parçacıkları tamamlanır ve sonuç çıktısı yine HDFS üzerinde bir dosya olarak yazılırak program sonlanır.

Hadoop şu anda Yahoo, Amazon, eBay, Facebook, Linkedin gibi birçok lider firmada büyük verileri analiz etmek amacıyla kullanılıyor (Tam listesine buradan ulaşabilirsiniz). Hadoop projesini geliştiren, bu konuda eğitim ve danışmanlık hizmetleri sunan Hortonworks, Cloudera, MapR gibi firmalar mevcuttur.

Bunlar dışında Hadoop projesi büyük verileri işleme konusundaki diğer projelere bir çatı görevi görüyor. Hadoop projesinin altında Avro (veri dizileştirme (serialization) sistemi), Cassandra (yüksek erişilebilir, ölçeklenebilir NoSQL veritabanı), HBase (Hadoop üzerinde çalışan, büyük veriler için ölçeklenebilir, dağıtık NoSQL veritabanı), Hive (büyük veriler üzerinde iş zekası sistemi), Mahout (ölçeklenebilir yapay öğrenme (machine learning) ve veri madenciliği kütüphanesi), Pig (paralel hesaplamalar için yüksek düzeyli bir veri akışı dil ve yürütme kütüphanesi), ZooKeeper (dağıtık uygulamalar için yüksek ölçekli koordinasyon uygulaması) projeleri geliştiriliyor.

Sitemizde amacımız Hadoop başlığı altında toplanan bu teknolojileri incelemek ve tecrübelerimizi paylaşmaktır.

Kaynaklar:
http://www.javacodegeeks.com/2011/05/hadoop-soft-introduction.html
http://mycloudresearch.wordpress.com/2012/03/14/simple-hadoop-overview/
http://bickson.blogspot.com/2011/03/tunning-hadoop-configuration-for-high.html

23 thoughts on “Hadoop

  • umut YILMAZ dedi ki:

    Hakan bey öncelikle makale gerçekten anlaşılır ve tatmin edici olmuş. Sizden konu ile alakalı bir sorum olacak ilgilenirseniz memnun olurum.
    Yazmış olduğum bir projede veri akışının saniyede 2000 olduğu yani yoğun insert işleminin olduğu ve bu veriler üzerinden raporların alındığı yani select
    işlemininde olduğu bir sistem tasarlamak istiyorum. Bunun için Solr kullandım ancak pek tatmin etmedi, sonra mongodb kullandım açıkcası o solrdan da performans olarak kötü. Hadoop üzerinden test etmek istiyorum ancak hadoop direk mi kullanmalıyım yoksa hadoop üzerinden geliştirilmiş olan Cassandra, HBase gibi uygulamalar mı kullanmalıyım. Ben Hadoop’u Lucene’na HBase ve Cassandra gibi uygulamaları da Solr’a benzetiyorum, umarım doğru anlamışımdır hadoop yapısını.
    Sizden ricam bu tasarlamak istediğim sistem için hadoop teknolojisinin işimi görüp görmeyeceği ve eğer işimi görürse onu nasıl uyarlayacağım konusunda fikir vermeniz.
    Şimdiden çok teşekkür ederim.

    • Hakan İlter dedi ki:

      Selam,

      Oncelikle sunu soyleyim, Solr bir nosql gibi kullanilabilir gibi gorunse de aslen full-text arama icin tasarlanmis bir proje. Bu sebeple Solr uzerinden dokumanlara erisim gercekten cok performansli, zaten isi bu. Fakat Solr real-time update edilmeye uygun degil, dolayisi ile sizin durumunuzda uygun bir cozum degil. Sizin bir db ya da nosqldb kullanmaniz daha anlamli.

      MongoDB’den veriyi ne sekilde okumaya calistiginizi bilmiyorum ama normalde MongoDB gayet yuksek performansli calisan bir nosql veritabani, belki sorgularinizi ya da indekslerinizi kontrol etmeniz gerekebilir.

      Aslinda secim daha ziyade nasil ve ne siklikta rapor alacaginiz ile cok ilgili.

      Sizin durumunuzda bana en uygun gene MongoDB gibi geliyor. Okuma-yazma hizi yuksek, MapReduce destegi de oldugu icin veriler uzerinden rapor da cekebilirsiniz.

      Tabi diger secenekler de denenerek en optimum cozum de uygulanabilir.

      Benzer bir sistemi ben 4-5 sene once mysql ile yapmistim, gercekten iskence olmustu. Simdiki aklim olsaydi muhtemelen MongoDB ya da Cassandra kullanirdim.

      • Can dedi ki:

        Hakan Bey merhabalar,

        Örnek veriyorum elimde aşağıdakine benzer 25.000 adet web sayfası ve 125 milyon alt URL var…

        http://www.r10.net/php/1172376-gunde…mumkun-mu.html

        Bizim yapmak istediğimiz de bu 25.000 adet web sayfasında almak istediğimiz alanların taglarını sisteme gireceğiz, sonra bot(lar) tüm url’lere giderek verdiğimiz taglar arasındaki verileri alacak ve veritabanına kaydedecek. (Başlık – Resim – Açıklama) gibi.. Resim yok bu arada örnekti sadece. Herhangi bir resim veya video çektirmeyeceğiz. Tamamen text tabanlı olacak.

        Eğer gidilen url’ye daha önce girilmiş ise tekrar tekrar tüm veriyi taratmaktansa, (iş yükünü hafifletmek için) sadece konuda değişiklik var mı diye baktırarak update ettireceğiz. Yani ikinci girişlerde sadece tek bir tagı aldıracağız. Eğer sistem ikinci kez aynı url’ye giriyorsa tek tagı alıp çıkacak. (değişiklik olmasa da update olabilir, değişikliği algılatmak sistemi çok yorabilir.) Bu arada geçmişte girdiği bir siteye ulaşamıyor veya ilk kez giriş yapacağı bir siteye ulaşamıyorsa 404vs.. gibi hata kodunu alarak geri dönmesini istiyoruz. Sonraki yapacağımız manuel değerlendirme ile bir süre sonra bot(lar)ı sisteme tekrar gönderebiliriz.

        Daha da açıkcası işin en genel hali ise, bir arama motoru yapmak istiyoruz. Fakat sadece tek bir alanda tarama yapacak. Tüm interneti taratmaya zaten gücümüz yetmez. Bizim amacımız blogları taratarak DB’ye kaydetmek. Yerel bir kütüphane oluşturmak peşindeyiz.

        Beni burada korkutan 2 temel unsur var…

        1. 25bin adet sitenin ve 125 milyon adet URL’nin haftada en az 1 kere update olması gerekiyor. Site yayından kalkmışsa konuların silinmesi ve pasif hale gelmesi gerekiyor. Haftada 125 milyon url de günlük kabaca 20 milyon url yapıyor. Ayrıca 25bin sitenin hergün kontrol edilerek site kapandığında sistemde pasife düşürmek gerekiyor.

        2. 7-8 sutun ve 125 milyon satırdan oluşan bir mysql sistemde anlık yüzlerce belki binlerce insan arama yapmak adına sorgu gönderirse ne olur düşünemiyorum. Varnish tarzı cacheleme sistemleri kurtarır mı?

        Böyle bir sistem için sizin DB yönünde tavsiyeleriniz ve Server Client için tavsiyeniz ne olur?

        Yardımınız ve cevabınız için teşekkür ederim.

  • yusuf aytac dedi ki:

    yazı çok faydalı teşekkür ederim.

  • emrah dedi ki:

    Çok faydalı bir yazı olmuş teşekkürler

  • tahsin dedi ki:

    Öncelikle bu alanda vermiş olduğunuz destek ve yardımlarınız için teşekkür ederim.
    Recommender Systems ve Apache Mahout hakkında paylaşımlarınızı bekliyoruz. Öneri sistemleri önemli ve geniş bir konu. Ancak aydınlatıcı ve Türkçe kaynak da bulmakta zor. Bu alanda araştırmalar yapmaya devam ediyorum sizinde paylaşım ve katkılarınızı bekliyorum.

  • Kamil dedi ki:

    Merhabalar başarılı bir yazı olmuş teşekkürler. Hakan Bey

  • Metin BARUT dedi ki:

    Teşekkür ederim,
    Akıcı ve anlaşılır ifadeler ile sunduğunuz makalenizi çok beğendim.
    Benim için Hadoop’un HDFS gücü ile Big data dahada anlaşılır oldu.

  • Tolga dedi ki:

    Anlaşılır bir dil ve kusursuz şekilde açıklanmış bir konu. Çok az kaynağın bulunduğu bu konuda güzel bir paylaşım.emeğinize sağlık

  • Ali Yılmaz dedi ki:

    Öncelikle teşekkürler.

    Yoğun işlemlerin yapıldığı (okuma, yazma. güncellem vs.) bir veri tabanı var. Artık milyonlarca da kayıt oluştu. Bir sorgu yaklaşık olarak 3 dk da geliyor. Bu veritabanını (RDBMS) hızlandırmanın yollarına bakıyorum. Sizce ne yapmalıyım.

    Veritabanını NOSQL e taşımak mı gerekiyor.
    Hadoop ile dağıtık dosta mimarisini kullanarak bişeyler yapabilir miyim?
    Hadoop RDMS le ile birlikte kullanılabiliyor mu?
    Neo4j database nosql çözümlerinden daha performanslı mı? Hadoop u neo4 ile nasıl kullanırım?

    • Hakan İlter dedi ki:

      Malesef hiçbir teknoloji sihirli deynek olmadığı için ihtiyacınız tam olarak neyse ona uygun teknolojiden faydalanmak gerekli.

      Yoğun okuma, az yazma olsaydı hızlı sorgular için Impala, Presto tarzı bir teknoloji daha uygun olurdu. Benzer şekilde yoğun yazma az okuma olsaydı o zaman Cassandra daha uygun olabilirdi.

      Her ikisi de fazla ise, verinin büyüklüğüne göre de HBase (+Phoenix) uygun olabilir.

  • Gayet temiz ve açıklayıcı bir yazı olmuş teşekkürler.

  • Hasan dedi ki:

    bu konu ile ilgili internet üzerinden ücretli eğitim veriliyor. isteyen arkadaşlar için: https://www.coursera.org/courses?query=big%20data

  • Fatih dedi ki:

    Öncelikle verdiğiniz yararlı bilgilerden dolayı teşekkür etmek istiyorum. Benim ortalama 300 TB boyutunda veri tabanı oluşturmamı gerektiren bir projem var. Bu veri tabanına anlık olarak yoğun okuma ve yazma işlemleri yapılacak, hem okuma hem de yazma işlemleri yoğun olacak. Bunun haricinde kullanıcı bazında da günlük milyonlarca tekil sorgu gerçekleştirilecek. Böyle büyük bir sistem için hangi NoSQL platformunu kullanmamı tavsiye edersiniz? Ayrıca bu tür bir sistem için donanım tavsiyesi olarak SSD şart mıdır yoksa maliyet düşünüldüğünde HDD bazında da kurulabilir mi? Teşekkürler.

    • Hakan İlter dedi ki:

      Eğer tekil sorgular id bazında yapılacaksa, kompleks değilse ve SSD kullanmak istemiyorsanız HBase sizin için uygun olabilir. Kompleks sorgular olacaksa MongoDB veya HBase+Phoenix deneyebilirsiniz.

  • Burak dedi ki:

    Hakan bey öncelikle merhaba;
    Şöyle bir çalışma yapmak istiyorum daha doğrusu birazdan bahsedeceğim konu hakkında yapılmış bir çok çalışma olduğunu biliyorum fakat daha şu an o keywordleri hatırlamadığım için google a derdimi anlatamadım.

    İstediğim şey bir cümledeki kelimeleri anlamlandırmak. Örnek vermek gerekirse bir cümle gireceğim bununla ilgili bana geri ölçek bazında geri dönüş yapacak. Ya da başka bir örnek vermek gerekirse mesela twitterda popüler hashtag leri çekip atılan twitlere göre belli başlı kategorilerde(his, temenni vb.) puanlar oluşturacak. Bu sayede bazı analizleri yapabilmeyi umuyorum. Umarım anlatabilmişimdir. Bu tür işlemler için daha farklı yollar mevcutsa; isimlerini bile paylaşmanız benim için yeterli olacaktır.

    Ayrıca sitenizi çok beğendim. Başarılarınızın devamını dilerim.

  • bora dedi ki:

    Hakan bey merhaba,
    yazılarınız yalın ve açıklayıcı öncelikle bilgiler için teşekkürler.

    asgari 500K row ilişkili tablo ve master tablonun 45 kolonlu olduğu bir sql db ve bu yapıya az da (günlük 100) olsa veri inserti olmakla birlikte çok daha ağırlıklı client bazında görsel veri analizi ve hesaplamalar yapacak bir yapıya geme ihtiyacım bulunmakta. Bunun için jhipster + mongodb üzerinde elasticserarch ile BI pluginleri ile bir yapı kurgulamaya çalışıyorum. Burada db seçimi konusunda yorumunuz olursa sevinirim.

  • Ece dedi ki:

    Çok güzel bir şekilde konuyu özetlemişsiniz, çok yararlı oldu teşekkürler.

  • ismail cenk yilmaz dedi ki:

    Merhaba arkadaşlar
    Hadoop’da performans, yük ve germe testi yapabileceğim herhangi bir tool var mı ????
    Şimdiden yardımcı olan arkadaşlar çok teşekkürler.

  • TuğbaDenizci dedi ki:

    İlk araştırmada böyle süper bir yazı ile karşılaşmak herkese nasip olmaz. Teşekkürler 🙂

Bir Cevap Yazın

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