NoSQL Maceraları - Apache Cassandra ve .Net

cassandraMerhaba Arkadaşlar,

Size bu günkü makale konumuzun yanda fotoğrafı görülen model(youtube modeli de diyebiliriz) Cassandra Bankson ile alakalı olduğunu söylemek isterdim ama yakınlarından bile geçmeyeceğiz. (Zaten araştırırsanız aslında makyaj bidonu ile bu hale geldiğini keşfedeceksiniz) Başlıktan da anlayacağınız üzere bu günkü yazımızın konusu .Net plaftormunda Apache Cassandra’ yı kullanmak.

Uzun zamandır gündemimde olan konulardan birisi de NoSQL veritabanı sistemleri. Internet şirketlerinin pek çoğu(Facebook, Twitter, Youtube, Netflix vb)  NotOnly SQL veritabanlarını kullanmakta ve hatta bir kısmının kendi geliştirdikleri NoSQL sistemleri bile var. Amazon, Google bu noktada öncüler diyebiliriz.

NoSQL veritabanlarının popüler olmalarının elbette bazı sebepleri var. Özellikle RDMS' lerin tipik özelliklerine ters gelen kabiliyetleri nedeni ile büyük veriler ile çalışılmasında, ölçeklemelerde, performans da öne çıkabilmektedirler. Tabi bu avantajlar, NoSQL yapısına uygun veri kümeleri için söz konusudur. Her veri yapısı veya modeli için NoSQL sistemleri uygun olmayabilir. (Yani RDMS' i terk eden bir dünyadan bahsedemeyiz Smile)

Ancak NoSQL sistemler çeşitlilikleri açısından da RDMS’ lere göre farklılaşmakta ve bu yüzden daha fazla tercih edilir olmaktadır. Bu çeşitler kısaca şunlardır;

  • Wide Column Store / Column Families (Cassandra bu kategoride gösterilmiştir)
  • Document Store
  • Key Value / Tuple Store
  • Graph Databases
  • Multimodel Databases
  • Object Databases
  • Grid & Cloud Databases
  • XML Databases
  • Multidimensional Databases
  • Multivalue Database

Aslında ortalıkta pek çok NoSQL sistemi var. Hatta çoooook uzun zaman önce Berkley üniversitesi tarafından üretilen Berkley_DB bu işin atasıdır diyebiliriz. Günümüzde ise MongoDb, Neo4j, db4o, bigtable, hadoop, Redis, MemcachedDB vb ürünler bulunmakta. (Tam ve güncel bir listeye bu adresten ulaşabilirsiniz) NoSQL sistemlerinin popüler olanlarından biriside ismini Yunan Mitolojisinden aldığını düşündüğüm Apache' nin Cassandra isimli ürünüdür. Bu yazımızda Cassandra’ yı .Net platformunda nasıl kullanabileceğimizi incelemeye çalışıyor olacağız.

Apache Cassandra' yı http://cassandra.apache.org/download/ adresinden indirebilirsiniz. Cassandra yı indirdiğinizde büyük ihtimalle tar.gz uzantılı bir dosya gelecektir. Dolayısıyla Windows tabanlı bir sistemde bunu açacak uygulamaya ihtiyacınız var. 7Zip bu konuda bana yardımcı oldu diyebilirim.

Cassandra' yı bir klasöre açtıktan sonra sisteme bazı çevresel değişkenlerin de ilave edilmesi gerekmektedir(Environment Variables). Bunlardan birisi JAVA_HOME dur ve sistem de kurulmuş olan Java klasörünü göstermektedir. Diğeri ise CASSANDRA_HOME olarak adlandırılmaktadır ve Cassandra' nın açıldığı klasörü işaret etmektedir. Kendi sistemimde bu değerleri şu şekilde ayarladım.

uc_1

uc_2

