Azure Stream Analytics

Stream Analytics Overview

   

Nedir ? 

   

Azure Stream Analytics real time olarak datalarınızı analiz etmenize olanak veren bir servis olarak açıklanabilir.

Sürekli olarak bir veri akışınız var ise ve bu verileri anlık olarak analiz etmek istiyorsanız bu servis işinizi görecektir.

   

Günümüzde hızla artan IoT sistemlerinde çok fazla işimizi kolaylaştırabilecek ve hızlı cevap veren kolay scale edilebilen bir yapıya sahiptir. Bildiğiniz gibi sensorlerden gelen verileri liste olarak görmek işimize genelde yaramayacaktır. Bu veriler uygun bicimde işlendikten sonra faydalı hale geliyor. Burada iki seçenek çıkıyor karşımıza, birincisi toplu verinin işlenmesi batch operationlar mesela machine learning, ikinicisi ise real time olarak sonuca ulaşmak örneğin Stream Analytics.

   

Örnek

   

Bir sağlık sistemi yapıyoruz ve hastaların üzerinde bulunan cihazlar sürekli olarak Azure'a data gönderiyor. Eğerki gelen kalp atış hızı 90ın üzerinde ise bir alert oluşsun istiyoruz. Bunun için veri Azure'a ulaştığında anlık olarak kontrol edilmeli ve sistem çalışmaya devam etmeli. Veya her hastanın son 100 verisini saklamak istiyoruz. Bu gibi senaryolarda kullanılması çok mantıklı ve çok hızlı olacaktır.

   

Özet olarak gelen veri kontrol ediliyor ve sonuç üretiliyor, bunlar real-time olarak gerçekleşiyor.

   

Nasıl Kullanılır?

   

Management Portal üzerinden yeni bir Stream Analytics Jobu yaratıyorsunuz. Sonra ise 3 önemli bölüm var Input, Query, Output.

   

Input: Veriyi nereden okuyacağını belirliyor. Burada Event Hub ve Blob Storage seçenekleri var. Okuncak verinin formatı json, csv veya avro olabilir. Örneğin Event Hub'I seçerseniz, sizden bilgileri isteyecek ve o event huba gelen mesajları okumaya başlayacak. Input'u yaratırken verdiğimiz isim bizim için önemli. Örneğin PatientInput isminde bir input oluşturduk.

   

Query: Inputtan gelen verinin nasıl query edileceğinin belirlendiği bölüm. Burada neredeyse SQL yazacağız diyebilirim. Syntax SQL'e çok benziyor neredeyse aynı. 

Örneğin

SELECT * FROM PatientInput where Heartrate>80

Yukarıdaki gibi bir sql komutu ile gelen veri içinden filtreleme yapabilirsiniz. Buradan üretilecek sonuç, yani yazdığınız sorgudan çıkan sonuç bir output'a atılıyor.

   

Output: Bir output yaratmamız gerekiyor ve üst tab'lardan output'a giderek yeni bir output oluşturuyoruz. Burada oldukça çok seçenek mevcut. Sonucları Blob Storage, Table Storage, SQL Database, Event Hub'a atmanız mümkün gerekli ayarlamaları kolaylıkla yapabilirsiniz. Output içinde Json, Csv, Avro kullanmanız mümkün.

Job'u çalıştırın ve dataları okumaya başlasın.

   

Scale

Doğası gereği çok rahat scale edibilen bir sistem. Scale tabından ayarlamaları yapmanız mümkün. Streaming Unit üzerinden scale ediliyor bu sistem. Her streaming unit kabaca 1mb/saniye gibi bir hıza karşılık geliyor. Streaming Unitleri arttırarak sisteminizin daha hızlı cevap vermesini sağlamanız mümkün. Ücretlendirmede streaming unit ve işlenen dataya göre yapılmakta ancak pahalı bir sistem olmadığını düşünüyorum.

   

