Gerçek Hayatta Bir Veri Bilimi Projesi Nasıl İnşaa Edilir?

Gerçek Hayatta Bir Veri Bilimi Projesi Nasıl İnşaa Edilir?

Veri bilimi projelerine dair yazılmış yazılarda, genelde problemin çözülmesi için kullanılacak yaklaşıma uygun model veya algoritmaların inşaasından söz edilir. Örneğin bu problem için gözetimli mi yoksa gözetimsiz öğrenme mi kullanacağız?
Hangi modeli kullanmalıyız?
Bu verileri nasıl sınıflandıracağız? vs. gibi.

Fakat ben bu yazıda, model/yaklaşım geliştirme süreçlerinden değil,
* Bir veri bilimi projesine baştan sona nasıl yaklaşılması gerektiğinden,
* Proje boyunca nelere dikkat edilmesi gerektiğinden,
* Projeyi nasıl “yönetilebilinir” kılacağımızdan adım adım söz edeceğim.

Bu adımların her biri, projenizin fikir aşamasından sunum aşamasına kadar sizin için bir iskelet görevi görecektir. Bu iskelet ile birlikte projenizin hangi aşamasına ne kadar zaman ayıracağınız, hangi soruna nasıl yaklaşacağınız hakkında fikir sahibi olacağınızı umuyorum.

İskeletin dışını, projenize, kurumunuzun kültürüne, önceki alışkanlıklarınız ve tecrübelerinizle harmanlayarak ilaveler veya eksiltmeler yapabilirisiniz. Zira buradaki bilgilerin çoğu gerçek hayat deneyimlerinden, gözlemlerden, yaptığım çeşitli okumalardan ve araştırmalardan ortaya çıkan öznel yaklaşımımdır.

Bir projeye başlamadan önce o projeyle alakalı doğru soruları sormalı, doğru cevaplar almalıyız. Zira projeyi geliştirdikten sonra çıkan ürünü kimlerin ne kadar kullanacağı, sağladığı katma değer, üretim maliyeti, zaman kısıtı vs. gibi etmenlerin her birinin hesaplanması gerekmektedir. Başı sonu iyi hesaplanmamış fakat harika kodlanmış bir model günün sonunda çöpte olabilir.

Bildiğiniz gibi yazılım proje yönetimi ile ilgili belirlenmiş ve hayatımızı kolaylaştıran bir takım methodlar bulunuyor. Fakat veri bilimi projelerinin süreçleri gerçek hayatta klasik yazılım süreçleriyle farklılık gösteriyor. Çünkü veri bilimi projeleri deneysel bir takım çalışmalar sonucu olgunlaşıyor. Bu da zaman planlaması ve projenin yönetilmesi açısından bir takım karmaşalara sebep oluyor.

Bu sebeple bir projeye başlarken bir takım denenmiş yöntemleri kılavuz edinerek ilerlemek, projenin yönetilebilir ve sürdürülebilirliği açısından faydalı olacaktır.

Baştan sona projemizi planlamak için adım adım gidelim;



1- ADIM

Projenin potansiyel değerini ölçün.

Projeye başlamadan önce onun size/kurumunuza/paydaşlarınıza sağlayacağı faydayı hesaplamak için zaman ayırın.
Başlamadan önce böyle bir şeye gerçekten gerek var mı/yok mu kararını iyice netleştirin.
Aşağıdaki sorularla projenin yatırım getirisini (ROI) kabaca ölçmeye başlayabilirsiniz;

  • Bu proje neden diğerinden daha önemli?
  • Sonuçları ne gibi katkı sağlayacak?
  • Proje kimlere fayda sağlayacak?
  • Projenin paydaşları kimler olacak?
  • Alan bilgisini kimlerden alacaksınız?
  • Projenin doğrulamasını kimlerden alacaksınız?
  • Nerelerde, ne için kullanılacak?

Bu ve bunun gibi sorularla kaba taslak yaptığınız ölçülerin %100 gerçek değerler olmasına gerek yok fakat proje ekibinin ve şirketin hedeflerinin eşleşmesi anlamında faydalı olacak ve aynı zamanda süreç boyunca çalışacağınız paydaşlarınızı da netleştirmenizi sağlayacaktır.

Bu adımı atlamak ve ortalama bir katma değer hesabı yapmadan işe başlamak size zaman, para ve efor açısından pahalıya mal olabilir.

Olmayacak bir yaklaşımı modellemiş, geliştirmiş ve bunun için aylar harcamış, sonucunda da gerçek hayatta doğru çalışmayan, sınırlı ve katma değeri olmayan bir projeye imza atmış olabilirisiniz.

Bunun gibi sıkıntıları yaşamamak için zaman, para ve eforun en efektif şekilde kullanılması en büyük öncelikleriniz olmalı ve hesaplamadan bir işe başlamamalısınız.

Yatırım getirinizi hesaplamak için aşağıdaki basit formülü kullanabiliriniz;

(Kullanıcı sayısı * Yeni veya artan kullanım oranı * İş değeri) – Geliştirme maliyeti = Beklenen yatırım getirisi.

Kullanıcı sayısı =  Sistemi kullanacak, sistemin varlığından etkilenecek toplam kişinin kaba tahmini

Yeni veya artan kullanım oranı = Projenin bir sonucu olarak yürütülen temel eylemlerin veya  var olan bir şeyin davranışındaki değişimin tahmini.

İş değeri = Ölçmek istediğiniz nihai sonuçtur. Genelde ortalama veya yüzde şeklinde ölçülür. Dönüşüm oranından, yenilenme oranına kadar herhangi bir şey olabilir.

Geliştirme maliyeti = Sistemin başından sonuna kabaca tüm geliştirme maliyenin hesaplanması.

Daha detaylı öğrenmek için lütfen tıklayın – https://uxdesign.cc/a-simple-way-to-model-roi-of-any-new-feature-a9828fbba27e

Birinci adımda proje hakkında epey geniş çaplı bilgi ve motivasyon kazanmış olacaksınız. Bu aşamadan sonra diğer adımları takip ederek adım adım projenizi gerçeklemeye başlayabilirsiniz.


2. ADIM

Bir yaklaşım belirleyin veya temel bir model oluşturun.

Problemin kapsamı dahilinde bir yaklaşım belirlemek problemin çözüm hedefinin daha iyi tanımlanması için bir referans niteliğinde olacaktır.
Bu yaklaşım mevcut bir yaklaşım da olabilir veya probleminiz için önceden belirlenmiş bir yaklaşım yok ise özel bir model geliştirmeniz gerekebilir.
Ancak bu model ilk etap için çok detaylı bir model olmamalıdır. Yani burada bahsedilen model bir makine öğrenmesi algoritması tasarlamak gibi karmaşık bir iş demek değildir.

Probleminizi tanımlayıcı bir yaklaşım oluşturarak paydaşlarınızla bu durumun detayını paylaşmalı ve geri bildirimlerle hareket etmelisiniz.

Örneğin; “Bakın bizim bu proje için düşündüğümüz yaklaşımda ilk etap için regresif bir model kullanmak, sonrası için de bir optimizasyon modeli kullanmak vardır. Bu modellerin bu proje için kullanım amaçları şu şekildedir….” şeklinde bir tavır ile paydaşlarınıza durumu izah edip durum değerlendirmesi yapın.

Veri bilimi projeleri konusunda deneyiminiz arttıkça model belirleme işini rutin olarak yapmaya başlayacaksınız. Deneyimli veri bilimcileri bu adımda, önce biraz düşünür, çözümü hangi yaklaşımın iyileştireceği konusunda bir takım sezgisel yaklaşım geliştirir. Neyin engel, neyin fayda sağlayacağını hesaplar. Ve bunun sonucunda düşündüğü yaklaşımı paydaşlar ile paylaşır.

Bu aşamada da, şu ana kadar yaptıklarınızın verimini ve başarı oranını belirlemiş, başarılı olması gereken her şeyi önem sırasına göre numaralandırmış olursunuz ve karmaşık bir model yaratmaya değip değmeyeceğini tespit edersiniz.

Bu adımı gerçekleştirmeden hemen kompleks bir modele giriş yapmanız, netlik kazanmamış bir işe başladığınız için sizi faydalı sonuca götürmeyebilir.


3. ADIM

Takımınız ile tüm detayları paylaşın. Tartışın.

Projeyi başarılı bir şekilde geliştirmek için takımınıza kimler dahilse her biriyle konuşun.

  • Hangi aşamada olduğunuzu,
  • Hangi aşamada kimlerle birlikte çalışılacağını,
  • İş bölümünü,
  • Planlamayı,
  • Oluşturduğunuz model yaklaşımınızı,
  • Gerçeklemek için hangi yoldan gideceğinizi,
  • Kodu nasıl yazacağınızı,
  • Hangi platformda yazacağınızı,
  • Hangi veriye ihtiyacınızın olduğunu,
  • Kodu nasıl test edeceğinizi,
  • Performans ölçütlerinizi vs. herşeyi konuşun.

Genelde kendi başımıza tüm bunları bildiğimizi düşünüyoruz, halledebileceğimizi sanıyoruz fakat takım arkadaşlarımızla paylaşarak görmediğimiz noktalar keşfedebiliriz veya kafamıza takılan şeylerin cevaplarını birlikte bulabilir, bölümleme yaparak süreçleri hızlandırabiliriz.
Bu yüzden takım arkadaşlarınızla sürekli aynı gemide olmak için özel çaba gösterin ve rutin toplantılar yaparak hizalanın.

Takım arası iletişimsizlik, geliştirdiğiniz modelde karşılaşacağınız herhangi bir sorunu çözmenizi çok zorlaştırabilir.
Örneğin, modelinizin bir kısmını yazdınız ve lokalinizde düzgün çalıştırdınız. Ancak aynı kod canlıda çalışmaya başladığında sunucuları yoruyor, işlemleri yavaşlatıyor. Bunun tespit etmek, hatayı gidermek ve belki kodu optimize etmek için farklı kişilere ihtiyacınız olacaktır. Bu sebeple takımınız ile dirsek temasında olmanız her zaman lehinize olacaktır.


4. ADIM

Bu adımda modelinizi geliştirmeye başlayabilirisiniz.

Problemi çözmek için geliştirdiğiniz, üzerinde uzunca düşündüğünüz, paydaşlarınızla ve takımınızla paylaştığınız modelinizi geliştirmenin zamanı geldi 🙂

Modelinizi geliştirmek için herşeyin detayına girebilir, amacınız doğrultusunda literatürü tarayabilir ve modelinize uygun makine öğrenmesi algoritmalarını bir bir deneyebilirsiniz. Eğer gerekliyse kendi algoritmanızı bu adımda oluşturabilir ve sonuçlarını deneyebilirsiniz.

Bu adımı gerçekleştirirken dikkat edeceğiniz bazı noktalar var.

Bunlarda ilki, kodunuzun kalitesi.
Bunun için bazı kalite metrikleri bulunuyor.
Öncelikle göze sade görünmesi çok önemli, mümkün olduğunca sade şekilde kod yazmaya önem vermeliyiz.

  • Yorum satırları,
  • Değişken ve method isimlerinin tanımlanması,
  • Bağımlılıklar (dependency) vs. dikkate alınacak kalite metriklerinden bazıları.

Robert Cecil Martin’de Clean Code isimli kitabında, bir kodun nasıl temiz yazılabileceğini veya temiz yazılmaya başlanan bir kodun zaman içinde refactor edilmezse nasıl git gide kirlenebileceğinden ve bunun önüne nasıl geçebileceğimizden bahsediyor. Okumanızı tavsiye ederim.

Kodumuzun temizliği ve sadeliği sadece bizim için önemli değil, bizden sonra o kod ile çalışacaklar için de oldukça önemlidir. Karmaşık kodlama (Spagetti code) yaptığımızda projenin bir şahıs üzerindeki bağımlılığı oldukça artıyor. Bizim bu bağımlılıkları minimuma düşürmek için herkesin anlayabileceği şekilde oluşturmamız gerekiyor.

Kod temizliğinin haricinde, iyi döküman tutmakta büyük önemi olan,
“projenin sürekliliğini” doğrudan etkileyen bir etmen. O yüzden kodunuza sonradan baktığınızda nerede ne yaptığınızı anlamanız veya sizden sonrakilerin kodu rahatça anlaması için dökümantasyon hayati önem taşıyor.

Bir diğer önemli adım ise test etmek. Geliştirme aşamasında isteseniz de istemeseniz de bir çok hata ile karşılaşacaksınız. Hataları gidermek için kodunuzu

  • Unit Testting,
  • System Testing,
  • User Accepting Testing gibi test adımlarından geçirmeniz gerekmektedir. Makine öğrenmesi algoritmalarını nasıl test edeceğinizi küçük bir araştırmayla, yapılmış örneklerini bolca internetten bulabilirsiniz.

Bunun haricinde, takım halinde çalışmak ve kodunuzu üretilebilir hale getirmek için yalıtılmış ortamda çalışmanızı tavsiye ederim. Yalıtılmış ortamdan kastım,
bulut tabanlı sistemler (Microsoft Azure, AWS gibi.) veya kişisel sunucular olabilir ya da Docker gibi bir konteyner teknolojisi ile çalışarak proje için kullandığınız tüm araçları, kütüphaneleri, işletim sistemini vs. herkeste aynı çalışacak şekilde standart hale getirmiş ve takım çalışanlarını platform bağımlılığından kurtarmış olursunuz.

Böylelikle;
“Sen Python’ın hangi sürümü vardı ya? Bende o sürüm yüklü değil.”
“Senin işletim sistemi OSX olduğu için config ayarı daha farklı”,
“Sendeki A dosyasını bana gönderir misin? Bende o yok.” gibi diyalogları ekip içinde yaşamamış olursunuz.

Diğer önemli süreç yönetim adımı ise, GitHub, Bitbucket gibi versiyon kontrol sistemlerinde projenizi versiyonlayarak gitmek. Versiyon kontrol sistemleri (VCS), sizin ve ekibin koordinasyonunun sağlanması, projenin yedeklenmesi ve test aşamasının kolay gerçeklenmesi açısından büyük önem taşır.

Yukarıda saydığım her şey size ekstra zaman kaybı gibi gelebilir. Şunu unutmayın, kısa vadede zaman kaybettiren şey uzun vadede size çok zaman kazandıracaktır.


5. ADIM

Yaptığınız herşeyi görüntüleme ve geri bildirim alma vakti.

Bu adım, projenin doğru çalışıp çalışmadığını görebilmek için yapılır. Problemin çözümünün sürekli kullanılabilir olması için çıktıların istikrarlı, performanslı ve güvenilir olması gerekmektedir.

  • Modelin performansı beklenenden düşük mü?
  • Veriler, doğru veriler mi?
  • Eğitim verilerinden farklı şekilde mi biçimlenmiş,
  • Sonuç bekleneni yansıyor mu?Tüm bunları düzgün görsellerle görmek bize çok zaman kazandırır. Özellikle paydaşlarımıza yaptıklarımızı gösterebilmek ve izah etmek için projeye güzel bir dashboard tasarlamak veya var olan görselleştirme araçları kullanarak ekranlar oluşturup burada sonuçları raporlamak oldukça önemli ve etkilidir. Belki bir tablo yöntemi kullanabilir veya anomali tespiti gibi işler için uyarı e-postaları göndererek sisteminizi kontrol edebilirisiniz.

Bu ekranlar aracılığıyla kullanıcıların geri bilirimini alabilir, ilave değişiklikler, eklemler/eksiltmeler yapabilirsiniz.
Eğer geri bildirimi kullanıcıdan değil de sistemin kendisinin kaydetmesini isterseniz günlük loglar tutabilirisiniz. Böylelikle kullanıcı alışkanlıklarını kimseye sormadan sistemin kendisinden öğrenebilirisiniz.

Neticede son kullanıcı için kullanıcı dostu bir ekran tasarlamak, her proje için gerekli ve önemlidir. Bu adımı da uyguladığınızda projenizin kalitesi ve verimi bir hayli yükselmiş olur. 


 