Kurulum işlemi için gerekli ayarları yaptıktan sonra bin klasörü altında yer alan cassandra.bat dosyasını çalıştırabiliriz. Bu batch dosyası sunucuyu etkinleştirecektir. Cassandra verilerin loglarını tutmak için root klasördeki var isimli alt klasörü kullanır (Bu kuruluma göre d:\var altındadır ama istendiği takdirde conf klasörü içindeki cassandra.yaml' den konum değiştirilebilir)

Genel Özellikler

Cassandra' nın genel özelliklerine baktığımızda aşağıdakileri ifade edebiliriz.

  • Java ile geliştirilmiş bir veritabanı sistemidir ve bu nedenle kurulduğu makinede Java ortamının var olması gerekmektedir.
  • Bir NoSQL(Not Only SQL) sistemidir. Dolayısıyla SQL, Oracle gibi ilişkisel bir veritabanı modeli değildir.
  • Açık kaynaktır(Open Source)
  • Bir Oracle veya SQL Server olmasa da Youtube, Netflix gibi pek çok dünya markası tarafından çeşitli ürünlerde kullanılmaktadır.
  • Kolayca ölçeklenebilir(Scalable)
  • Hata tolerans yönetimi mevcuttur.
  • Sütun odaklı(Wide Column Store/Column Families) çalışan bir NoSQL tipidir.
  • Distribution tasarım modeli Amazon' un Dynamo ürünü esaslıdır.
  • Dağıtık modele destek verdiğinden veriyi n sayıda makine üzerinde genişletmek mümkündür. Bu anlamda RDMS(Relational Database Managament Systems) lerin tam aksine Ring düzenine göre çalışır. Bir başka deyişle dikey(Vertical) değil yatay(Horizontal) olarak ölçeklenir.
  • Terabyte' larca veriyi tutabilir Winking smile

Veri modeline üstten bakıldığında yapısı RDMS şemalarına benzetilebilir. Sütunlar ve isimlendirilmiş değerler(Named Values) söz konusudur. Ancak pratikte hiç de böyle değildir. Cassandra bir şema yapısı kullanmamaktadır. Ya bizim aşina olduğumuz tipte bir şema kullanmamaktadır diyebiliriz. Veriyi sütunlar topluluğu halinde tutar. Aslında bu konuda çok fazla detaya girmeyeceğiz.

İlk Çalışma

Cassandra' yı kurup çalıştırdıktan sonra(cassandra.bat ile yapıyoruz) komut satırından hemen veri girişi işlemleri yaptırılabilir. Bunun için yine bin dizinindeki cassandra_cli.bat dosyasının çalıştırılması yeterlidir. Bu bir komut satırı istemcisidir ve cassandra sunucusuna bağlanacaktır. Aşağıdaki ekran görüntüsünde örnek bir kullanıma yer verilmiştir.

uc_3

Buradaki komutlardan da anlaşılacağı üzere veritabanı aslında bir keyspace' dir. Bu keyspace içerisinde bir tablo oluşturmak aslında bir Column Family yaratmak anlamına gelmektedir. Column Family içerisine set edilen Row Key’ ler aslında bildiğimiz tablo satırlarına benzetilebilir. Row Key’ ler içerisinde ise key-value şeklinde kolonlar ve verileri bulunmaktadır. Her key-value column aslında bir Row Key ile ilintilidir.

Dikkat edileceği gibi kolonlarda key-value şeklinde bir tutuluş söz konusudur. Ortam tamamen case sensitive' dir ve ifadelerin çalışması için ; ile bitirilmesi gerekmektedir. Örnekte kullandığımız komutlar ise aşağıdaki gibidir.

İlk Komutlar

  • create keyspace ile BigFootMotorCompany isimli bir key space üretilmiştir.
  • create column family ile Car isimli bir Row Key üretilmiştir.
  • set ile Car içerisinde sütun(Column) ve key-value eklenmiştir.
  • get ile bir ModelX isimli column verisi çekilmiştir.

Yapılan bu üretim sonrasında klasör yapısıda aşağıdaki şekilde görüldüğü gibi oluşacaktır.

uc_4

Veri binary formatta tutulmaktadır.

Gelelim .Net Framework tarafına

.Net tarafında Cassandra ile çalışabilmek için NuGet paketlerinden birisi olan FluentCassandra ile çalışabiliriz. İlk olarak basit bir Console uygulaması açalım ve NuGet paket yöneticisini kullanarak internetten Fluent Cassandra paketini indirelim(Dilerseniz komut satırından da install edebilirsiniz. Install-Package FluentCassandra ifadesini çalıştırmanız yeterli olacaktır)

uc_5

İlk Kodlar

İşte ilk deneme kodlarımız.

using FluentCassandra; 
using FluentCassandra.Connections; 
using System;

namespace HowTo_HelloApacheCassandra 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            // Sunucu ile bağlant kuralım. Varsayılan olarak localhost ismiyle bağlanabiliriz. 
            Server cassandraServer = new Server("localhost");

            // Komut satırından ürettiğimiz BigFootMotorCompany isimli key space ile çalışacağız 
           using (var database = new CassandraContext(keyspace: "BiGFootMotorCompany", server: cassandraServer)) 
            { 
                // sunucuya ve veritabanına bağlanıp bağlanamadığımız test etmek için bir kaç bilgi talep edelim. 
                Console.WriteLine("Server port : {0}, database verison : {1}" 
                    ,cassandraServer.Port 
                    , database.DescribeVersion() 
                    );

                #region Yeni bir Column Family oluşturmak

                CassandraColumnFamily newFamily = database.GetColumnFamily("ModelDesigner");

                // Cassandra Query Language kullanarak bir Column Family oluşturuyor ve içerisine bir kaç column ilave ediyoruz 
                // Sonraki denemelerde bu satırda hata vermemesi için bir null kontrolü yapmak da işe yarayabilir 
                if(newFamily==null) 
                    database.ExecuteQuery(@" 
                    create columnfamily 
                    ModelDesigner( 
                        ModelDesignerId ascii Primary Key 
                        ,Title text 
                       ,Nickname text 
                        ,Level int 
                        ,Outsource boolean);" 
                    );

                // Yeni bir satır oluşturalım 
                // dynamic tipin çalışma zamanında çözümlenmesine neden olacaktır. 
                dynamic burkinyus=newFamily.CreateRecord("burkinyus"); 
                // Key' lerin değerlerini atayalım 
                burkinyus.Title = "Mr."; 
                burkinyus.Nickname = "burkinyus"; 
                burkinyus.Level = 100; 
                burkinyus.Outsource = false;

                // Yeni oluşturlan satırları Context' e ekleyelim 
                database.Attach(burkinyus);

                // bir satır daha oluşturalım ve alanlarını set edelim 
                dynamic oktavyus = newFamily.CreateRecord("oktavyus"); 
                oktavyus.Title = "Mr."; 
                oktavyus.Nickname = "oktavyus"; 
                oktavyus.Level = 400; 
                oktavyus.Outsource = true; 
                
                database.Attach(oktavyus);

                // Değişiklikleri kayıt edelim 
                database.SaveChanges();

                // şimdi de verileri çekip gösterelim 
                var designers = database.ExecuteQuery("select * from ModelDesigner");

                foreach (dynamic designer in designers) 
                { 
                    Console.WriteLine("{0} {1}({2}) {3}" 
                        ,designer.Title 
                        ,designer.Nickname 
                        ,designer.Level 
                        ,designer.Outsource==true?"Outsource":"_" 
                        ); 
                } 
                #endregion 
            }            
        } 
    } 
}

