Apache Flume, Apache Kafka Karşılaştırması ve Spark Streaming

Apache Flume, Apache Kafka Karşılaştırması ve Spark Streaming

Bu blog yazısını daha önceleri kendim de epeyce birbiriyle karıştırdığım üç teknolojinin farklarından bahsedeceğim.

Bu teknolojiler Apache Flume, Apache Kafka ve Spark Streaming.

Hangisi ne işe yarıyor, hangi durumlarda hangisini seçeceğimize nasıl karar vereceğiz? gibi soruların yanıtlarını birlikte arayacağız.

Ancak önceden belirtmek isterim ki bu yazı daha önce Apache Flume ve Apache Kafka hakkında hiç bilgisi olmayanlar için ileri düzey kalacaktır.
Yeni öğrenenler için daha önce yazdığım Apache Flume ve Apache Kafka ile ilgili ayrıntılı blog yazılarıma üzerlerini tıklayarak erişebilirsiniz.
Bu yazıda her iki teknolojinin de çok ayrıntılarına değinmeyeceğim.

Kısaca özetleyelim;

Apache Flume: Büyük miktarda günlük verileri verimli bir şekilde toplamak, bir araya getirmek ve taşımak için yazılmış, Apache projesi olarak geliştirilmiş bir araçtır. Kaynaktan hedefe veri aktarma sistemi’dir. Real-time(gerçek zamanlı) veriler için tasarlanmış basit, esnek ve güvenli bir mimariye sahiptir. Ayarları değiştirilerek, uygulamanıza göre uyarlanarak çalıştırılabilir, sağlam ve hataya dayanıklıdır.
Source, Channel, Sink gibi bileşenlere sahiptir.

Apache Flume Mimarisi

Source(Kaynak), aktarılacak olan verinin ilk karşılandığı yerdir ve verileri eventlara dönüştürerek Channel’lara gönderir. Channel(Kanal), Source’un gönderdiği eventları bir Sink(Hedef)’e aktarılana kadar depolandığı yerdir. Sink ise kendisine gelen event’ları Source’dan kaldırarak HDFS’e depolamaktan sorumludur. (Detaylarını öğrenmek için tıklayın.)

Şimdi ise biraz Apache Kafka’ya değinelim

Apache Kafka: Büyük veriler ile çalışabilen, ölçeklenebilir, dağıtık sistemlere uygun, anlık toplanan veriyi hızla ve hatasız bir biçimde aktarabilen, Publish-Subscribe (Yayın-Abone) yöntemini kullanan bir mesajlaşma sistemi’dir.

Apache Kafka Mimarisi

Üreticilerden(producer) alınan veriler Kafka Cluster’ile  tüketicilere(consumer) sunuluyor. (Detaylarını öğrenmek için tıklayın.)

Peki Flume ve Kafka’nın birbirinden farkı nedir?

  • Flume, yukarıda da bahsettiğim gibi veriyi kaynaktan hedefe göndermek tek amacıdır. 
  • Kafka, yayın-abone mesajlaşma sistemi mantığı ile hareket ederek herhangi bir kaynaktan alınan veri, bir veya birden çok dinleyici tarafından edinilebilir. Böylece mesajların(verilerin) iletilmesi çeşitli kanallarda paralel olarak gerçekleşebilir.
  • Flume, Hadoop ekosisteminde geliştirilmiştir. HBase ve HDFS veri aktarımı yapmak için tasarlanmıştır.
  • Kafka ise mesajlaşma gerektiren herhangi bir sistem için kullanılabilir. (Örneğin web sitesi etkinlik takibi, operasyonel ölçümler, akış işleme vb.)
  • Flume, verileri aktarırken herhangi yedekleme sistemi kullanmaz bir agent’taki channel bileşeni verileri sink’e aktarana kadar kendi içinde depolar ancak flume agent’ı bir sebepten dolayı bozulursa veri kaybı yaşanması olasıdır.
  • Kafka, partitionların yedeklerini(replica) alır ve dolayısıyla herhangi bir hata olması durumunda veri kaybı yaşanmasının önüne geçilir. Kafka’da tüketicilerde(consumer) veri alımından dolayı taşmalar olduğunda dahi veri kaybı yaşanmasını engellemek için (yine kullanıcı tarafından belirlenebilen) gün sayısı kadar süre boyunca veriler Kafka’da tutulur ve uygun olduğu zaman consumer’lara dağıtma işlemi devam ettirilebilir. Kafkada depolanan bu verilere, herhangi bir diliminde, herhangi bir veya birden fazla consumer ulaşabilir.