ÖZET


Yukarıda açıkladığım, veri bilimi projelerinin yaşam döngüsüne ait 5 adımı kısaca özetleyelim;

  • Projenin potansiyel değerini ölçmek.
  • Bir yaklaşım belirlemek veya temel bir model oluşturmak.
  • Takım ile tüm detayları paylaşmak
  • Model Geliştirme
  • Monitör etme / Geri Bildirim Alma

Tüm bu adımları en başta da bahsettiğim gibi projenizin rahat yönetilebilmesi için bir iskelet niteliğindedir. Tecrübe edilmiş bir yoldan geçmek, her zaman yeni bir yol keşfetmekten daha güvenlidir. Siz bu rehberle birlikte keşfedilmiş yolun içindeki size özel yeni yolları ekleyerek ayrıntılandırabilirsiniz.

Okuduğunuz için teşekkür ederim.

VCS, Git, GitHub, Bitbucket Nedir? | GitHub kullanımı

1- Versiyon Kontrol Sistemleri Nedir? Git Nasıl Kullanılır?

Anlamakta ve kullanmakta zorluk çektiğimiz terimlerdir
Versiyon Kontrol Sistemi(VCS),
Git,
Github,
Bitbucket,
Subversion vs. gibi terimler.

Ne olduğu hakkında aşağı yukarı bir bilgimiz vardır evet ama henüz kullanmamışsak, nasıl ve neden kullanıldığı hakkında biraz kafamız karışır.

2- Bu karmaşanın önüne geçebilmek için önce Versiyon/Sürüm Kontrol Sistemi nedir? Neden ihtiyaç duyarız konusuna değinelim

Versiyon Kontrol Sistemi (VCS)

Geliştirme aşamasındaki bir yazılımın zaman zaman yedeklenmesi gerekir.

Bu yedekleme işini bilgisayarınıza veya bir diske(harici disk, usb vs.) kaydedebilirsiniz. Ancak bu aşamada bir önceki kaydettiğiniz yedeğinizin üzerine, yeni geliştirmeler yaptığınız hali ekleyip kaydederseniz kodun önceki haline ihtiyaç duyduğunuzda hüsrana uğrayabilirsiniz.

Bu durumun önüne geçmek için her yedeği .zip’leyerek anlamlı isimler vererek kaydetmeyi deneyebilirsiniz. Peki ya her geliştirme farklı bir firma/müşteri/ürün için ayrı şekilde inceleniyorsa, bu sefer isimlendirmeler bir hayli karmaşık bir hal almaya başlayacaktır.

Diyelim bu durumla da başa çıkmanın bir yolunu buldunuz, bu kodlara her zaman erişebileceğiniz online bir platforma ihtiyaç duyduğunuzda ne yapacaksınız?

Senaryo bu ya, onunda çaresini buldunuz. Yedekleriniz için Google Drive, ICloud vs. gibi bulut sistemlerini kullanmaya başladınız.
Peki ya bu projede bir ekip ile çalışıyorsanız?
Ekipteki herkes projenin farklı kısımları için geliştirmeler yapıyorlarsa?
Ekipten biri ile senkron olamayıp aynı kod satırına müdehale ettiyseniz?
Bu ve bunun gibi kaotik durumları nasıl yöneteceksiniz?

Bunları manuel şekilde yedekler alarak halledebilmeniz oldukça güçleşecektir. Bu durumu sağlıklı yönetebilmek için sizin yukarıda anlatıldığı gibi çabalamanıza ve Amerika’yı yeniden keşfetmenize hiç gerek yok.

İşte versiyon kontrol sistemleri bu ve bu gibi durumlarda hayatlarımızı kurtarıyorlar.

Bu sistem, yazılım ekibinin zaman içinde kaynak koddaki değişiklikleri yönetmesine yardımcı olan bir sistemdir.

Versiyon kontrol sistemleri, koddaki her değişikliğin özel bir veritabanı türünde kaydını tutar. Bir hata yapılırsa, geliştiriciler, tüm ekip üyelerinin en az zaman kaybı ile hatayı düzeltmesine yardımcı olur. Aylardır geliştirme yaptığınız bir projenin birinci ayın sonunda nasıl olduğunu görmek istediğinizde, rahatlıkla görebilirsiniz. Ayrıca ne gibi değişiklikler, hangi geliştirici tarafından yapılmış bunların da kontrolünü sağlayabilirsiniz.

3- Git nedir? Github nedir?

Git ve Github genelde birbiri ile karıştırılır.
Git, Bugüne kadar, dünyada en yaygın olarak kullanılan modern sürüm kontrol sistemi Git’dir. 

2005 yılında Linux işletim sistemi çekirdeğinin ünlü yaratıcısı Linus Torvalds tarafından geliştirilmiştir.
Masaüstü programdır.
Ücretsiz veya ticari kullanıcılar için ücretli üyelik modeline sahiptir.
Projede yapılan değişiklikleri zaman, kullanıcı bilgisi, versiyon numarası gibi bilgilerle birlikte tutar.
Kullanımı kolay olmakla birlikte bir çok IDE(Integrated Development Enviroment) üzerinde iyi çalışmaktadır.

4- Git’e benzeyen diğer versiyon kontrol sistemleri ise

SVN(Subversion),
CVS(Concurrent Versions System) gibi sistemlerdir

Şimdi ise GitHub’dan bahsedelim. Öncelikle Git ile GitHub ‘ın farklı şeyler olduğunu söyleyelim.

5- GitHub Nedir?

GitHub, versiyon kontrol sistemi olarak Git kullanan yazılım geliştirme projeleri için web tabanlı bir depolama servisidir.  Git ile oluşturulan kod depolarını bulutta saklamayı sağlayan bir servistir. VCS ler arasında en fazla GitHub kullanılır.

GitHub aracılığı ile geliştirdiğiniz projelerinizi, faydalanacağını düşündüğünüz insanlarla paylaşabilirsiniz. Hatta belki projenizin ekibine, dünyanın çeşitli yerlerinden insanları ekleyebilir, projenizi GitHub üzerinden yönetebilirsiniz. Ekibinizde çalışanların projenin hangi konumunda yer alacağını belirleyebilirsiniz. Kişinin yaptığı çalışmaları inceleyebilirsiniz ve bu çalışmaların ne kadar sürede tamamlandığını kontrol edebilirsiniz. Görev takibi ve yetkilendirmeler böylece çok daha kolay hale gelir.

GitHub’da proje oluşturmak ve yukarıda bahsettiğim özellikleri kullanmak için öncelikle www.github.com sitesin üye olup, oturum açmanız gerekmektedir. Üyelik ücretsizdir.

5.1 – GitHub kullanmadan önce bilmeniz gereken temel Git kavramları ;

Repository (Depo): GitHub üzerinde barındırılan proje depolarıdır. GitHub’da tuttuğunuz her proje için bir repository (kısa adı ile repo) oluşturursunuz.

Branch (Dallanma):  Bu kavramı repository’nin alt klasörleri olarak düşünebilirsiniz. Projemizi dallara ayırmamızı sağlar. Her bir branch ayrı bir depo alanı gibi düşünülebilir.

Git’te oluşturduğunuz bir repository’nin içine projenizi depolayacağınız ilk andan itibaren bir branch üzerine çalışırsınız. Bu, Git’in varsayılan olarak atadığı “master branch” dir. Ve eğer siz master’dan farklı olarak, özel bir branch açmadıysanız, projeniz default olarak master branch üzerinde çalışmaya başlar.

5.2 – Peki ne için branch’lere ihtiyaç duyulur?

Kısaca bir örnek üzerinden açıklamak gerekirse;

Ana branch’te çalışır halde bir projeniz var. Siz bu projenize yeni bir feature eklediniz fakat yeni feature’ın henüz çalışır durumda olup olmadığından emin değilsiniz. Bu durumda ana branch’teki düzgün çalışan projenize zarar vermemek adına geliştirmeniz için yeni bir branch açmayı ve orada çalışmayı deneyebilir, yeni geliştirmenizin testlerini yapıp sağlıklı sonuç verdiğine emin olduktan sonra, ana branch’inize kodunuzu kopyalayabilirisiniz.

Bu kısa örnekten sonra yazılım süreçlerinde yaygın olarak kullanılan bir Git Branch modelinden bahsedelim.

5.3- Branch modeli (Git flow)

Temelde yazılım geliştirme yaşam döngüsü boyunca bir repository’e iki ana branch ile çalışılır. Bunlar Master ve Developer branchleridir.

Master branch (ana branch), genellikle projenin yayınlanmaya hazır haldeki kısımlarını tutar.
Developer branch ise, geliştirme evresinde olan ve yeni sürümde yayınlanacak olan projenin son halinin kaynak kodlarını barındırır.
Developer branch’inde her şey yolunda gidiyorsa ve proje testlerden geçmişse master branch’i ile birleştirilir. Bu birleştirme işlemleri “merge etmek” olarak anılır.

Master ve Developer branch haricinde kullanılan paralel branch’ler de mevcuttur. Bunlardan biri Feature branch’tir.

Feature Branch: Bir proje için oluşturduğunuz her task(proje için oluşturulmuş görev) ve bu tasklarda geliştirmeyi planladığınız her feature için ayrı bir feature branch açabilirsiniz.
Feature branch’leri, developer branch’inin altında olmak zorundadır.
Proje ekibinden herkes farklı feature branchlerinde çalışabilir. Ancak geliştirmenin sonunda feature branch’lerin her biri developer branch’ine merge edilmelidir.

Feature branch’leri ile çalışmanın en büyük avantajı, o branch’te çalışılan özelliğin fail etmesi, bekleneni vermemesi durumunda master’ın developer’ın ve diğer feature branch’lerinin hiç bir şekilde etkilenmemiş olmasıdır.

Akılda kalıcılığını arttırmak amacıyla ufak bir senaryo oluşturalım;  Ayşe ismindeki geliştirici bir e-ticaret sitesinin ödeme sayfasındaki, kartlı ödeme alanını geliştiriyor olsun. Bu feature’ın adı, “K123-Kartli Odeme Secenegi” şeklinde olsun.

Ayşe, “K123-Kartli Odeme Secenegi” isminde bir feature branch oluşturur. İlgili geliştirmeyi gerçekleştirir. Bu geliştirmenin çalıştığından emin olduktan sonra developer branch’ine gönderir. Developer branch’indeki tüm geliştirmeler yeniden test edildikten ve emin olunduktan sonra master branch’ine merge’lenir.

Diğer paralel branchlerin isimleri ise Release branch’ler, Hotfix branch’lerdir.

Release Branch: Yeni bir versiyon güncelleme yapacağınız zaman versiyonadki son değişiklikler bu brach üzerinden yapılır, sürüm numarası bu brach’te güncellenir ve değişiklikler bittiğinde hem developer hem de master branchlerine merge edilir. Ardından release branch’i silinir.

Hotfix Branch: Yayınladığınız yeni versiyonda önemli bir hata keşfettiniz ve bu hatanın acilen çözülmesi gerekiyor. Bu gibi durumlarda bir hotfix branch açılır. Ardından hata bu branchte giderilir ve developer ile master branchlerine merge edilir. Daha sonra hotfix branch’i silinir.

Fork: GitHub kullanmadan önce bilmeniz gereken bir diğer kavram ise fork kavramıdır. Baştada söylediğim gibi GitHub’da herhangi birinin projesini alıp geliştirebilirsiniz ve bu geliştirdiklerini o projenin sahibiyle paylaşarak projeye katkı sağlayabilirisiniz. Fork, projeyi kendinize kopyalamanızı(clone etmeyi) sağlıyor. Birini projesini clone’ladığınızda sizin local bilgisayarınızda bu projenin aynısından bir local repository oluşur ve yaptığınız değişiklikler, sizde oluşan yeni repository’e kaydolur. Projenin orjinali bu değişiklikten etkilenmez.

(Not: Clone işlemi hep en başta yapılır, her seferinden tekrar edilmez. Yeni değişiklikler çekileceği zaman “pull” edilir.)

Clone’ladığınız projeye katkı sağlamak, değişiklikleri proje sahibi ile paylaşmak istiyorsanız, ilgili local repository’nizi, GitHub üzerinde bir remote repository’e push etmeli/taşımalısınız.

Ardından proje sahibine “Pull Request” göndermelisiniz.

Pull Request: “Ben sizin projenizin üzerinde şu değişiklikleri yaptım, eğer sizin için de uygunsa değişikliklerimi sizin projenize ekleyip katkıda bulunmamı kabul edin” demektir. Proje sahibi pull requesti onaylarsa değişiklikler, forklanan projenin orjinaline merge edilir. 

Gelelim en basit haliyle GitHub’ın Nasıl kullanıldığına…

6-  GitHub’ın Nasıl Kullanılır?