ve çalışma zamanı çıktısı.

uc_6

Uygulamanın başarılı bir şekilde çalışabilmesi için tahmin edeceğiniz üzere Cassandra sunucusunun da açık olması gerekir. Aksi durumda çalışma zamanında aşağıdakine benzer bir istisna(Exception) fırlatılacaktır.

uc_7

Bu ilk örnekte BiGFootCompany key space’ ine bağlanıp ModelDesigner isimli yeni bir Column Family oluşturmaktayız. Bu Column Family içerisinde de, Title, Nickname, Level ve Outsource gibi kolonlar bulunmakta. Örnek olarak iki adet satır oluşturulmakta ve veritabanına ilave edilerek bir sonuç listesinin ekrana bastırılması sağlanmaktadır. Dikkat edileceği üzere SQL ifadelerine çok benzeyen bazı sorgular da kullandık. Bunlar CQL(Cassandra Query Language) olarak adlandırılmaktadır. Ayrıca işlerimizi biraz daha kolaylaştırmak adına dynamic anahtar kelimesinden faydalanmaya çalıştık. Bu sayede Row Key’ lerin kolonlarına, birer özellikmiş gibi erişebilmemiz mümkün oldu. Böylece geldik bir makalemizin daha sonuna. Bir sonraki yazımızda görüşünceye dek hepinize mutlu günler dilerim Winking smile

HowTo_HelloApacheCassandra.zip (457,46 kb)

Yorumlar (9) -

  • abla başımıza baya işler açacak Smile
    elinize sağlık hocam
  • makale için geldim, kız için ayrıldım. Smile
  • Hocam ellerinize sağlık Smile valla girmediğiniz konu kalmıyor, bu konuda size çok özeniyorum Smile
    NoSQL benim de bir süredir sürekliği üzerinde okuduğum ve merak ettiğim bir alan. Eski facebook CTO'su Bret Taylor'un ayrıca bir makalesi vardı, normal RDMS'i NoSQL gibi kullanmak konusunda (FriendFeed veritabanı için), onu da öneririm (linki bulamadım). Sizden bu konuda daha çok makaleler bekliyoruz.
  • @Durul teşekkürler ;) Aslına bakarsan giremediğim, girmeye çekindiğim çooooooook konu var. Bazen hemen herkese Feedreader tarzı bir program ile feed' leri takip etmelerini öneriyorum. Ama inanın bazen çok sinir bozucu olabiliyor. Çünkü hergün bilmediğiniz, öğrenmediğiniz, öğrenmek için vaktinizin ve enerjinizin olamadığını gördüğünüz onlarca yazı çıkıyor internette :S

    @Oguz Artık taktiği buldum. Makalelerin yanına güzel bir hatun fotoğrafı ekledim mi tamamdır. Tıklanma değerleri bir anda nasıl artıyor inanamazsın hocam Smile
  • hocam NoSQL yazınız için çok teşekkür ederim. sizden ricam "Hadoop" ilgili bilgi paylaşabilirmisiniz?
    .Net ile Hadoop nasıl olacak? türkçe pek kaynak yok.
    şimdiden herşey için teşekkür ederim. Smile  
    • Değerli yorumunuz için çok teşekkür ediyorum. Eğer vakit olursa yazmak isterim tabi ama oldukça zor şu dönemde. İşler resmen Wrap etmiş durumda bizi Smile Yine de listeye aldım ;)
  • Hocam merhaba,

    Makale için çok teşekkürler, elinize sağlık.
    Tam olarak .NET Driver'ından mı yoksa Cassandra'dan mı anlamadım ama şöyle durumlar var
    1-)gelen verileri byte[] olarak getiriyor(HBase de ki gibi çevirdik diyelim)
    2-)çevirdikten sonra normal value formatında verileri tesr yazıyor. Yani "Mr." stringini ".rM" şeklinde yazıyor. Bununla ilgili bir bilginiz var mı?

Yorum ekle

Loading