Unutmadan, Azure Stream Analytics şuanda preview bir servis olmasına rağmen oldukça stabil çalıştığını söyleyebilirim.

   

Azure Cloud Service

Azure Cloud Service'i bir container olarak düşünebiliriz. CloudService projesine bağlı iki farklı tipte proje olabilir bunlar Worker Role ve Web Role'dür. Ayrıca ServiceConfiguration.Cloud.cscfg, ServiceConfiguration.Local.cscfg, ServiceDefinition.csdef gibi config dosyaları barındırır. Her Web Role ve Worker Role için en az bir VM yaratılır ve birbirlerinden bağımsız olarak scale edilebilirler. Ayrıca connection string gibi bilgiler projelerin App Config veya Web Config dosyalarında değil ServiceConfiguration dosyalarında bulunur. Böylece tüm worker role ve web role instance'ları aynı configuration dosyalarını okuyabilirler.

Kısaca Worker Role ve Web Role ne demek bakalım.

   

Worker Role

Worker Role, sürekli olarak çalışan bir programdır. Azure üzerinde bir sanal makineye deploy edeilir ve kendi kendine çalışır eğer bir sebepten dolayı (exception vb.) program kapanırsa otomatik olarak yeniden başlatılır.

İçerisinde bir kaç default method barındırır. OnStart(), Run(), OnStop(). Her worker role class'i RoleEntyPoint class'inden inherit ettiği için bu methodları ovveride olarak barındırır. Bu methodlar nedir kısaca bakmak gerekirse; OnStart(), worker role ilk çalıştığında çalışır ve genelde connection'lari başlatmak gibi işlemler için kullanılır. OnStart() methodundan sonra Run() methodu çağırlır ve asıl iş burada döner, her hangi bir sebebten ötürü program kapanacak olursa OnStop() methodu çağırılır ve bu method içerisinde açılan connectionların kapatılması gibi işlemler yapılır. Bu methodlar Azure tarafından otomatik olarak çağırılmaktadır. Asıl bizim için önem taşıyan method Run() methodudur. Bu methodun hiç sonlanmayacağını düşünmeliyiz. Çünkü eğer bu method tamamlanırsa ardından OnStop() çağırılır ve program kapanır. Ardından otomatik olarak Azure tarafından tekrar program başlatılır. Bu sebebten dolayı Run methodu hiç bitmeyecek şekilde tasarlanmalıdır. Örneğin while(true) gibi bir sonsuz döngü barındırmalıdır veya ManualResetEvent.WaitOne() gibi bir method ile bekletilmelidir.

Visual studio içerisinde bir kaç farklı tipte Worker Role proje template'i olsada aslında olay hep yukarıda anlattığım kadardır.

   

Worker Role nasıl bir senaryoda işimize yarar?

Örneğin bir Queue var ve client uygulamalarımız sürekli olarak bu queue'ya mesaj gönderiyor. Bir programın bu queue'dan gelen mesajı okuyup işlemesi gerekir ve devamında bir takım işlemleri yapması gerekir. Bu durumda WorkerRole sürekli çalışan bir program yapısında olduğundan sürekli olarak Queue'yu dinlemesi mümkündür ve queue'ya herhangi bir mesaj geldiğinde gelen mesajı işleyip ardından bir sonraki mesajı alabilir. Queue hakkında detaylı bilgiyi buradan ulaşabilirsiniz.

   

Web Role

Web Role aslında bir Asp.Net projesinden fazlası değildir. Normal bir Asp.Net projesinden fazla olarak içerisinde WebRole.cs adında bir class barındırır. Bu class aynı Worker Rolede olduğu gibi RoleEntityPoint'ten inherit edilmiştir. Böylece OnStart() gibi methodlar ile durumları handle etmeniz mümkün.

   

Configuration Dosyaları

   