Öncelikle bilgisayarınıza, kullandığınız işletim sistemine uygun olacak şekilde Git’i yüklemeniz gerekmektedir. Bu siteden faydalanarak yükleyebilirsiniz. (https://help.github.com/articles/set-up-git/)

Talimatları takip edip Git’i yükledikten sonra git komutlarını artık kullanabilir haldesiniz demektir.

Ardından bilgisayarınızda oluşturduğunuz bir proje için git deposu yaratabilirsiniz. Git’e depolayabilmek için projenizin ne ile ilgili olduğunun hiç bir önemi yoktur.

6.1 – Örneğin ben bir Java projesi oluşturdum.

Terminali açtım, ve aşağıdaki komut ile projemin bulunduğu dizine gittim.

$ cd /Desktop/ilk_github_repo

Ardından git init komutu ile projemin içine bir git deposu oluşturdum.

$ git init

Siz de projenizin klasöründe gizli bir klasörün yaratıldığını göreceksiniz. Bu sizin git deponuz (veya local repository/repo).
İçerisine girdiğinizde deponuz ile ilgili sizin için oluşan dosya ve klasörlerin detaylarını görebilirisiniz.

Şimdi terminal ekranına git status yazalım, bu komut projenizde yapılan değişiklikleri, git deponuzdaki kodunuz ile kıyaslar. Ve depoda bulunmayan hangi değişiklikler varsa onları size listeler.  Daha önceden git  reponuza hiç bir şey eklemediğiniz için şuan her değişikliği yeni bir değişiklik olarak görüyor ve gösteriyor.

$ git status

Şu aşamada içinde bulunduğumuz dizinde hangi çalışmamız bulunuyorsa onu git depomuza ekleyebiliriz. Bunu git add . veya git add -A komutunu kullanarak yapabilirsiniz.

git add . 

Bu komut ile bilikte o dizinde eklediğiniz veya üzerinde değişiklik yaptığınız her dosya git deponuza eklenecektir. Eğer sadece bir dosyayı eklemek isterseniz git add dosya_adi komutunu kullanabilirsiniz.

Sıra git depomuza eklediğimiz dosyaların versiyonuna isim vermekte.

Bunu  git commit -m “initial commit/başlangıç kaydı” şeklindeki komutu kullanarak yapabilirsiniz. Her commit için açıklamanızı, kodunuzdaki değişikliği açıklar biçimde yapmanız, sizin kullanımızını kolaylaştırır.

git commit -m “initial commit/başlangıç kaydı”

Sonraki aşamada ise projenizi uzak bir depoya kaydetmek. İster GitHub isterseniz Bitbucket gibi servisleri kullanarak uzak depo/repo yaratabilirisniz, Bitbuckettan henüz bahsetmediğimiz için size

6.2 – GitHub üzerinden nasıl olduğunu göstereceğim;

  •  github.com sitesinde, kullanıcı adı ve şifrenize giriş yaptıktan sonra profilinize gidin,
  • Ardından “New” butonunu tıklayın.
  •  Sizden repository’niz için bir isim ve “READ ME” (Beni oku) bölümü için açıklama isteyecektir. İlgili alanları doldurun.
  • Aşağıda “Public/Private” seçenekleri göreceksiniz. Github üzerinden istediğiniz kadar public repo oluşturabilirsiniz. Ancak private repolarınızıen fazla 3 kişi bir repoda çalışabilecek şekilde ücretsiz kullanabilirsiniz. Private repoları 4 veya daha fazla collaborator ile kullanacaksanız ticari sürüme geçip ücret ödemeniz gerekmektedir.
  • Aşağıda “Public/Private” seçenekleri göreceksiniz. Github üzerinden istediğiniz kadar public repo oluşturabilirsiniz. Ancak private repolarınızıen fazla 3 kişi bir repoda çalışabilecek şekilde ücretsiz kullanabilirsiniz. Private repoları 4 veya daha fazla collaborator ile kullanacaksanız ticari sürüme geçip ücret ödemeniz gerekmektedir.
  • Tüm bu ayarları yaptıktan sonra “Create Repository” diyebilirsiniz.
  • Ardından repository’niz için generate edilen https://… ile başlayan linki kopyalayın.
  • Sonra yeniden terminal ekranına geri dönün. Ve şu komutları yazın;
$ git remote add origin https://github.com/kizgibikodla/github_usage.git

(burada sizin kullanıcı adınız ve repository isminiz yazıyor olmalı)

  • Sona yaklaştınız, şimdi tüm yaptıklarınızı oluşturuğunuz repository’e push etme vakti.
$ git push -u origin master

Ve ilk github kaydınızı oluşturdunuz. Artık sizin de github hesabınızda bir repository’niz var 🙂

 


Şu aşamadan sonra yaptığınız her değişiklik için git init ve git remote add origin https://github.com/kizgibikodla/github_usage.git komutları hariç diğerlerini her yeni değişiklik için kullanabilirsiniz. Bu komutları kullanmanız, zaten oluşturduğunuz ve kullanmakta olduğunuz bir reponuz olduğu için hatalı olacaktır. Ama diğer komutları her değişiklik için kullanmalısınız.

6.3- Yeniden en baştan ilk oluşturma ve kaydetme komutlarını yazalım;

$ git init    
$ git status
$ git add .
$ git commit -m “initial commit/başlangıç kayıt başlığı”
$ git remote add origin https://github.com/kizgibikodla/github_usage.git
$ git push -u origin master

6.4- Şimdi de ikinci committen itibaren kullanmamız gereken komutları listeleyelim;

$ git status
$ git add .
$ git commit -m “xxx commit/ikinci kayıt başlığı”
$ git push -u origin master

Commitlerinizde yaptığınız değişiklikleri, GitHub üzerinden, verdiğiniz commit başlıklarınızı tıklayarak detaylı şekilde inceleyebilirsiniz.


7- Şuan sadece TEK branch ile çalışmayı inceledik

Tek başınıza çalışıyorsanız bir proje için master brac’hinde yukarıda anlattığım şekilde rahatlıkla çalışabilirisiniz. Ancak bir ekiple çalışacaksınız ve iş süreçlerinde güvenlik, kod kalitesi vs. gibi öncülleriniz varsa, developer ve bahsettiğim diğer branchlere ihtiyaç duyarsınız. Bu şekildeki kullanım için ayrı bir yazı yazmayı planlıyorum. 


 

8- Bitbucket Nedir?

Hazır versiyon kontrol sistemlerinden bahsedilen bir blog yazısı yazıyorken Bitbucket’a da değinmeden olmaz.

Bitbucket, Jesper Nohr tarafından kurulmuştur. 29 Eylül 2010’da Atlassian firması tarafından satın alınan Bitbucket, ilk kurulduğunda yalnızca Mercurial (Tıpkı Git ve SVN gibi versiyon kontrol sistemidir) depolama desteği verirken bu satın alınmanın ardından 2011 tarihinde Git desteği vermeye başlayan bir versiyon kontrol sistemi platformudur.
Python frameworkü olan Django ile geliştirilmiştir.

Tıpkı GitHub ile arasındaki en büyük fark eğer bir proje üzerinde 5 kişi veya daha az geliştirici ile çalışıyorsanız projenizi private(dışarıya kapalı) biçimde ücretsiz olarak geliştirebilirsiniz. Ancak 5 kullanıcıyı aştığınızda ticari sürümünü kullanmanız gerekecektir. Eğer siz de ufak ekibiniz ile veya tek başınıza private projeler geliştirmek istiyorsanız bu servisi kullanmanızı öneririm.

Bu giriş bilgilerinden sonra GitHub için bahsettiğim adımları kullanarak Bitbucket’ta da bir repository oluşturabilirsiniz. Öncelikle bir https://bitbucket.org sitesinden bir kullanıcı hesabı alın, ardından GitHub’taki gibi bir repository oluşturun ve daha sonra yine yukarıda (Başlık: 6.3)  bahsettiğim komutlar ile reponuzu oluşturabilirsiniz.

Versiyon kontrol sistemleri ile ilgili yazımın ilk bölümünü bu şekilde sonlandırıyorum. Bir sonraki yazımda ise farklı branclerin, Pull Request, Fork, Merge gibi kavramların gösterildiği bir örnek ile VCS yazıma ilaveler yapacağım.

Okuduğunuz için teşekkürler, sorularınız için [email protected]‘u kullanabilirsiniz.

 

Pardus Nedir? Nasıl Kullanılır? Yerli bir yazılım mıdır?

PARDUS NEDİR?

Son günlerde adını sık sık duyduğumuz bir işletim sistemi; PARDUS.

Özellikle ülkemizdeki, “Amerikan ürünlerini veto etme” eylemlerinden etkilenen Kahramanmaraş Belediyesi’nin
“Belediyemizdeki bigisayarlarda Pardus’a geçildi” diye yaptığı haberin içeriğinde, aslında yalnızca Windows işletim sistemi –ki kullandıkları Windows’un da korsan olduğu biliniyor 🙂 – kurulu olan bilgisayarlarının arka plan fotoğrafına Pardus logosu koyduğu anlaşılınca olayın seyri epey trajikomik bir hal aldı.

Haberin linki 

Çeşitli teknoloji haber sitelerinde ve Twitter’da karşılaştığımız bu komik haber, Pardus işletim sisteminden bi haber olanların aklına şu soruyu getirdi;

Nedir peki bu Pardus?

Açıklayalım efendim,

Pardus, adını Anadolu Parsı’ndan (Panthera pardus tulliana) almış olan 2003 yılında TUBİTAK tarafından planı başlatılmış, ilk sürümünü ise 2005 yılında çıkartmış bir işletim sistemidir. Pardus aynı zamanda “ilk yerli işletim sistemi” ünvanıyla da anılır.

 

Peki Pardus gerçekte tamamen yerli bir işletim sistemi midir?

Pardus için “milli işletim sistemimiz“,  “%100 yerli bir yazılım” vs. söylemleri ile sıkça karşılaşıyoruz. Durumun böyle olup olmadığını kavramak için  bazı temel kavramların bilinmesi gerekmektedir.

Pardus, Linux çekirdeğini kullanan, açık kaynak kodlu dolayısıyla ücretsiz bir işletim sistemidir. 

Linux çekirdeği nedir?

Çekirdek(Kernel), denilen yapı bilgisayarın kalbi gibidir. Bilgisayarın yazılımı ile donanımını birbirine bağlayan bir köprüdür. Çekirdek temel bir çok kodu içinde barındırır. Bu yüzden Her işletim sisteminin bir çekirdeği olmak durumundadır.

Linux, Linus Torvalds adında Finlandiya’lı bir bilgisyar mühendisinin 1991 yılında Helsinki Üniversitesi’nde bir öğrenci iken kişisel bilgisayarında kullanmak üzere geliştirmeye başladığı bir işletim sistemi çekirdeğidir.

Linux çekirdeğini kullanarak oluşturulmuş bir çok dağıtım bulunmaktadır. (Dağıtım:  Linux çekirdeği, GNU araçları ve bir masaüstü ortamının bir araya gelmesiyle, bu birlikteliği sürdürülebilir şekilde yönetecek bir yapılandırma araçları seti, yazılım güncelleme araçları vb. ile oluşturularak tam teşekküllü bir işletim sistemi haline gelen uygulamalar bütününü ifade eder.[1])

Bunlara örnek olarak Debian, UbuntuOpenSuSE/SuSE, Mageia, Chakra ve Pisi Linux verilebilir.

Pardus işletim sistemi de Linux çekirdeğini kullanan işletim sistemlerinden biridir.

Pardus’un Linux çekirdeğini kullanmasındaki amaç, üretimi Türkiye’de gerçekleşen, herkesin erişebileceği, özgür, açık kaynak kodu yaygınlaştırmayı amaçlayan, oldukça güvenilir, kullanımı kolay, ihtiyaca uygun özelleştirilebilen, Türkçe dahil bir çok dil desteği olan tam teşekküllü bir işletim sistemi ortaya çıkartmaktır.
Bu vizyon ile Pardus çeşitli sürümler ortaya çıkardı.

Pardus, 2011.2 sürümüne kadar oluşturulan sürümlerinde,
Linux çekirdeği temelinde oluşturulmuş masaüstü ortamlarını kullanan (KDE,XFCE,GNOME) ve bunların üzerine  Pisi, Yalı, Çomar, Kaptan gibi kendisine ait yazılımları da geliştiren bir işletim sistemi idi. 

(Pisi: Python dilinde yazılmış bir paket yönetim sistemidir.
Yalı: Pardus’un bilgisayara kurulmasını sağlayan yükleme aracıdır.
Çomar: Sistemin düzgün çalışması için gerekli olan donanım, açılış, ağ, kullanıcı, zaman, görüntü gibi ayarların mümkün olduğu kadar otomatik bir biçimde yapılmasını sağlayan yapılandırma yönetim sistemidir.
Kaptan: Pardus kurulumu sonrasında kullanıcıyı karşılayarak, masaüstünün kolayca kişiselleştirebilmesini sağlayan bir ilk ayar sihirbazıdır.)

Fakat daha sonra 2012 yılında Pardus’un geliştirici ekibi, TÜBİTAK tarafından değiştirildi.( TUBİTAK ULAKBİM’den destek almaktadır.)

Pardus, bu yıldan sonra çıkardıkları yeni sürümde Linux’un Debian dağıtımının alt yapısını da kullanmaya başladı.  Artık Debian’ın paket desteğini kullanıyor.
 (Değişimden önceki eski ekip, hiç bir devlet desteği olmaksızın işletim sistemi çalışmalarına Pisi Linux adı altında devam etmektedir.)

Yerli yazılım mevzusuna gelinecek olursa;
Aslında ülkemizde verilmek istenen mesaj; Pardus’un  %100 yerli bir işletim sistemi olması değil, açık kaynaklı bir alt yapı üzerine Türk mühendislerin geliştirme yaparak meydana çıkardığı bir yazılıma, Türk insanlarını yönlendirmektir.

Yönelimdeki artış, sistemin daha efektif ve daha gelişmiş bir hal alması için önemli bir geri bildirim değeri taşımaktadır. Nitekim ülkemizdeki yerli üretime destek projelerinin baş vermesiyle birlikte, Pardus’un daha fazla gelişmesi için çalışmalara başlandığı bilinmektedir.

“Yerli yazılım değildir” yaklaşımına ise şu perspektiften bakılmalıdır; GNU/Linux, açık kaynak, özgür yazılım demektir. Yani insanlığa adanmıştır. Dolayısıyla onu hiç bir ülke veya kişi(ler) ile ilişlilendirmek doğru değildir. Açık kaynak olan bir sistem alt yapısı üzerinden geliştirme yapmak onu kopyalamak sayılmayacağı gibi tam anlamıyla Türk ürünü de yapmaz.
Tamamen Türk malı bir işletim sistemi yapılmak istenmesi demek, çok maliyetli bir iştir. Çünkü Linux çekirdeğinin geliştirilmesinde binlerce kişinin 25 yılın üzerinde emeği vardır ve 20 milyonun üzerinde kod satırından söz edilmektedir. Bu ciddi iş yükü olan bir iştir. Ve var olan bir sistemi yapılandırıp kullanmak, onu sıfırdan yazmaya girişmekten çok daha akıllıcadır.

Debian alt yapısının kullanılma sebeplerini de “43.000’in üzerinde tamamen özgür paket desteği sağlaması” olarak açıklanıyor[2].

Bu duruma milli duygularla yaklaşıldığında, hiç Türk elinin değmediği bir işletim sistemi kullanmaktansa, Pardus’u kullanmak daha iyi bir şeydir denilebilir fakat bu tamamen kişilerin kendi tercihlerine ve işletim sistemi özelliklerinin, şahsın ihtiyaçlarına uygun olup olmadığına bağlıdır.

Pardus’u tanıyalım o halde!
Ne için Pardus kullanmalıyız?

  • Pardus açık kaynak bir temele sahip olduğu için programlamadan anlayan kişiler tarafından özelleştirebilen bir yapıya sahiptir. Sizi bu konuda oldukça özgürleştirir.
  • Alıştığımız işletim sistemleri arayüzlerinden çok büyük farkları yoktur, dolayısıyla kolay kullanılabilir.
  • Türkçe dahil, çoklu dil desteğine sahiptir.
  • Virüsler konusunda oldukça güvenlidir.
  • Pardus kullanmak isteyen küçük veya büyük ölçekli kamu kurum ve kuruluşlarında Pardus Dönüşüm için analiz çalışması yapılmaktadır.
  • Türkçe forum sitesi bulunur. İşletim sistemi hakkında rahatlıkla bir çok bilgiyi https://www.pardus.org.tr/ ‘den edinebilirsiniz.
  • Farklı sürümleri vardır.
  • Kurulumu oldukça kolaydır.

Pardus’un eski sürümlerine bu linkten erişebilirsiniz : https://www.pardus.org.tr/eski-surumler/

Pardus’un en yeni sürümü ise ; Pardus 17.3 XFCE (64-bit) ‘dir.
Bu sürümü kullanabilmek için sisteminizinde;

  • En az 512 MB ve üzeri RAM,
  • 8GB ve üzeri disk alanı,
  • En az 640×480 çözünürlüğü destekleyebilen grafik işlemci,
  • 64-bit destekli 1.0GHz+ işlemcinizin olması gerekmektedir.

Pardus’u nasıl kurabiliriz?

Pardus’u isterseniz kendi bilgisayarınıza, isterseniz de sanal makineye kurabilirsiniz. Pardus’un resmi sitesindeki adımları takip ederek kolayca kurabilirsiniz.

Ben macOSX kullanıyorum. Pardus’u denemek için bilgisayarıma VirtualBox kurup, içerisine Pardus kurulumunu sizlere göstereceğim.
(VirtualBox, bilgisayarınızda farklı işletim sistemleri deneyimleyebileceğiniz sanal bir işletim sistemi platformu sunar.)

Öncelikle bu linkten VirtualBox uygulamasını indirin. Boyutu çok fazla değil, o yüzden çabuk inecektir.

Sonra kurulumunu gerçekleştirin. Oldukça basit kuruluyor, onu uzun uza anlatmayacağım. (İndirdikten sonra üzerine tıklıyorsunuz, sonra next next … 🙂 )

Şimdi ise Pardus’u indirelim. Ben son sürümü olan Pardus 17.3 XFCE (64-bit) kuracağım.

Siz de bu linkten ulaşıp indirebilirsiniz. Bu sürüm yaklaşık 1.3 GB

Evet, Pardus’u da indirdikten sonra gelelim VirtualBox içine Pardus kurma işine…

Bu adımı videolu anlattım, bu linke tıklayarak izleyebilirisiniz. Videonun devamında Pardus arayüzünü inceleyebileceğiniz kısa bir demo da yaptım. 

Video kurulum adımlarının resmi sitedeki hali de bu linktedir. Buradan da faydalanabilirsiniz.

 

Umarım sizler için faydalı bir içerik olmuştur.

Herkese başarılar dilerim.

Apache NiFi Nedir? Neden Kullanılır?

Verinin üretileceği kaynak, depo edileceği alan veya verinin işlenmesi kadar veri akışı (data flow) da önemlidir.

Veri akışı, sistemler arası bilgi transferidir.
Veri bir kaynaktan alınır, ve bir hedefe aktarılır.

Kaynaktan hedefe veri akışı sağlanırken, kullanılacak teknolojilerin, güvenli, performanslı, efektif, ölçeklenebilir ve gerektiğinde farklı kaynaklardaki veri akışlarıyla çalışabilir olması gerekmektedir.

Ayrıca bir veri akışı esnasında kullanılacak aracın aşağıdaki zor durumları çözebiliyor olmasına dikkat etmek gerekir;

  • Hem yapısal hem de yapısal olmayan veri tipleriyle çalışabilme,
  • Kaynaktan alınan verinin yapısı ile hedef’teki veri yapısının farklı olma durumlarını tolare edebilme,
  • Verinin taşınması esnasında flow’un kapasitesinin yönetimi,
  • Veri akış hızına uyumlu çalışabilme,
  • Protokol ve format değişikliklerine uyum sağlama,
  • Güvenliğe önem verme vs.

Bu işlemlerin hepsini veya bir kısmını gerçekleştirebilen bir çok teknoloji mevcut.

Bu teknolojilerden biri olan Apache Flume’a daha önce değinmiştim. Bugün özelliklerinden bahsedeceğim bir diğer data flow teknoloji ise NiFi !

NiFi, ilk olarak Amerika Ulusal Güvenlik Ajansı (NSA) tarafından üretilmiştir.

Akan veriyi şelaleye benzetmiş olacaklar ki bu ürüne ilk olarak “Niagara Files” ismini koymuşlardır.

Daha sonra Niagarafiles, Kasım 2014 yılında açık kaynaklı yazılım vakfı olan Apache(ASF) tarafından satın alınmış ve adına kısaca NiFi denmiştir.

NiFi, gerçek zamanlı (real-time) veriyi bir yerden bir yere aktarma işlemlerini yöneten,  her türden veriyi çeşitli kaynaklardan okuyabilen, veri üzerinde çeşitli işlemler yapmaya imkan veren ve verinin farklı kaynağa depolanmasına olanak sağlayan bir veri akış aracıdır. (data flow tool)

NiFi’nin genel özelliklerini incelemeye başlamadan önce aşağıdaki iki terminolojik terimi bilmek önemlidir.

1-) FlowFile (Akış verisi)