Not: Bunların bir arada kullanıldığı bir Flafka diye bir teknoloji daha var ancak onun ayrıntılarına girmeyeceğim.

Flume ve Kafka’nın nerelerde birbirinden ayrıldığını inceledik.

Peki ya Spark Streaming Nedir?

Yine bir Apache ürünü olan ve verileri gerçek zamanlı (real-time) olarak analiz etmeyi sağlayan bir araçtır. Java, Scala, R ve Python dillerini destekler.

Spark Streaming, canlı veri akışı işlemlerini ölçeklenebilir, yüksek verimli, hataya dayanıklı biçimde  ve dağıtık olarak çalışmayı sağlayan Spark API’nin bir uzantısıdır.

Yani tanımından anlaşıldığı üzere verileri bir kaynaktan başka bir hedefe aktarmakla değil bir kaynaktan aldığı verileri gerçek zamanlı işlemekle görevlidir.

Flume, Kafka, Kinesis, HDFS veya TCP soketleri gibi bir çok kaynaktan veri alabilir ve bu aldığı verileri map, reduce, join ve window gibi üst düzey fonksiyonları kullanarak işleyebilir. Spark’ın makine öğrenimi (MLib) ve grafik işleme (GraphX) algoritmalarını da Spark Streaming ile birlikte kullanabilirsiniz.

Son olarak, işlediği verileri dosya sistemlerine, veritabanlarına ve canlı dashboard’lara aktarabilir. Bu çalışma prensibi aşağıdaki görselde olduğu gibidir.

Spark Streaming, gerçek zamanlı gelen inputları alır ve verileri toplu işlere böler. Daha sonra parçalara ayırdığı sonuçları, son akışını oluşturmak için Spark Engine’e gönderir. Spark Engine’de depolanmak üzere verileri dosya sistemleri, veritabanları ve dashboardlara gönderilir. Bununla alakalı daha ayrıntılı bir yazı yazacağım ancak isterseniz bu linki tıklayarak ayrıntılarına bakabilirisiniz.

Hangi teknolojiyi kullanmamız gerektiğine nasıl karar verelim?

Bunun için kararı projenizin ihtiyaçlarına göre siz belirlemelisiniz. Ancak hangi projelerde daha çok hangi teknolojiler kullanılıyor bir kaç cümle ile örnekleyelim;

  • Eğer Twitter’dan gelen verileri çekip HDFS’e (Hadoop Distributed File System) aktarmak istiyorsanız. Yani kaynağınız canlı ve her an değişebilen bir kaynak ise ve ufak tefek veri kaybetme kaygıları taşımıyorsanız Flume’u kullanabilirsiniz.
  • Diyelim ki MongoDB’de milyonlarca önemli kişi/ürün/stok/sensör vs. verileriniz var ve siz bu verileri oradan alıp farklı bir NoSQL veritabanına veya bir dağıtık dosya sistemine taşımak istiyorsunuz ve bu verilerin ‘kaybolmamasını önemsiyorsunuz’. O halde burada Kafka kullanmanız sizin için faydalı olacaktır.(Kafka ile aynı zamanda Flume’un yaptığı gibi veriyi bir yerden alıp HDFS’e kaydetmek için de kullanabilirisiniz. Yukarıdaki cümlede HDFS harici farklı bir kaynağa veri aktarımı sağlayabileceğini örneklemek istedim.)
  • Son olarakta onlarca sensörünüzün olduğunu bir sistemde, sensörlerden gelen verileri anlık olarak belli işlemlere tabi tutmayı değerlerin ortalamasını alıp, bir bazı verileri arttırıp/azaltmak  ve bu işlemlerden sonra sonucu bir arayüz ile raporlamak istediğinizi düşünelim. Bunun için Kafka aracından faydalanabilir eriştiğiniz verileri de Spark Streaming’ akıtıp Spark Streaming ile birlikte istediğinize uygun biçimde işleyebilirsiniz.

Flume, Kafka ve Spark Streaming teknolojileri ve bunlar arasındaki ortak ve farklı yanları anlattığım blog yazımı bu kadardı.

Umarım sizin için faydalı bir yazı olmuştur.

İyi çalışmalar dilerim.

“Apache Flume, Apache Kafka Karşılaştırması ve Spark Streaming” için bir cevap

Bir Cevap Yazın

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