Cloud service projesi içerisinde 3 tane configuration dosyası bulunur. Bunlar ServiceConfiguration.Cloud.cscfg, ServiceConfiguration.Local.cscfg ve ServiceDefination.csdef. Aslına bakılırsa ServiceDefinition.csdef bir configuration dosyası değildir bir tanımlama dosyasıdır.

Cloud Service

   

ServiceDefinition.csdef dosyasında tüm WebRole ve WorkerRole'lerimiz için ayarlar bulunur.

ServiceDefinition.csdef

Yukarıda gördünüz gibi bir WebRole tagi'i ve birde WorkerRole tagi'i bulunuyor.

Worker Role tag'ine baktı��ımızda name ve vmsize isimli iki property görüyoruz. VMSIZE property'si şuanda Small olarak set edilmiş durumda, azure ClouldSample.CloudService.WorkerRole'u host etmek yaratacağı VM(leri) Small size'da yaratacaktır. Siz buradan bunu değiştirebilirsiniz. Aynı ayar WebRole içinde mevcut, ancak web role için daha çok ayar görüyoruz, port ve protocol gibi bunları buradan değiştirebilirsiniz. Ayrıca eğerki webconfig dosyasında olduğu gibi istediğiniz başka bir ayarı eklemek isterseniz, öncelikle key değerimizi bu dosyaya yazmamız gerekiyor. Örneğin ben WorkerRole için Key1 isimli bir setting tanımladım ancak değerinin ne olduğu bu dosyada belirtilmiyor.

   

Gelelim cscfg dosyalarına

Cloud.cscfg

Bu dosyalardan iki tane mevcut bir tanesi Cloud.cscfg diğer ise Local.cscfg. Ancak dosyaların şemaları aynı. Bunu web configteki debug config ve release config dosyası olarak düşünebilirsiniz. Localde emulator üzerinde çalıştırırsanız Local.cscfg dosyası yükleniyor cloud üzeirnde çalışırsa Cloud.cscfg dosyası yükleniyor. Bunları değiştirmeniz mümkün.

Dosyanın içeriğine baktığımızda yine her role için bir tag olduğunu görüyoruz ve önemli olarak Instances tagi bulunmakta. Bu tagin count property'si ile kaç insantance yaratılacağını belirliyoruz. Böylece ServiceDefination.csdef dosyasında bulunan sizede ve bu dosyada bulunan sayıda intance yaratılır. Bu ayarı buradan değiştirebilir. Ayrıca ServiceDefiniation.csdef dosyasında bulunan setting değerleri bu dosyaların ikisindede mecburen olmalı. Gördüğünüz gibi ben Key1 için Value1 olarak bir değer bildirdim.

   

Bu dosyaları xml olarak düzenlemek istemezseniz. CloudService altında bulnan Roles içerisnde role'ün üzerine çift tıklayarak bir editor açabilirsiniz ve buradan Instance size veya settings veya endpoint gibi bir çok ayarı yönetebilirsiniz.

   

Cloud Service nasıl oluşturulur?

Visual Studio üzerinden Create New Project'e tıklayacak açılan pencerede Templates-> Cloud ve Azure Cloud Service'i seçiyoruz.

Create Cloud Service

   

Karşınıza aşağıdaki ekran gelecektir. Ve bu pencerede service'imize Role ekliyoruz.Ben aşağıdaki örnekte Bir Worker Role birde Web Role ekledim.

   

Role Ekleme

Tabiki daha sonra yeni role ekleme imkanımızda olacaktır. Daha sonra karşınıza Web Role için seçeneklerin olduğu bir pencere çıkacaktır. Buradan Web Forms, MVC, Web Api gibi template'lerden birini seçerek devam ediyoruz. Ben bu örnekte MVC seçiyorum ve Authenction olarak No Authentication diyorum böylece herhangi bir authentication mekanızmaması olmayacak.

   

Worker Role & Web Role & Queue kullanan bir örneği yakında yayınlayacağım.