Kullanıcının işlem ve dağıtım için NiFi’ye getirdiği her bir veri parçası, FlowFile olarak adlandırılır. Bir FlowFile iki bölümden oluşur: Attiribute(Özellik) ve Content (İçerik).

Content, NiFi’ye gelen kullanıcı verisinin kendisidir.
Attribute, kullanıcı verileri ile ilişkilendirilmiş anahtar / değer(key/value) çiftleridir.

2-) Processor (İşlemci/İşlem yapan)

FlowFile’ları oluşturma, gönderme, alma, dönüştürme, yönlendirme, bölme, birleştirme ve işleme işlemlerinden sorumlu olan bir NiFi bileşenidir.

Veri akışlarını oluşturmak için NiFi kullanıcılarının kullanabileceği en önemli yapı taşıdır.

Apache Nİ-Fİ ‘nin genel özellikleri

  • Apache NiFi, farklı sistemler arasındaki, veri alışverişini otomatikleştirmek için entegre edilebilen veri lojistik platformudur. 
  • Farklı formatlardaki verileri, şemaları, protokolleri, farklı akış hızlarını ve farklı veri boyutlarını destekler. Bunlara, click stream dataları, log dosyalar, bazı cihazlardan gelen coğrafi konum verileri örnek olarak verilebilir.
  • NiFi, verileri bir yerden bir yere taşımak için yapılandırılabilir bir platform sunar ve bu platform sayesinde verilerin gerçek zamanlı olarak izlenmesini sağlar.
  • NiFi, esnek ve genişletilebilir özelliklere sahiptir. Farklı cihazlardan, farklı ağlardan veri lojistiği yapabilir. Ve kullanıcıların kendi işlemcilerini ve daha fazlasını oluşturmasını sağlayabilir. Hızlı gelişim ve etkili test yapılmasını sağlar.
  • Web tabanlı kullanıcı arayüzüne sahiptir. Veri kaynaklarının baştan sona çeşitli görsel grafiklerle izlenmesini sağlar. Veri akışı esnasında hangi kaynaktan, hangi veri, nereye, ne şekilde gitmiş, web interface sayesinde kolayca görebilirsiniz. Ayrıca bu arayüz ile kaynak ve hedef arasındaki tüm bağlantıları, akışı, hataları veya uyarıları kullanıcı rahatlıkla takip edebilir.
  • Yüksek yapılandırma yeteneğine sahiptir. Taşıma esnasında, veri kayıplarını önler, düşük gecikme süresi ve yüksek verimlilik ile veriyi kaybetmemeyi garanti eder.
  • Veri akışlarını önceliklendirmenize olanak tanır. NiFi ile veri akışındaki işlemler, kuyruklar gibi hareket eder ve çeşitli süreçlerin, farklı oranlarda etkileşime girmesine imkan verilir. Bu iş süreçleri NiFi ile kolaylıkla önceliklendirilir. Bu sayede önceliği yüksek olan işlem, daha fazla buffer miktarına sahip olabilir.
  • Aynı veya farklı process’leri bir araya getirerek “Process Group”lar (İşlemci Grupları) oluşturulabilir. Bu bu process group’lar farklı işlemlerin bir araya getirdiği yeni işlemler olarakta çalışabilirler.
  • Güvenli – SSL, SSH, HTTPS, şifreli içerik ve daha fazlasını destekler.
  • İçerisinde 90’dan fazla processor bulunuyor. Örn: ConsumeKafka, GetHDFS, ConvertJSONToSQL vs.
  • Ancak bu processor’ları kullanmak istemediğiniz takdirde custom processor yaratabilmenize olanak sağlıyor.

NİFİ MİMARİSİ

NiFi, bir Java Virtual Machine (JVM) içinde yürütülür.

JVM içindeki ana bileşenler ise ;

Web Server: Web sunucusunun amacı, NiFi’nin HTTP tabanlı komut ve kontrol API’sini barındırmaktır.

Flow Controller: Akış kontrolörü, NiFi operasyonlarının beyinleridir. Extension’ların çalışabilmesi için iş parçaları oluşturur ve extension’ların yürütülecek kaynakları almasının zamanlamasını yönetir.

Extensions: FlowFile Repository: NiFi’nin anlık akışta aktif olan belirli bir FlowFile hakkında bildiklerinin durumunu takip ettiği ve bu bilgilerin depolandığı yerdir.

Content Repository: Belirli bir FlowFile öğesinin gerçek içerik baytının yaşadığı yerdir.

Provenance Repository: Tüm kaynaklarla ilgili olayların depolandığı alandır. Hangi kaynaktan hangi hedefe veri akışı olmuş vs. bilgileri bu kaynakta tutulur.

Ayırca, NiFi, birden fazla JVM ile bir küme şeklinde de çalışabilir. Bu kümenin kontrolü de ZooKeeper Server tarafından sağlanmaktadır.

 

Bir NiFi kümesindeki(cluster) her düğüm(node), veriler üzerinde aynı görevleri gerçekleştirir, ancak her biri farklı bir veri kümesi üzerinde çalışır.
Apache ZooKeeper, Küme Koordinatörü olarak tek bir düğüm seçer ve düğüm üzerindeki yük devretme işlemleri, ZooKeeper tarafından otomatik olarak ele alınır.

 

 

NiFi ile alakalı anlatacaklarım şimdilik bu kadar, ileriki safhalarda kurulumu ve bir örneğini gösterdiğim bir videoyu buraya eklerim.

NiFi hakkında daha fazla bilgi edinmek için kaynaklar:
NiFi FAQ Wiki, NiFi Docs , Developer Guide, Apache NiFi Wiki

Umarım sizler için faydalı bir içerik olmuştur. Okuduğunuz için teşekkür ederim.
İyi çalışmalar.

Yeni başlayanlar için A’dan Z’ye Makine Öğrenmesi

Bir süredir makine öğrenmesi üzerinde çalışıyorum. Çeşitli yöntemleri, algoritmaları ve bunlara ait geliştirme ortamlarını deneyimliyorum.

Bu yazımda öğrendiğim temel bilgileri sizlerle paylaşmak istedim. Aşağıda makine öğrenmesi yöntemleri, algoritmaları, kullanılan kütüphaneler, ve geliştirme araçları ile ilgili bilgiler edineceksiniz.
Makine öğrenmesine yeni başlayacaksanız, bu yazının size oldukça fayda sağlayacağına inanıyorum. 

Hazırsanız başlayalım!

Makine öğrenmesi (Machine Learning) Nedir?

Makine öğrenmesi, günümüzde oldukça popüler olan otomotiv, eğlence, fen bilimleri, tıp ve pazarlama gibi pek çok alanda kullanılın, yapay zeka’nın bir alt koludur.

Temel olarak, otomatik öğrenme ve geliştirme ilkesine dayandırılır.

Makine öğrenmesi, çeşitli algoritmalar ve yöntemler ile veride bazı kalıpları arar ve bu kalıplara karşılık gelen etiketlere bakarak önce öğrenir, daha sonra (öğrendiklerine benzer durumla karşılaştığında) deneyimlerinden yararlanarak çıkarım yapabilen sistemler geliştirmeye imkan sağlar.

Bu imkanı, çeşitli matematiksel ve istatistiksel yöntemlerin kullanıldığı bir çok algoritma ile sağlamaktadır. Bu yöntem ve algoritmaların bir veya bir kaçı bir arada kullanılarak model(ler) oluşturulur ve bu model(ler), tahmin edilmesi istenilen şeyi, en verimli, en kesin en hızlı biçimde tahminlemeyi amaçlamalıdır.

Makine öğrenmesi algoritmaları genellikle üç şekilde sınıflandırılır.

-Gözetimli Öğrenme(Supervised Learning)
-Gözetimsiz Öğrenme (Unsupervised Learning)
-Takviyeli Öğrenme (Reinforcement Learning)



Gözetimli Öğrenme (Supervised Learning)

Bu sınıftaki algoritmalar, öğrendiklerinden yola çıkarak tahminleme yapmak için etiketli (labeled) verileri kullanır.
Yani eğitimde kullanılacak veri ve veriye ait sınıflar (kategoriler/etiketler) önceden bilinir. Bu bilgi ile sistem öğrenir ve yeni gelen datayı bu öğrendikleriyle yorumlar.

Gözetimli öğrenmedeki en zaman alıcı aşama eğitim verisinin hazırlanması aşamasıdır. Titizlikle hazırlanmamış bir eğitim verisi ile eğitilmiş sistem kötü tahminler yapacaktır.

Gözetimli Öğrenmeyi bir örnek ile anlatalım,

Bir sistem tasarlayacağınızı varsayalım. Bu sistem sizin gösterdiğiniz resimde kedi veya köpek olup olmadığını size söyleyecek. Böyle bir sistem için gözetimli öğrenme kategorisindeki makine öğrenmesi algorima(larına)sına ihtiyaç duyabilirsiniz.

Bu tarz algoritmaların çalışma prensibi bu örnekte şöyle olacaktır;
Resimde bir kedi olduğunu sistemin tahmin etmesini istiyorsak, sisteme önce bir miktar kedi resmi içeren veri seti vermemiz gerekiyor.
Bu veri setine eğitim verisi adı veriliyor. (train data) 

Bu eğitim versindeki fotoğrafların “kedi fotoğrafı” olduğunu eğitim verisinde belirtmemiz yani veriyi etiketlememiz (label) gerekiyor. Bu eğitim verisi ile sistem/algoritma eğitiliyor. Aynı işlem köpek resimleri için de yapılıyor.

Sistemi eğitmek için kullandığımız veriden farklı bir veri seti daha oluşturuyoruz (test data), bu veri setinin içine bazı kedi ve köpek resimleri ekliyoruz fakat bu sefer hangilerinin kedi hangilerinin köpek resmi olduğunu söylemiyoruz. Bu test verisi ile sistemi test ediyoruz.
Bu sayede sistem, yeni resmin içindeki hayvanın kedi veya köpek olup olmadığını tahmin edebiliyor.

Bu örnekte olduğu gibi bir eğitim veri seti ile eğittiğimiz makine öğrenmesi yöntemine gözetimli öğrenme yöntemi deniyor.

Gözetimli Öğrenme yöntemleri iki grupta incelenir;

– Sınıflandırma Yöntemi (Classification Method)
– Regresyon Yöntemi (Regression Method)

Sınıflandırma  Yöntemi (Classification Method)

Sınıflandırma problemi için geliştirilen algoritmalar, adından da anlaşılacağı üzere verileri belli özelliklerine göre sınıflandırırlar.

Sınıflandırma yapısal (structure) veya yapısal olmayan (unstructure) veriler üzerinde yapılabilir.

Eğer sistem, hangi verinin, hangi koşullarda, hangi sınıfa ait olacağı bilgisi ile sınıflandırılarak eğitilirse, yeni veri setindeki veriyi de öğrendiklerine benzer biçimde sınıflandırabilir.

Yukarıdaki kedi-köpek resimleri örneği bir sınıflandırma problemine örnektir. Orada da kedi resimleri, kedi sınıfı ile ilişkilendirilmiş sorasında yeni resimdeki figürün o sınıfa ait olup olmadığının tahmin etmesi beklenmiştir. 

Bir diğer örnek,
0-17 yaş aralığındaki kişileri çocuk,
18-25 yaş aralığındaki kişileri genç,
26 yaş ve üstündeki kişileri yetişkin sınıfıyla sınıflandırmak,
bu yöntemi gözünüzde canlandırabilmeniz adına bir diğer basit örnek olarak kabul edilebilir.
Ancak gerçek hayatta bu yöntemlerin kullanıldığı problemlerin çok daha karmaşık olduğu bilinmelidir.

Sınıflandırma Yöntemleri de aşağıdaki gibi kategorize edilir;

Binary Classification (İkili Sınıflandırma): İki olası sonuç ile sınıflandırma. Örn: Cinsiyet sınıflandırması (Erkek / Kadın)

Multi Class Classification (Çoklu Sınıf Sınıflandırma): İkiden fazla sınıfı sınıflandırma. Bir sınıfa ait birden fazla farklı veri varsa bu farklı veriler tespit edilir ve her biri tek bir etikete atanır. Örn: Bir hayvan sınıfında kedi ya da köpek olabilir ancak ikisi birlikte bir sınıfta olamaz kendi içinde sınıflara bölünmelidir.

Multi Label Classification (Çoklu Etiket Sınıflandırma): Bir veri birden fazla sınıfla ilişkilendirilebilir. Örn: Bir makale hem sağlık hem spor hem de insan ile ilgili olabilir.

Sınıflandırma yönteminde en çok kullanılan algoritmalar;

  • Naive Bayes : Verileri olasılık ilkeleri ile hasaplayarak sınıflandıran bir sınıflandırma algoritmasıdır. Basit bir ifadeyle, bir Naive Bayes sınıflandırıcı, bir sınıftaki belirli bir özelliğin varlığının başka herhangi bir özelliğin varlığına bağlı olmadığını varsayar. Örneğin, bir meyve kırmızı, yuvarlak ve çapı yaklaşık 3 inç ise bir elma olarak düşünülebilir. Bu özellikler birbirlerine veya diğer özelliklerin varlığına bağlı olsa bile, bu özelliklerin tümü, bu meyvenin bir elma olması olasılığına bağımsız olarak katkıda bulunur ve bu yüzden “Naif” olarak bilinir.
  • Eğitilmiş veriler üzerinde olasılık işlemleri yapılır ve sisteme sunular yeni verinin önceki olasılık değerine göre sınıflandırılması sağlanır. Başka bir örnek ile ifade edilecek olursa: binlerce makalenin hangi alanda yazıldıklarına göre kategorize etmek istiyorsunuz. (tıp, teknoloji, edebiyat) Bunun için belli makalelerde geçen belli kelimelerin olasılık değerlerinin, diğerlerine oranla fazla olması durumuna göre o makalenin hangi kategoriye ait olduğunu öğrenmek isterseniz(Sağlık kelimesinin çok geçtiği makale tıp ile ilgili bir makaledir gibi) bu algoritma işinize yarayabilir.
  • K-Nearest Neighbours (En Yakın Komşu) : Bu tip sınıflandırma, her bir noktanın en yakın komşularının basit çoğunluk oyu ile hesaplanması ile elde edilen sınıflandırmadır. Veri hangi veriye en çok yakındır? mantığı ile dallanır. 
    Bu algoritmanın uygulanması kolaydır, gürültülü eğitim verisine (noisy training data) dayanıklıdır ve eğitim verileri büyükse oldukça etkilidir.
  • Decision Tree (Karar Ağacı) : Veriler, sınıfları ile birlikte bu algoritmaya verildiğinde, algoritma verileri sınıflandırmak için kullanılabilecek bir dizi kural üretir. Karar düğümleri(decision node) ve yaprak düğümleri(leaf node) olan bir ağaç yapısına sahiptir. Hem sınıflandırma hem de regresyon yönteminde kullanılabilir.
  • Random Forest :  Sınıflandırma işlemi sırasında birden fazla decision-tree kullanılarak sınıflandırma değerinin yükseltilmesi hedefleyen, sınıflama veya regresyon yönteminde kullanılabilen algoritmadır.
  • Support Vector Machine (Destekçi Vektör Makinesi) : Veri setinde birbirine benzeyen gruplar arasına birbirinden en uzak olan noktalardan sınırlar çizmeye yarayan algoritmadır.

 

Regresyon Yöntemi (Regression Method)

Diğer gözetimli öğrenme yöntemlerinden biri de Regresyon Yöntemidir. Regresyon problemleri, üretilen çıktının sürekli sayılardan oluştuğu durumlar için kullanılıyor.
Örnek, bir çalışanın işe geldiği gün sayısı, gün içinde ürettiği ürün adedine göre ona sayısal bir verimlilik puanı oluşturmak isterseniz regresyon algoritmalarını kullanabilirsiniz.
Regresyon algoritmaları gözetimli öğrenme kategorisinde olmasının yanı sıra anomaly detection (anormal durum yakalama) gibi durumlarda hem gözetimli (supervised) hem gözetimsiz (unsupervised) öğrenme yöntemleri ile kullanılabilir.

En çok kullanılan Regresyon algoritmalarına bir bakalım;

  • Linear Regression: Sayısal girdi ve çıktılar arasındaki doğrusal ilişkiyi tespit etmeyi sağlar. Düzlemde yayılmış verinin modelini en iyi biçimde doğrusal olarak çıkartmaya çalışan yöntemdir.
  • Logistic Regression: Bir sonucu belirleyen bir veya daha fazla bağımsız değişken bulunan veri kümesini analiz etmek için düzlemde en iyi eğriyi yakalamaya çalışan istatistiksel bir yöntemdir. Sonuç, ikiye bölünmüş bir değişkenle ölçülür (sadece iki olası sonuç vardır).
  • Multiple Linear Regression: Birden fazla tahminleyici (predictor) değişken kullanarak tahminlemeye çalışılan doğrusal regresyonun adıdır.
  • Polynomial Regression:  Veriler arası ilişki her zaman doğrusal olmayabilir. Optimum ilişkiyi bulmak için bir eğri gerekebilir. Tıpkı polinom fonksiyonlarında olduğu gibi bu yöntemde de bir terimin karesi veya küpü(veya terimin üssü herhangi bir sayı olabilir) alınarak doğrusal olmayan bir regresyon modeli oluşturulmak istenebilir. Bu gibi durumlarda kullanılabilen bir algoritmadır.
  • Support Vector Regression: Algoritmayı karakterize eden tüm ana özellikleri (maksimal marjı) koruyan bir regresyon yöntemi olarak da kullanılabilir. Support Vector Machine ile aynı ilkeleri kullanır. Ana fikir, hatanın en üst düzeye çıkarıldığı hiper düzlemi bireyselleştirerek hatayı en aza indirgemek, hatanın bir kısmının tolere edildiğini göz önünde bulundurmak. Örn: Bir personelin eğitim seviyesine göre maaşını tahmin eden model geliştirmek.
  • Decision Tree: Sınıflandırma yönteminde de kullanılan decision tree, regresyon yönteminde de aynı şekilde kullanılabilir. Bu algoritma, kök düğümden başlayarak, yukarıdan aşağıya inşa edilen node’lar (düğüm) ile verilerin, kendi içlerinde benzer değerlere (homojen) sahip olanlarının alt kümelere ayrılmasını sağlayan algoritmadır.

 

Gözetimsiz Öğrenme(Unsupervised Learning):

Gözetimli öğrenme yönteminin aksine herhangi bir kategorize edilmiş, etiketlenmiş eğitim verisi kullanılarak eğitilmez. Gözetimsiz öğrenme yöntemi, önceden eğitilmemiş veriler üzerinde çalışarak veriler arasında bağıntılar bulup birbirine yakın anlamda/içerikte/değerde olan verilerin kendi içinde kümelenmesi mantığıyda çalışır.

Girdi verisinin hangi sınıfa ait olduğu önceden bilinmez. Bu sınıflandırma işlemleri veriye bakılarak algoritmalar tarafından öğrenilir. Yeni gelen veriler de algoritmanın oluşturduğu gruplara uygun olarak en yakın gruba atanır.

Gözetimsiz öğrenmeye örnek verecek olursak;

Bir market işlettiğinizi varsayalım müşterilerinizin ürün satın alırkenki davranışlarını incelemek ve ona uygun şekilde ürünlerinizin stoklarını güncellemek veya raf düzenlemesi yapmak istediğinizi varsayalım.
Her gün yüzlerce müşterinizin geldiğinizi hesap edersek, bu durumda sistemi “bu satılırsa şu da satılır” şeklinde bir eğitim verisi ile eğitebilmeniz olası değildir.

Bu yüzden gözetimli öğrenme algoritmaları kullanmak yerine gözetimsiz öğrenme algoritmaları kullanarak birbiri ile yakın alışveriş alışkanlıkları olan müşteri gruplandırabilir. Çıkan gruplara göre stoklarınızı güncelleyebilir veya raf düzenlemenizi buna uygun yapabilirsiniz.

Bu ve bunun gibi örnekleri çoğaltmak mümkün.
Kısacası eğitim verisi hazırlanamayacak karmaşıklıktaki veriler için gözetimsiz öğrenme yöntemi kullanılmalıdır.

Gözetimsiz öğrenme yöntemleri genelde üç başlık altında incelenir;

  • Kümeleme (Clustering)
  • Birliktelik Kuralı (Association Rule Mining )
  • Boyut Azaltma (Dimensionality Reduction)

Kümeleme (Clustering)

Kümeleme yöntemi, veri setindeki her bir verinin birbirlerine benzerlik durumlarına göre gruplara ayrılması işlemine denir.

Her bir grup birer küme anlamına gelir.  Her kümede birbirine en yakın veriler olmalı ve birbiriyle benzerlik göstermeyen veriler de mümkün olduğunca farklı kümelerde olmalıdır yani kümeler arası benzerliğin az olması gerekmektedir.

Örneğin, elimizde renk kodlarından oluşan bir veri seti var. Ve biz bu veri setindeki birbirine yakın renkleri gruplamak istiyoruz.

Bu durumda şöyle bir soru ortaya çıkıyor;

Küme(bu örnek için renk sayısı) sayısını biz mi belirleyeceğiz? Yoksa algoritma kendisi mi bulacak?
Bu sorunun cevabı her ikisi de mümkün.

Kümeleme algorimaları birbirine yakın renkleri bir araya getirerek kümeler oluşturabilir. (5 küme, 10 küme vs.)  Ancak biz bu renklerden sadece “kırmızı”,”yeşil”, “mavi” renklerin kümelenmelerini istiyorsak küme sayısını 3 belirtebiliriz.
Bu sayede veri setimizdeki verilerden
kırmızı alt tonlu olanlarını bir kümeye,
yeşil alt tonlu olanlarını başka bir kümeye,
mavi alt tonlu olanlarını bir başka kümeye ayırabiliriz.

Elimizdeki veriye en uygun küme sayısını belirlemek istememizdeki temel sebep;

1- Küme içindeki değerlerin birbirine en çok benzemesi
2- Kümelerinse birbirinden olabildiğince farklı olmasıdır.

Çok fazla küme ile çalışmak birbirine çok benzeyen kümelerin oluşmasına sebep olabilir.  Bu yüzden optimal bir küme sayısı belirtmek gerekir. Ancak küme sayısını kolayca belirtmek her veri seti için mümkün olmaz.
Bu yüzden K-Means Algoritması kullanılır.
Bu algoritma, kullanacağınız veri setinde oluşturabileceğiniz optimal küme sayısını size söyleyebilir.


Birliktelik Kuralı (Association Rule Mining)

Bu kural kümeleme yönteminden farklı olarak değişkenler arası ilginç ilişkileri keşfetmek için kurallar arayan bir yöntemdir.

Veri seti içindeki geçmiş tarihli hareketlerin örüntülerini analiz eden ve birlikte gerçekleşme durumlarını çözümleyen veri madenciliği yöntemidir. Bu örüntülerden hareketle gelecekteki veriler için tahminleme yapabilir.

Birliktelik kuralı (Association Rule) algoritmaları ile sepet analizi yapabilirsiniz.

Hangi müşteri hangi ürünle birlikte neleri satın almış bunları inceleyebilirsiniz. Bu sayede geliri arttırmak ve verimi yükseltmek adına her müşteri için özel ürün tavsiyelerinde bulunabilir, promosyonlar yapabilir, stoğunuzu bu bilgiler ile güncel tutabilir, raf düzenlemesinde bu analizden faydalanabilir ilişkili ürünleri birbirine yakın dizebilirsiniz.

Association Rule ile ilgili en çok kullanılan algoritmalardan bazıları şunlardır;

-Apriori algorithm
– Eclat algorithm
-FP-growth algorithm

Yukarıdaki algoritmaların hepsinin amacı veriler arasındaki bağıntıyı ortaya çıkartmaktır. Bu amaç için her biri kendi içinde farklı matematiksel işlemleri barındırır.

Not: Kümeleme ve Birliktelik Kuralı yöntemleri arasındaki temel fark; Kümeleme, veri noktaları ile ilgilidir, Birliktelik Kuralı ise bu veri noktalarının nitelikleri arasındaki ilişkileri bulmakla ilgilidir.

Boyut Azaltma (Dimensionality Reduction)

Boyut azaltma, amaç doğrultusunda en iyi sonucu verecek olan öznitelikler(feature) ile çalışmak için kullanışsız, gereksiz olan öznitelikleri çıkartmak, veri boyutunu azaltmak olarak nitelendirilebilir.

Öznitelik (feature): Veriye ait her bir özelliğe verilen isimdir. (Örn: ad, soyad, yaş, doğum yeri, kan grubu vs. bilgisi)

Örneğin, elimizde kişilere ait kan değerlerinin ve kişisel bilgilerin yer aldığı bir veri seti aşağıdaki gibi olsun;
Adı,
Soyadı,
Kan grubu,
Hemogram değeri,
Lökosit saysı,
Eritrosit sayısı,
Kişinin kullandığı ilaçlar,
Kişinin saç rengi,
Göz rengi,
Ten rengi

Bir kişinin kan değerlerine bakılarak bir hastalık tespiti yapmak istiyorsak, buradaki kan değerlerinin her birine ihtiyacımız olacak.
Ancak kişinin saç, göz ve ten rengi bilgisine ihtiyacımız yok. Bu yüzden bu öznitelikleri veri setinden çıkartıp çok daha rahat analiz yapmayı sağlayabiliriz bu işlemin bir diğer adı Feature Selection’dır (aşağıda bir daha üzerinden geçiliyor).


Peki veri boyutu çok büyüdüğünde, gereksiz öznitelikleri nasıl tespit edeceğiz?

Bunun için PCA (Principal Component Analysis) isminde bir algoritma var. Hangi özniteliğin çıkartılması konusunda PCA yardımcı olmaktadır.

Boyut azaltma konusu başlığı altında incelenmesi gerek diğer konular ise;

1 – Öznitelik Çıkarma ve Öznitelik Mühendisliği (Feature Extraction and Feature Engineering): Ham verilerin modelleme için uygun özniteliklere dönüştürülmesi, ham veri içinden uygun olanların ham haldeyken işleme alınmasıdır. Örneğin, bir kişinin parmak izlerini ve yüzünü tarattığı verilerden oluşan bir veri setiniz var. Siz de parmak izi verileri ile ilgili bir çalışma yapmak isiyorsunuz. O halde yüz tanıma verilerini kullanmanıza gerek yoktur. Veri ham haldeyken yüz tanıma verilerini yok sayabilirisiniz.

2 – Öznitelik Dönüşümü (Feature Transformation): Algoritmanın doğruluğunu artırmak için verilerin dönüştürülmesidir. Bir veya birden fazla öznitelik birleştirilerek elde edilebilir. Ya da var olan özniteliğe yeni bir şey eklenerek (bir sayı, bir harf vs.) yeni öznitelik yaratılabilir. Bu yöntemlere öznitelik dönüşümü adı verilir. Dönüştürülen yeni öznitelik, eski özniteliklerin özelliklerini taşır veya taşımayabilir.

3 – Öznitelik Seçimi (Feature Selection): Gereksiz özelliklerin kaldırılması (Yukarıda anlatılan kan değerlerine bağlı hastalık tespiti” öznitelik seçimine örnektir.).

Takviyeli Öğrenme (Reinforcement Learning)

Bu öğrenme biçimi diğerlerinden biraz farklıdır. Temelinde canlıların davranış psikolojisine dayandırılır. Bu yöntem öğrenme işlemini çevreden aldığı geri bildirim (feed-back) ile gerçekleştirmektedir.

Bu yöntemle olası durumların, hedef olup olmadığının kontrol edilir. Denemelerin sonucunda hedefe ulaşılamadığında ceza (penalty), ulaştığında ise ödül (reward) sinyali alınır ve sistem ceza sinyali aldığı hamleyi bir daha tekrarlamaz. Ödül sinyali aldığı deneyimden faydalanarak öğrenmeye devam eder ve hep maksimum ödülü amaçlayarak sürekli öğrenmeye işlevini sürdürür.

Bu sebeple mükemmele erişme, öğrenmeyi durdurma gibi bir durum söz konusu olmaz. Algoritma sürekli öğrenmeye devam eder.

Örneğin, 2017 yılında Google’ın geliştirdiği yapay zeka AlphaGo, Go oyunu dünya şampiyonu Ke Jie’yi yenmişti. AlphaGo’nun öğrenme mantığının arkasında Reinforcement Learning vardı.

Bu yöntemde esas amaç, insan beynine ve algılarına yakın (veya çok daha iyi düzeyde) işleyen algoritmalar geliştirmektir.
Deep Learning algoritmaları takviyeli öğrenme mantığı ile geliştirilmiştir.

Nereden başlamalıyım?

Makine öğrenmesine nereden başlayacağınızı düşünüyorsanız, aşağıdaki adımları takip etmek size yardımcı olacaktır;

1- Geliştirme yapmayı istediğiniz bir programlama dili seçin
Makine öğrenmesinde sıkça kullanılan programlama dilleri arasından bir dil seçin. Aşağıdaki grafikte 2015- 2017 yılları arasında makine öğrenmesinde kullanılan popüler dilleri göreceksiniz. Bunlardan birini seçebilirsiniz.

2015- 2017 yılları arasında makine öğrenmesinde kullanılan popüler dillerin grafiği

2- Seçtiğiniz dile özel geliştirilmiş makine öğrenmesi kütüphaneleri hakkında bilgi sahibi olun

Diyelim ki bu diller içinden Python’ı seçtiniz. Burada makine öğrenmesi için yazılmış olan kütüphaneleri ve işe yaradıklarını öğrenin.

2.1 – Python’da kullanılan Core Kütüphaneleri:

NumPy: NumPy, bilimsel/matematiksel/mantıksal/istatistiksel hesaplama için oluşturulmuş bir python kütüphanesidir. NumPy kullanılarak istatistik işlemleri ve simülasyonlarda yapılabilir.

SciPy: Sık kullanılan matematiksel ve fiziksel problemlerinin bilgisayar ortamında ifade edilmesine yönelik fonksiyonları barındırmaktadır.

Pandas: “etiketli” ve “ilişkisel” verilerle çalışmak üzere tasarlanmış, yapısal olmayan verinizi yapısal veritabanlarındaki gibi çalıştırmanızı sağlayan kütüphanedir. Pandas, hızlı ve kolay veri işleme, toplama ve görselleştirme için tasarlanmıştır. İki temel veri yapısına sahiptir;

Serie: tek boyutlu tablo yapısına sahiptir.
DataFrame: iki boyutludur tablo yapısına sahiptir.

2.2 – Python’da kullanılan Analiz Görüntüleme (Visualize) Kütüphaneleri:

MatplotlibGrafik çizimi için kullanılır. Bilimsel programlamanın en önemli araçlarından birisidir. Verilerin etkileşimini görselleştirebilir ve görsel raporlar oluşturulabilinir. İki boyutlu ya da üç boyutlu grafikler üretilebilir. Grafik çeşitleri aşağıdaki gibidir.
Line plots,
Scatter plots,
Bar charts and Histograms,
Pie charts,
Stem plots,
Contour plots,
Quiver plots,
Spectrograms

Seaborn: Daha çok istatistiksel modellerin görselleştirilmesine odaklanmıştır; Bu tür görselleştirmeler, ısı haritalarını, verileri özetleyen ama yine de genel dağılımları tasvir eden grafikler için kullanılır. Seaborn, temelinde Matplotlib’e bağımlıdır.

Bokeh:  İnteraktif görselleştirmeleri amaçlayan Bokeh, Matplotlib’den bağımsızdır. Data-Driven Document yani veriye dayalı dökümanların görselleştirmesini yapan yüksek özellikli görselleştirme imkanı sağlayan bir Python kütüphanesidir.

Plotly: Bu kütüphane web tabanlı görselleştirmeler oluşturabilen bir kütüphanedir.

2.3 – Python’da kullanılan Makine Öğrenmesi Kütüphaneleri:

SciKit-Learn: Scikits, görüntü işleme ve makine öğrenimi kolaylaştırma gibi belirli işlevler için tasarlanmış bir Python kütüphanesidir. Doğrusal regresyon, lojistik regresyon, karar ağaçları, rastgele orman gibi birçok temel yöntemi içerir. 

Theano: Çok boyutlu diziler dahil matematik ifadelerini etkili bir şekilde tanımlamayı, en iyilemeyi ve değerlendirmeyi sağlayan bir Python kütüphanesidir. Derin öğrenme(Deep learning) için kullanılan kütüphanedir.

TensorFlow: Google’ın çıkarttığı bir makine öğrenmesi kütüphanesidir. Açık kaynak kodludur. Python ile geliştirilebilinir. Derin öğrenme için kullanılan bir kütüphanedir.

Keras: Modellerı tanımlamayı ve eğitmeyi kolaylaştırmayı sağlayan, Theano veya Tensorflow’u backend olarak kullanan ve python dilini kullanan bir wrapper.

2.4 – Python’da kullanılan Doğal Dil işleme Kütüphaneleri:

NLTK (Natural Language Toolkit): Doğal Dil İşleme için kullanılır.
NLTK, dilbilim, bilişsel bilim, yapay zeka, vb. gibi konuların öğretimini ve araştırmasını kolaylaştırmayı amaçlamıştır ve bugün bu konuya odaklanarak kullanılmaktadır.

Gensim: Ham ve yapılandırılmamış dijital metinlerle kullanılmak üzere tasarlanmıştır. Hem verimli hem de kullanımı kolaydır.

2.5 – Python’da kullanılan Veri madenciliği, İstatistik Kütüphaneleri:

Scrapy: Websitelerinden iletişim bilgileri veya URL’ler gibi yapılandırılmış verilerin alınması için, örümcek botlar olarak da bilinen tarama programları yapmak için bir kütüphanedir.

Statsmodels: İsminden de anlaşılacağı gibi bir istatistik kütüphanesidir. Kullanıcılarına istatistiksel modellerin tahmin edilmesini, çeşitli yöntemlerle istatistiksel analizlerin yapılmasını bu istatistiklere bağlı veri araştırması yapabilmeyi sağlar.

Bunlara ek olarak; Lasagne, Caffe, Torch kütüphanelerini  ve gerçek zamanlı işlemlerde kullanabileceğiniz PySpark interface’ini de inceleyebilirisiniz.

3-Hangi Geliştirme Ortamı (IDE) kullanılmalı?

Bu ve bunun gibi kütüphaneleri çalıştırmak için bir Python geliştirme ortamı (veya hangi dili seçtiyseniz ona ait bir geliştirme ortamı) gerekecektir.
 – Jupyter/IPython Notebook
– PyCharm
– Spyder
– Rodeo
– Geany gibi ortamları bu iş için rahatlıkla kullanabilirsiniz.

4- Anaconda Navigator’da bu iş için biçilmiş kaftan!

Yukarıda bahsettiğim geliştirme ortamlarını kullanmak yerine, veri bilimi için hazırlanmış, içersinde Python dilini kullanabileceğiniz ve makine öğrenmesine dair bir çok paket programı, kütüphaneyi içeren Anaconda isimli programı da bu linkten indirerek kurabilir ve çalışmalara başlayabilirsiniz.
Anaconda’nın içerisinde Jpyter, Spider, Vscode gibi makine öğrenmesi çalışmalarınızda size yardımcı olacak bir çok araç birlikte geliyor.

5- Bu adımları takip ederek ilk makine öğrenmesi projenizi gerçekleyebilirsiniz 
ama hepsinden önce!

Eklemek istediğim bir şey daha var, burada kullanılacak yöntem ve algoritmaların temelini anlamak için temel düzeyde matematik (Cebir, İstatistik, Kalkülüs vb.) bilginizin olması gerekmektedir. Ancak bu sizi korkutmasın, her algoritmanın çok detayına girmeden de rahatlıkla makine öğrenmesi projeleri yapabilirisiniz.

 Sonuç

Yukarıda anlattığım gibi farklı şekillerde makine öğrenmesi yöntemleri, bu yöntemlere ait bir çok (buraya ekleyemediklerim dahil) algoritma ve bir çok araç mevcut.

Bunlardan hangisini ne zaman kullanacağız sorusunun yanıtı olarak şunu söylemek doğru olacaktır;

Veri madenciliği deneysel bir iştir. Veri setinize ve amacınıza bağlı olarak bu algoritmaların birini ya da bir kaçını birleştirerek kullanmanız gerekebilir. Amacınız maksimum verimliliği sağlayacak bir sistem modeli elde etmek olmalıdır. Hangisi veya hangilerinin kombinasyonu ile en verimli sonuca ulaşacağınıza ancak deneyerek karar verebilirsiniz.


Umarım sizler için faydalı bir içerik olmuştur.

İyi çalışmalar dilerim.

Apache Spark Nedir? Apache Hadoop’tan Farkları Nelerdir?

Apache Spark Nedir? Apache Hadoop’tan Farkları Nelerdir?

Apache Spark ve Apache Hadoop, teknolojilerinin her ikisi de büyük veri frameworkleridir.

Hadoop bildiğiniz üzere büyük verileri birden fazla makinede paralel biçimde işlemeyi, kaydetmeyi ve yönetmeyi sağlayan bir teknolojidir. Hadoop verilerin saklanması için HDFS (Hadoop Distributed File System) kullanır.  Verileri işlemek için de Map-Reduce yönetmini kullanır.

“Madem Hadoop ile büyük verileri hem işleyip hem kaydedebiliyoruz, öyleyse Spark’a niye ihtiyacımız var?”

Teknolojik gelişmelerin geneli ihtiyaçtan doğar. Spark’ta tıpkı Hadoop gibi ihtiyaçtan doğdu. İkisi de büyük veriler için kullanılıyor fakat aynı amaçlara hizmet etmiyorlar. Bu sebeple birbirlerinden ayrıldıkları yerler bir hayli fazla.

Gelin Apache Spark’ın Hadoop’tan ayrıldığı yerleri inceleyelim;

Spark, veriyi işlemek için kullanılır, kendi dosya yönetim sistemi ve veri depolama aracı yoktur. Bu yüzden HDFS veya başka bir bulut tabanlı veri platformuyla entegre edilmesi gerekiyor.

Hadoop ise veri işlediği gibi dağıtık veri depolamayı da sağlar. Pahalı ve özel makinelere gerek kalmaksızın büyük verilerini saklayabileceğiniz HDFS yapısına sahiptir.


Spark, in-memory çalışır. Yani veriyi RAM’de işler.

Hadoop ise Map-Reduce yapısı ile veriyi diskte tutarak işler.

Bu sebeple Spark’ın Map-Reduce yönteminden 100 kat daha hızlı olduğu iddiaları vardır. Evet, Spark Map-Reduce yönteminden hiç şüphesiz çok daha hızlıdır. Ancak bunun 100 kat şeklinde ifade edilmesi “duruma göre” değişiklik göstereceği gözden kaçırılmamalıdır.

Çünkü Spark, belleğe sığmayan verileri işlemek için diskte kullanabilir. Elde edilen veri kümesinin mevcut RAM’den daha büyük olması durumunda, —Hadoop MapReduce Spark’den daha iyi performans gösterebilir.


Spark, içersinde Spark Streaming’i barındırdığı için yakın gerçek zamanlı (Near Real Time) veri işleme için de kullanılır.
Makine öğrenimi, IOT sensörleri, günlük log’lar, güvenlik analizleri ve sosyal medya sitelerinden elde edilen veriler için gerçek zamanlı analitiği sunar.

Hadoop Map-Reduce, ise çıkış noktası olarak batch processing(var olan verileri işlemek)  için ortaya çıkarılmıştır. Web sitelerinden sürekli bilgi toplamak için kurulmuştu ve bu aşamada gerçek zamanlı veri işleme ihtiyacı söz konusu değildi. Dolayısıyla gerçek zamanlı veri işleyen bir teknoloji ile kıyaslandığında bu çıkış noktası ihmal edilmemelidir.


Spark, RDD (Resilent Distributed Dataset) isimli yüksek seviyeli bir operatöre sahiptir. (Bir nevi collection objesi gibi çalışır.)
RDD kullanarak yapısal olmayan(unstructure) datalar ile -özellikle tekrar eden- işlemleri yapmak oldukça kolay ve hızlıdır.

Map-Reduce ise RDD’nin aksine geliştiricinin işini zorlaştıran bir yapıya sahiptir, her işlemin elle kodlanması gerekir ve diske ara sonuçları yazması gerektiğinden dolayı daha yavaştır.


Spark, Java, Scala, Python  ve R dilleri ile geliştirilebilir.

Ek bilgi: Scala programlama dili için Spark’ın ana dili tanımlaması yapılır ancak Python da kütüphane zenginliğinden ve syntax kolaylığından dolayı Spark ile birlikte sıkça kullanılan popüler bir dildir.

Hadoop, Java yerel dilidir fakat diğer betik dillerle de programlanabilir. (Popüler olanlar; Java, Python, Scala)


Spark,

  • Makine öğrenmesi uygulamaları geliştirebilmek için MLib kütüphanesi sunar.
  • Ayrıca GraphX kütüphanesi ile graph tabanlı hesaplamalar yapmaya imkan sağlar. Hadoop bu özellikler için farklı eklentilere ihtiyaç duymaktadır.

Spark, Spark SQL isminde SQL diline çok benzeyen bir sorgu diline sahiptir.

Hadoop,  Map-Reduce ise Hive ve Pig, Impala gibi dağıtık SQL sorgu teknolojilerini kullanarak sorgu işlemlerini gerçekleştirebilirsiniz.


Spark, kendi içinde MLib, Spark SQL, Graphx, Spark Streaming gibi özellikleri barındırdığı için bunların yönetimi de Hadoop’a kıyasla daha kolaydır.

Hadoop, Spark’ın içinde tümleşik gelen bu özelliklerin her biri için bünyesine farklı teknolojiler ilave etmek durumunda olduğundan dolayı yönetmek zorlaşacaktır.


Spark, birden fazla veri kümesinin birleştirilmesi gereken yerlerde Hadoop’tan çok daha hızlı biçimde join işlemi gerçekleştirebilir.

 Hadoop Map-Reduce yöntemi, Eğer çok büyük boyuttaki veri setlerini birleştirmek gibi bir işlem yapacaksanız işe yarayacaktır. (Örneğin binlerce sayfalık text dökümanlarının olduğu veri setleri)


Spark, kullanım esnasında herhangi bir hata olduğunda bunu tolare edebilir, olası bir arıza durumunda uygulamayı sıfırdan başlatmanıza gerek yoktur.

Hadoop Map-Reduce  da hataya dayanıklıdır arıza durumunda uygulamayı sıfırdan başlatmak gerekmemektedir.


Spark, Shared Secret (Kimlik doğrulama sistemi her iki tarafında gizliliği korumasıyla sağlanır.) ile kimlik doğrulamayı destekler.

Hadoop Map-Reduce ise Kerberos (Kerberos, TCP/IP yapısının yeterince güvenli bulunmaması sonucu MIT tarafından geliştirilen bir ağ kimlik denetleme protokolüdür.) ve  Access Control Lists (ACL, farklı networkler arasında iletişim kurmayı sağlayan Router üzerine gelen ya da giden iletişim trafiğini kaynak ip bazında ya da port bazında filtreleme yapabilmemizi sağlayan kontrol mekanizmasıdır.) kullanımı sayesinde Spark’tan çok daha güvenli bir ortam sağlar.


Peki hangisini seçmeliyiz?

Her iki büyük veri framework’ü de yukarı da anlattığım üzere ihtiyaca binaen kullanım alanlarında farklılık gösterecektir.

Spark, hızlı performans, tekrarlı işlem de kolaylık, gerçek zamanlı analiz, grafik işleme, makine öğrenimi gibi özellikleri ile kullanım avantajı sağlıyorken,

Eğer projenizde tümleşik bir dosya sistemine ihtiyacımız var ise, büyük boyutlu veri setleri ile çalışıyorsanız, gerçek zamanlı bir uygulama geliştirmeyecekseniz ve veri güvenliği sizin için kritik önceliklerdense Hadoop kullanımı mantıklı hale gelecektir.

Tabi hem gerçek zamanlı işlemler yapayım hem de işlediğim verileri tutmak için HDFS kullanayım derseniz her teknolojiyi hibrit biçimde kullanabilirsiniz.

 

Umarım bu kıyas yazısı yardımcı olmuştur.
Okuduğunuz için teşekkür eder,

İyi çalışmalar dilerim

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.

Elasticsearch Nedir? | Nasıl Kurulur? | Elasticsearch Örneği

Elasticsearch Nedir?

Elasticsearch, full-text arama motorudur(search engine).
Java ile geliştirilmiştir ve Lucene alt yapılıdır. 

Eğer siz de benim gibi elasticsearch gibi teknolojileri daha önceden bilmiyorsanız, full-text search ve Lucene tabanlı olduğunu okuduğunuzda zihninizde pek bir şey canlanmayacaktır.

Bunu biraz anlayabilinecek dilde ifade etmeye çalışalım;

Büyük veri ile ilgili yazdığım önceki yazılarımı okuduysanız, her geçen gün büyüyen ve gelişen teknolojilerin ürünü olan yazılımların bizler tarafından kullanılması sonucu, büyük ölçekli verilerin oluştuğunu artık biliyorsunuz. Bu verilerin her birinin yapılandırılmış biçimde kayıtlanması çoğu zaman mümkün olmuyor ve genelde bu büyük ölçekli veriler yapısal olmayan(unstructured) biçimde kayıtlanıyor. Haliyle bu yapısal olmayan verilerin analizi, işlenmesi, bu veriler içinde arama yapılması geleneksek yöntemlerle zorlaşıyor hatta imkansızlaşıyor. İşte tam da bu noktada büyük veri teknolojileri devreye giriyor.

Elasticsearch’de hem Near Realtime (Gerçek zamana yakın) hem de Distributed(dağıtık) yapısıyla veriler içerisinden içerik aramaları, veri analizi ve sorgulamalar yapıyor. 

Peki Lucene tabanlı derken kastedilen nedir? 

En basitinden  açıklamak gerekirse, her şeyin başta bir ihtiyaçla başladığı ve tüm teknolojilerin ihtiyaç üzerine geliştirildiği bir dünyada bir metin arama aracına ihtiyaç duyuldu ve ilk olarak Lucene geliştirildi.
Lucene, full-text search için geliştirilirken temelinde bazı mantık ve metodolojilerle geliştirildi ve oldukça işlevsel biçimde büyük boyutlu metinler üzerinde arama yaparak çalışmaya başladı.
Lucene, tek makinede “devasa boyutta” metin dosyaları üzerinde arama yapıyorken harika iş çıkartıyordu.
Ancak gelişen dünyada veriler de hızlı ve anlık(real-time) olarak akmaya başladı. Ve bunları ölçeklemek için dağıtık(distributed) sistemler geliştirildi. Ancak Lucene bu sistemlere artık uyum sağlayamıyordu. Bunun için dağıtık sistemlere uyum sağlayabilecek teknolojiler üretilmeye başlandı. Elasticsearch’de bu ürünlerden bir tanesi.

Elasticsearch’te tıpkı atası olan Lucene gibi full-text search yapıyor. Ancak dağıtık olarak indexlemeye izin veriyor, dağıtık veriler üzerinden aramalar yapabiliyor.

Elasticsearch’ün özelliklerini inceleyelim;

  • Java tabanlıdır.
  • Apache Lucene alt yapılıdır. (Shared ve Replica kavramları ES’te de aynen geçerlidir.)
  • Açık kaynaktır.
  • Veri saklama biçimi ilişkisel değil document-oriented şeklindedir.
  • Dağıtık ve ölçeklenebilir yapıda çalışabilir.
  • Gerçek zamanlı verileri analiz etmeyi sağlar.
  • Type, Fields, Documents, Fields, Indicates, Full-text search, Index gibi kavramlara sahiptir(Aşağıda açıklamalarınu göreceksiniz.)
  • RestfullAPI üzerinden hizmet verdiğinden dolayı tüm programlama dilleriyle kullanılabilir.
  • Veri tipine uygun biçimde otomatik Mapping yapabilir.
  • Cluster yapıya sahiptir ve cluster yapısı oldukça basittir.
  • Elasticsearch’ü monitör edebilen Kibana ve log barındırmak için Logstash araçları ile bilirkte kullanılabilir.
  • Kendi içinde yüksek erişilebilirlik (high availability) sunar.
  • Dökümanları JSON olarak indexler.
  • Hızlı kurulum ve kolay konfigürayon vadeder.
  • Elasticsearch’e veri aktarmak oldukça kolaydır. (Veri aktarımı için River gibi yapıları mevcuttur.)
  • HBase, Cassandra, MongoDB gibi NOSQL veritabanlarından da ES’e aktarım yapmayı mümkün kılar.

Elasticsearch bileşenlerine ve temel prensiplerine değinelim,

Indice
Yukarıda görüldüğü üzerine klasik ilişkisel veritabanlarında Database’lerin yerine Elasticsearch’te Indice kavramları kullanılmakta.
Bir  Elasticsearch Cluster’ı birden fazla indices(veritabanları) bulundurabilir.

Type
İlişkisel veritabanlarındaki tablolar için ES “Type” kavramını kullanır. 
Bir indice, birden fazla type(tablo) barındırabilir.

Document
Elasticsearch’te, ilişkisel veritabanlarındaki Rows (satılar), Documents (Dökümanlar) olarak temsil edilirler. Her type, birden fazla document’a sahiptir.

Field
Klasik veritabanlarındaki Column’lar, Elasticsearch’te Field(Alan/kolon) olarak nitelendirilir. 
Her document bir den fazla fileld’a sahiptir.

Full-text search (Tam metin arama)

Herhangi bir kaynaktan alınan metin belgeleri içinden, herhangi bir anahtar kelimenin aratılarak, anahtar kelime ile eşleşen dökümanların bulduğu  sonuca hızlı şekilde erişime verilen isimdir.

Örneğin, wikipedia.com‘da bir bilim adamının ismini aratıp bununla ilgili yazılan yazıları okuyacağınızı varsayalım.
Wikipedia’nın arama çubuğuna Nicola Tesla yazdığınızda onunla ilgili yazıları bulmak için kayıtlı tüm yazılarda arama yapmak yerine, önceden indekslenmiş veriler içinden Nikola Tesla’nın adının geçtiği metinlerin olduğu index’e hemen gidip hızlıca size sonuç döndürmeyi sağlayan yapıdır.

Index

Elasticsearch’e eklenen her kayıt JSON belgesi olarak yapılandırılır. Yani, dökümanlarınızın içindeki her bir kelime(terim) için hangi döküman yada dökümanlarda o kelimenin olduğu bilgisini tutan bir endeksleme sistemi vardır. Bir nevi veritabanı gibi düşünebilirsin. Veritabanındaki verilerde olan düzen gibi, Elasticsearch’ün indexleri de JSON formatı şeklinde düzenlidir.

Mapping

Verileri indexlerken bu verilerin hangi tipte olduğunu göstermemiz gerekir. Yani bir kelimeyi indexlerken o kelimenin hangi veri tipinde(string, integer, boolean) olduğu bilgisinin tanımlandığı işlemdir.

Mapping Örneği

RestfullAPI

REST, istemci-sunucu iletişimi ile ilgili bir mimari. Restfull servisler, istemci-sunucu arasında bir çok farklı tipte yanıt(response) dönebilirler (JSON, XML, CSV, HTTP). RestfullAPI ise bu servisleri kullanan bir API.

Near Realtime (Yakın gerçerk zamanlı)

Elasticsearch gerçek zamana yakın bir hızla çalışır. Gerçek zamanlı yerine “yakın gerçek zamanlı” denmesindeki sebep, bir dökümanı, gerçek zamandan çok az farklı bir gecikme süresi ile indexlemesi. (Bu süre genelde bir saniyelik bir gecikme oluyor.)

Cluster

Tüm verilerinizi bir arada tutan ve tüm indexleme ve arama yeteneklerinin yürütüldüğü birden çok Node’dan oluşan bir küme veya node koleksiyonu şeklinde adlandırılabilir.

Bir küme, varsayılan olarak “elasticsearch” şeklinde benzersiz bir adla tanımlanır Bu isimlendirme isteğe bağlı olarak değiştirilebilir. İsimlendirmeler önemlidir çünkü bir node yalnızca bir cluster’ın parçası olabilir. Node, cluster adıyla kümeye katılmak için ayarlanmışsa bu isim tanımlamalarının doğruluğuna ihtiyaç olacaktır.

Node

Tek bir server’a verilen isimdir. Verilerin depolandığı makinelerin her biridir. Cluster’ların indexleme ve arama yetenekleri bu node’lar sayesinde gerçekleşir. Cluster’lardaki isimlendirme mantığındaki gibi node’lara da başlangıçta benzersiz bir id atanır (Universally Unique IDentifier (UUID)).

Bu isimlendirmeler, nodelar arasındaki bilgi alışverişinin yönetimi için oldukça önemlidir. Eğer istenirse bu isimler de değiştirilebilir.
Varsayılan olarak her node “elasticsearch” şeklinde isimlendirilen bir cluster’da çalışmak üzere ayarlanmıştır. Hangi node’un hangi cluster’a gitmesini isterseniz, o cluster ismine yönlendirmelisiniz.

Shard

Bir seferde milyonlarca dökümanı indexlemek için yeterli donanıma/server kapasitesine sahip olunmayabilir. Bir seferde 2TB lık veriyi indexlemek zorunda kaldığınızı varsayalım, bu durumda bu indexlemeyi tek bir node ile yapamak istediğinizde, disk kapasitesinin dolması veya aşırı yavaş bir indexleme hızı ile karşı karşıya kalabilirsiniz. Bunun önüne geçmek için Shard ve Replika kavramları bulunmakta.

Yapılacak olan bir index, bir node da yeniden shard’lara bölünür. Bu shardları arzunuza göre ayarlayabilmektesiniz.

Shard’lı mimarinin kullanılmasındaki temel iki amaç;

  • Birden fazla node üzerinde işlemleri dağıtmanızı ve paralelleştirmeyi sağlar. Böylece performans artar.
  • İçerik hacmini yatay olarak bölme ve ölçeklendirmeye olanak tanır.

Replica

Shard’ın devre dışı kalması ihtimaline karşı index shard’larının bir veya birden çok kopyasının oluşturulabilmesini sağlayan replica-shard yapısı bulunur.
Bir shard’a ait replica, aynı node’da barındırılmamalıdır. Bir node çöktüğünde o node’daki shard(lar)’ınyedeklerinin diğer nodelarda bulunması veri kaybını önlemek için şarttır.

 

Shard ve Replica’ların farklı nodelara bölünmesinin örnek şeması

Elasticsearch’de Replica ve Shard’ların baştan belirlenmesi zorunluluğu yok. Ancak isteğe bağlı ayarlayabilirsiniz.

Elasticsearch Kurulumuna bir bakalım;

Elasticsearch’ü kurmanız için önce Java kurulumunu gerçekleştirmelisiniz. Çünkü Elasticsearch Java programlama tabanlıdır. Bu yüzden Java 7 veya üstü herhangi bir versiyon kurabilirsiniz. Bilgisayarınızda Java’nın olup olmadığını incelemek için versiyon bilgisi komutunu yazabilirsiniz.  

$ java -version

Eğer Java kurulu ise, size kurulu olan versiyon bilgisini görüntülenecektir.

java version "1.7.0_71" 
Java(TM) SE Runtime Environment (build 1.7.0_71-b13) 
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode) 

Eğer Java yüklü değilse aşağıdaki adımları izleyerek kurmanız gerekiyor.

Adım 1

Öncelikle bu siteye girin, ve sizin işletim sisteminize uygun olan ve uzantısı tar.gz olan dosyayı indirin

http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

Adım 2

İndirdiğiniz bu dosyayı genelde indirilenler klasörünüzde bulacaksınız. tar.gz şeklindeki zipli bu dosyayı aşağıdaki komutlar ile ziptek çıkartalım.

$ cd Downloads/ 
$ ls 
jdk-7u71-linux-x64.gz 
$ tar zxf jdk-7u71-linux-x64.gz 
$ ls 
jdk1.7.0_71   jdk-7u71-linux-x64.gz 

Adım 3
Java’yı rahat kullanabilmek için “/usr/local”konumuna taşıyalım. Bunun için kök dizini açıp aşağıdaki komutları yazmalıyız.

$ su 
password: 
# mv jdk1.7.0_71 /usr/local/ 
# exit 

Adım 4
Şimdi de ~/.bashrc dosyasını açıp JAVA_HOME isimli değişkeni oluşturarak java’nın kurulu olduğu PATH‘i içerisine yazağız. Bu sayede Java’ya erişimimiz kolaylaşmış olacak.
~/.bashrc dosyasını açmak için vim ya da nano gibi metin düzenleyicileri kullanabilirsiniz kullanabilirsiniz. (Eğer bunlar yüklü değilse veya kullanmayı bilmiyorsanız not defteri’nde de düzenleyebilirsiniz)
Ben vim kullanarak açıyorum.

$ vim ~/.bashrc

Açılan doyaya şu komutları kopyalayıp yapıştırıyoruz:

export JAVA_HOME=/usr/local/jdk1.7.0_71 
export PATH=$PATH:$JAVA_HOME/bin 

Sonrasında ESC basıyoruz ve :wq yazıyoruz. Vim’den çıkmış olduk.

Şimdi tüm değişiklikleri geçerli çalışan sisteme uygulamak için aşağıdaki komutu yazın.

$ source ~/.bashrc

Şimdi java -version komutunu tekrar deneyin. Şuan yukarıda yazdığım gibi bir çıktı görüntülemiş olmanız gerekiyor.

Şimdi Elasticsearch kurulumuna geçebiliriz;

Bu aşamada, Mac OS X işletim sistemi için bir kurulum videosu çektim. Videoda kullandığım kaynak kodlarının olduğu dosyaya  bu linkten erişebilirsiniz.

Diğer işletim sistemlerine ait kurulum adımları için Elasticsearch resmi sitesinden bu linke tıklayarak faydalanabilirsiniz.

Küçük bir örnek ile pekiştirmeye ne dersiniz?

İlk index dökümanımızı oluşturalım ve o dökümanda geçen bir kelimeyi daha sonrasında aratalım.
Bu mini örnek için CURL kullanacağız. Curl, veri iletimini  ve  veri  alımını sağlayan, Client URL’in kısaltması olan bir kütüphanedir.

Gelelim örneğimize;

Termal Ekranına aşağıdaki komutlar yardımı ile ilk index dökümanmızı oluşturalım;

curl -XPOST -H 'Content-Type: application/json’ ‘localhost:9200/first-index/message‘ -d '

{ “text”: “Hello kizgibikodla.com”}'

Şimdi Elasticsearch’e ‘hello’ kelimesini aratacağımız bir istek gönderelim;

curl -XPOST "https://localhost:9200/_search" -d'

 {
 "query": {
 "query_string": {
 "query": "hello"
                 } 
          }
  }'

Sonuç olarak aşağıdakine benzer bir çıktı alacaksınız.

{
"took": 12,
"timed_out": false,
"_shards": {
"total": 12,
"successful": 12,
"failed": 0
},
 "hits": {
     "total": 1,
     "max_score": 0.19178301,
     "hits": [{ "_index": "first-index",
                "_type": "message",
                "_id": "AUqiBnvdK4Rpq0ZV4-Wp",
                "_score": 0.19178301,
                "_source": {
                "text": "Hello kizgibikodla!"}
             }]
          }
}

Yukarıdaki çıktıda içinde hellonun geçtiği dökümana ait bilgiyi size döndürüyor. Eğer birden fazla içinde hello geçen dökümanınız olsaydı, onları da getirecekti. Burada dikkatinizi çeken bir başka şey de biz “Hello” kelimesinin ilk harfini büyük yazdık ama aratırken “hello” diye arattık. Ancak yine de buldu. İsterseniz Elasticsearch’ü harf büyük/küçüklük hassasiyetini ayarlayabiliyorsunuz. (Varsayılan değer olarak büyük/küçük harf önemsemiyor.)

İlk Elasticsearch örneğinizi böylece tamamladınız.

Elasticsearch ile daha fazla request (istek) denemesi yapmak isterseniz şöyle bir websitesi mevcut, bu siteden  istek yapıp sonuçları görüntüleyebilirisiniz.

Bir sonraki yazımda Elasticsearch’te yaptığımız herşeyi monitör edebildiğimiz bir araç olan Kibana’dan bahsedeceğim.

Umarım yazım size faydalı olmuştur.
İyi çalışmalar dilerim.

Apache Kafka Nedir? | Nerelerde Kullanılır?

Apache Kafka

Gün içinde her birimiz gerek çeşitli internet ortamlarında, gerekse sosyal medya platformlarında onlarca hatta yüzlerce veri üretiyoruz. Bu çember tüm dünyadaki internet kullanıcılarını kapsayacak biçimde genişledikçe verinin boyutu bir hayli büyüyor ve bu üretilen veriler anlık olarak büyümeye devam ediyor.

Her gün git gide büyüyen bu veriler, iki temel problem meydana getiriyor. Bunlardan ilki büyük miktardaki veriyi toplamak, diğeri ise analiz etmek.

Büyük veriyi kaynağından alıp analiz edilebilir hale getirmek için de her geçen gün çeşitli teknolojiler meydana çıkıyor. Geçtiğimiz günlerde veri aktarımı için kullanabileceğimiz bir teknolojiden ‘Apache Flume’dan bahsetmiştim. Bugün de size Apache Kafka’dan bahsedeceğim.
Apache Kafka, Linkedin bünyesinde geliştirilerek 2011 yılında Github’a konulmuş, Java ve Scala dilleri ile geliştirilmiş açık kaynak kodlu bir projedir. 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 bir mesajlaşma sistemidir.

Peki Mesajlaşma Sistemi (Messaging System) nedir?

Mesajlaşma Sistemi, verileri bir uygulamadan diğerine aktarmaktan sorumludur. Bu sayede uygulamalar verinin nasıl geldiği ile ilgilenmek yerine tüm konsantresini veriye ve yapması gereken işe verebilirler çünkü verilerin sisteme doğru gelip gelmediği ile mesajlaşma sistemleri ilgilenir. Dağıtık mimarili bir yapıda verinin kaynaktan hedefe aktarılmasında önemli olan ilk koşul verinin güvenilirliğidir. Veri kaynaktan hedefe aktarılırken her hangi bir bozulmaya uğramaması için mesaj kuyrukları (message queuing) kavramı kullanılır. Mesaj kuyrukları sayesinde aktarılacak veri bir sıraya alınır ve o sıraya göre aktarılırlar.

İki tür mesajlaşma kalıbı mevcuttur bunlar, Point to Point (Noktadan Noktaya) ve Publish-Subscribe (Yayın-Abone) ‘dır.

Kısaca bunların ne olduğundan bahsedecek olursak,

Point to Point: Mesajlar bir sıralanarak bir kuyruk oluşturur, kuyruktaki mesajlar sıra ile tüketici veya tüketiciler tarafından istenebilir. Ancak bir mesaj yalnızca bir tüketici tarafından tüketilebilir ve tüketildikten sonra kuyruktan silinir. (Bu durumu online satışta bir tane kalan Zara blazer ceket gibi düşünebilirsiniz 🙂 )
Bu durum kuyruktaki tüm mesajlar için geçerlidir.

Publish-Subscribe: Yayınlama-abone olma sisteminde, mesajlar bir konuyla kalıcıdır. Noktadan noktaya sistemin aksine, tüketiciler bir veya daha fazla konuya abone olabilir ve o konudaki tüm mesajları tüketebilir.
Yayınla-Abone olma sisteminde, mesaj üreticilerine yayıncılar, mesaj tüketicilere aboneler denir. Gerçek hayatta olan bir örnek, bir sınıf öğretmeni, okulun sistemine her gün öğrencilerin okumaları için yazılar paylaşıyor olsun. Öğrenciler de sisteme abone olmuş öğretmenlerinden gelen yazıları takip ediyor olsunlar. Bu durumda öğretmen publisher(yayıncı) ve öğrenci de subscriber(abone) olmaktadır. Bir yazıyı, sisteme abone olan her öğrenci okuyabilir. İşte bu gibi sistemlere de pub/sub tasarımlı mesajlaşma sistemleri denilmektedir.

Öyleyse Apache Kafka nedir ve hangi mesajlaşma sistemini kullanıyor?

Kafka büyük veriyi idare edebilen ve bir uç noktadan diğerine mesajlar iletmenizi sağlayan dağıtık sistemlere uygun çalışabilen ve Publish-Subscribe (Yayın-Abone) yöntemini kullanan bir mesajlaşma sistemidir.
Kafka çevrimdışı ve çevrimiçi mesaj tüketimine uygundur. Kafka iletileri diskte kalıcıdır ve veri kaybını önlemek için küme içinde çoğaltılmıştır.

Kafka’nın Yararları neler?

Dağıtık, bölünmüş, çoğaltılmış ve hata toleransı yüksek olan bir araç olduğu için oldukça güvenilirdir.
Kafka mesajlaşma sistemi, işten vazgeçmeden kolayca ölçeklenir.
Kafka, mesajları diskte tutar.
Oldukça hızlıdır sıfır kesinti ve sıfır veri kaybını garanti eder dolayısıyla dayanıklılık özelliği vardır.
Ve tabi en önemlisi performans etkisidir. Kafka, publish-subscribe mesaj sistemi ile yüksek verimlilik sağlar. Bir çok terabyte seviyesinde ileti depolansa dahi yüksek performansını korur.

Kafka’yı nerelerde kullanabiliriz?

  • Apache Kafka, genellikle operasyonel veriler için kullanılmakta. (Doğrudan rakiplere, bir şirketin emek istatistiklerine, tedarikçilere, muhasebe verilerine ve ihtiyaç duyulan kaynakların projeksiyonuna ilişkin bilgiler, operasyonel verilere dahil edilebilir.)
    Bu, operasyonel verilerin merkezi olarak gönderilmesini sağlamak için dağıtılmış uygulamalardan istatistiklerin toplanmasını içerir.
  • Diğer bir kullanım alanı ise, log toplama ile ilgilidir. Birden çok hizmetten log toplamak ve bunları birden çok kişi için standart bir biçimde kullanılabilir kılmak için kullanılabilir.
  • Kafkanın ayrıca Spark Streaming ile birlikte de kullanılabilir, Spark Streaminig, verileri okur, işler, işlenmiş verileri yeni bir konuyla kullanıcıların ve uygulamaların kullanımına açar.
    Stream Processing (Akış işleme) bağlamında Kafka’nın dayanıklılığı büyük avantaj sağlar.

    Kafka’nın Çalışma prensibi nasıl?

Kafka’nın çalışma prensibini ilk etapta yüzeysel bir biçimde ifade etmek için aşağıdaki diyagramdan faydalanılabilir.

Apache Kafka çalışma prensibi diyagramı I

Bu diyagramda görüldüğü gibi üreticiler tarafından alınan veriler Kafka Cluster’ile  tüketicilere sunuluyor. Ancak buradaki Kafka cluster aslında tek bir makine değil, buradaki Cluster aslında bir server grubu ve her bir server’a broker ismi veriliyor.

Bu diyagramın ayrıntılarına geçmeden önce Topics, Partition, Partition Offset, Replicas of Partition, Brokers, Kafka Cluster, Producers, Consumers, Leader, Follower gibi temel kavramların anlamlarını bilmekte fayda var.

Topics(Konular/Başlıklar),

  • Belirli bir kategoriye ait olan bir ileti dizisine bir Topic denir. Veriler topic’lere depolanır.
  • Her topic’e bir isim atanabilir.
  • Topicler partition’lara ayrılmıştır. Bu partitionların kaç tane olacağına kullanıcı kendisi karar verebilir ya da default değerleri kullanabilir.
  • Bu tür topiclerin her biri değiştirilemez sıralı bir sıradadır.
  • Bir partition, eşit büyüklükte segment dosyaları olarak uygulanır.

Partition(Bölüm), Topic’ler çok sayıda partition’lardan oluşabilir. Bu nedenle keyfi bir miktarda veri işleyebilir.

Partition Offset(Bölüm Ofset), her bölünmüş mesaj, ofset olarak adlandırılan benzersiz bir sıra id’si taşır.

Replicas of Partition(Bölüm kopyaları), Replikalar, partition yedekleridir. Replikalardan asla veri okunup veri yazılmaz okunup veri yazmaz. Veri kaybını önlemek için kullanılırlar.

Brokers(Aracılar),

  • yayınlanan verilerin korunması için basit bir sistemdir. Her broker, topic başına sıfır ya da daha fazla partition’a sahip olabilir. Bir topic içinde N partition ve N sayıda broker varsa her broker bir partition’ı içerir.
  • Bir topic’in N partition’ı olduğunu ve bu topicte de N’den fazla broker olduğunu varsayalım(N+M).
    Bu durumda ilk N broker, N partition’ı sahiplenecektir. Geriye kalan M broker ise o topic için herhangi bir partition’a sahip olamayacaktır.
  • Bir topic’te N partition varsa ve N’den daha az broker varsa(N-M), her bir broker’ın arasında bir veya birden fazla partition paylaşımı olacaktır. Bu da eşit olmayan iş yükü sebebiyle sorun yaratır ve bu yüzden bu yöntem önerilmez.

Kafka Cluster, Kafka’nın birden fazla broker sahibi olması Kafka kümesi olarak anılır. Bir Kafka kümesi kesinti olmaksızın genişletilebilir. Bu kümeler, mesaj verisinin kalıcılığını ve replikasyonunu yönetmek için kullanılır.

Producers(Üreticiler), Producerlar, bir veya daha fazla Kafka topiclerinin üreticisidir. Üreticiler Kafka brokerlarına veri gönderirler. Bir producer broker’a bir mesaj yayınladığında her zaman broker mesajı son segment dosyasına ekler. Aslında mesaj bir bölüme eklenir. Üretici, seçtiği herhangi bir partition’a da mesaj gönderebilir.

Consumers(Tüketiciler), Consumerlar brokerlardan veri okuyan tüketicilerdir. Tüketiciler bir veya daha fazla konuya subscribe(abone) olabilirler ve brokerlardan veri çekerek yayınlanmış mesajları tüketirler.

Leader(Lider), verilen partitiondaki tüm okuma ve yazma işlemlerinin sorumlusu olan düğümdür. Her partiton’ın lider olan bir sunucusu vardır.

Follower(Takipçi), Lider talimatlarını takip eden bir düğüm takipçisidir. Lider başarısız olursa, takipçilerden biri otomatik olarak yeni lider olur. Bir takipçi, normal tüketici görevini görür, iletileri alır ve veri havuzunu yeniler.


Yukarıdaki bilgiler ışığında aşağıdaki diyagramı inceleyecek olursak,

Apache Kafka çalışma prensibi diyagramı II

  1.  Bir veya birden fazla producer, mesajı partitionlara iletiyor. -Mesajın belirli bir partition’a gitmesini istiyorsak bunu belirleyebiliriz veya Kafka’nın belirlediği default partition’lara iletimleri sağlanır. –
  2.  Bu partitionların her biri bir topic’te tutulur. -Bu topiclere yeni bir isim verilebilir ve istenildiği kadar topic oluşturulabilir. –
  3.  Her partition bir broker’a gidiyor, bir Kafka Cluster’ın içinde birden fazla broker bulunabiliyor.

    Apache Kafka çalışma prensibi diyagramı III

  4.  Bu brokerların her birinin içinde server’lar bulunmakta. Kafka ekosisteminde, her broker için bu serverlar arasından bir lider, server olarak seçiliyor.
  5. Diğer serverlar ise follower olarak adlandırılıyor ve lider serverda bir problem olduğunda bir follower kendini lider olarak atayabilecek şekilde tasarlanmış.
  6. Her bir server kendi içinde gelen mesajın replikasını tutuyor. Böylelikle, her hangi bir olumsuz durumda mesaj kuyruğundaki herhangi bir verinin kaybolmasının önüne geçilebiliyor. (İsterseniz replikasyon işlemini de ayarlayarak iptal edebilirsiniz, bu sizin verinizin önemli olup olmadığına bakar. Eğer replikasyon işlemini iptal ederseniz bir nebze daha hızlı çalışması söz konusudur.)
  7. Daha sonra consumer’lardan oluşan Consumer gruplar,  mesajları güvenli bir biçimde okuyabiliyor. Bir mesajı okumak için birden fazla Consumer grup istek yapabilir ancak her consumer grubu içindeki consumerlar aynı anda aynı mesajı okuyamazlar.
  8.  Hangi consumer’ın hangi ofsetteki mesajı okuduğu vs. bilgisi Zookeper’da tutuluyor.
  9. Zookeper, Kafka brokerlarını yönetmek üzere kullanılan bir servistir. Kafka hangi mesajın hangi partition’da hangi ofsette olduğu bilgisini hangi consumer’ın hangi partition’a gitmesi gerektiği vs. bilgilerine erişmek için Zookeper’ı kullanıyor.

Tüm bu işlemler oldukça hızlı oluyor. Apache Kafka, büyük boyutlu verileri güvenli ve ölçeklenebilir  şekilde aktarmak isteyen kullanıcılar için gerçekten biçilmiş kaftan denilebilir.

Apache Kafka ile ilgili yazım umarım faydalı olmuştur. Bir sonraki blog yazımda Spark Streaming, Kafka ve Flume arasındaki farkları anlatacağım bir yazı paylaşacağım.

Düşüncelerinizi yorum veya mail yoluyla belirtirseniz çok sevinirim.
İyi çalışmalar dilerim.

Apache Flume Nedir? Çalışma Prensibi Nasıldır?

APACHE FLUME NEDİR?

Daha önce HDFS(Hadoop Distributed File System) kavramından bahsetmiştim. HDFS, büyük verilerin kaydedildiği dosya sistemidir.

Şimdi bu dağıtık dosya sistemine, bir websitesinden büyük ölçekli verileri çekip kaydetmek istiyorsunuz. Peki bu verileri çekip, dosya sistemine kaydetme işlemini nasıl gerçekleştireceksiniz?

Apache Flume, işte tam da burada devreye gidiyor.

Flume yardımı ile web sunucularından alınan accesslog’lar, HDFS’e kaydedilir.

Büyük miktarda günlük verileri verimli bir şekilde toplamak, bir araya getirmek ve taşımak için yazılmış, güvenilir ve kullanılabilir bir Apache tool’dur(araç). Yani bir ‘veri aktarma sistemi’dir.

Flume dışında farklı yöntemler kullanarakta veri çekip dosya sistemine aktarabilirsiniz ancak bu çok kullanılan bir yöntem değildir. Onun yerine, Flume aracı gibi Hadoop tarafından da desteklenen Splunk, SumoLogic gibi araçları tercih etmek akıllıca olacaktır.

Apache Flume, 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.

Flume Çalışma Prensibi

Source(Kaynak) :

Harici kaynaktan alınan accesslog’ların ilk karşılandığı bölümdür.
Bir Source, belirli bir biçime sahip Event(Olay/Veri seti)’ları, web sunucusu gibi harici bir kaynaktan tüketir/alır ve bu eventlar, Channel(Kanal)’a teslim edilir.

Channel(Kanal) :

Accesslog’ların depolandığı alan. Bir Source, bir event aldığında, bir veya daha fazla Channel içine depolar. Channel’dan alınan event, bir Sink(Hedef) tarafından tüketilene kadar Channel’da depolanır.

Sink(Hedef) :

Accesslog’ların yazılacağı yer. Bir Sink, bir eventı Channel’dan kaldırmak ve HDFS gibi harici dosya sistemine koymaktan veya akışın bir sonraki eventa geçmesi için  Source’a yönlendirme yapmaktan sorumludur.

Agent(Temsilci) :

Eventların yani verisetlerinin kaynaktan-hedefe(Source’dan Sink’e) kadar akma işleminde geçtiği tüm işlemleri barındıran süreçtir. Java uygulaması ile çalışır.

 

Bu anlattıklarımı bir görselle pekiştirelim:

Burada da gördünüğünüz üzere Web Server, yani büyük veriyi elde edeceğiniz kaynak önce Source ile iletişime geçiyor. Source verisetinin bir bölümüne erişip başka bir deyişle consume(tüketim) edip bir Channel’a aktarılmasını sağlıyor.

Channel, Kaynaktan aldığı Event’ı, Sink, consume edenene kadar depo ediyor.

Sink’te Channel tarafından gelen Event’ı HDFS’e gönderiyor. Ve akış bu şekilde devam ediyor.

Bu sayede veri kaynağından, verilerini verimli bir şekilde toplama, taşımak ve kullanılabilir hale getirmek için güvenli bir hizmet sağlıyor.

1 Source, 1 Channel ve 1 Sink ile ayarlanan bir Agent, logları tek bir noktadan alıp, tek bir yere yazacak biçimde çalışıyor. Birden fazla Channel/Sink ve/veya birden fazla Agent çalıştırarak karmaşık modeller kurmakta mümkün.

Apache Flume mantığı bu kadardı. Bir sonraki yazımda nasıl kurulduğunu ve konfigürasyon ayarlarının nasıl yapıldığını bir örnek ile açıklayacağım.

İyi çalışmalar.