DevVeri.com

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

Apache Cassandra Kurulumu

 Bu yazıda Apache Cassandra kurulumundan ve temel bazı araçların kullanımından bahsedeceğiz.

Öncelikle Cassandra’yı indirmekle başlayalım, resmi sitesinden en son sürümü indirebilirsiniz. Şu anda en güncel sürüm 1.1.1 olarak görünüyor. Ben bu tip uygulamaları /usr/java ya da /opt dizini altına kurmayı tercih ediyorum. Bu yazıda /usr/java dizinine kuracak şekilde anlatacağım.

İndirdiğim apache-cassandra-1.1.1-bin.tar.gz dosyasını /usr/java dizini altına açtıktan sonra erişimi ve ileride sürüm güncelleme işlemlerini kolaylaştırmak amacıyla sembolik link olarak da oluşturuyorum. Ayrıca veri ve log dizinlerini oluşturuyorum.

cd /usr/java
wget "http://godel.cs.bilgi.edu.tr/apache/cassandra/1.1.1/apache-cassandra-1.1.1-bin.tar.gz"
gzip -dc apache-cassandra-1.1.1-bin.tar.gz | tar xf -
ln -s /usr/java/apache-cassandra-1.1.1 cassandra
mkdir cassandra/data
mkdir cassandra/logs

 

Cassandra’yı çalıştırmadan önce verileri ve logları saklayacağı klasörleri ayarlamamız gerekiyor. Cassandra’nın ayarları conf dizini altındaki cassandra.yaml dosyasından yapılıyor. Ben ilgili değerleri örnek olarak şöyle oluşturuyorum:

# disk üzerinde verilerin saklanacağı klasör
data_file_directories:
    - /usr/java/cassandra/data/data

# commit log dosyası
commitlog_directory: /usr/java/cassandra/data/commitlog

# kayıtlı önbellek
saved_caches_directory: /usr/java/cassandra/data/saved_caches

Son olarak log4j-server.properties dosyasından logların kaydedileceği dizini değiştirmemiz gerekiyor:

# log dosyası
log4j.appender.R.File=/usr/java/cassandra/logs/system.log

 

Ayarları yaptıktan sonra Cassandra’yı başlatmak için bin/cassandra -f komutunu kullanıyoruz.

$ bin/cassandra -f
 INFO 02:44:17,484 Logging initialized
 INFO 02:44:17,490 JVM vendor/version: Java HotSpot(TM) 64-Bit Server VM/1.6.0_29
 INFO 02:44:17,490 Heap size: 1052770304/1052770304
 INFO 02:44:17,490 Classpath: bin/../conf:bin/../build/classes/main:bin/../build/classes/thrift:bin/../lib/antlr-3.2.jar:bin/../lib/apache-cassandra-1.1.1.jar:bin/../lib/apache-cassandra-clientutil-1.1.1.jar:bin/../lib/apache-cassandra-thrift-1.1.1.jar:bin/../lib/avro-1.4.0-fixes.jar:bin/../lib/avro-1.4.0-sources-fixes.jar:bin/../lib/commons-cli-1.1.jar:bin/../lib/commons-codec-1.2.jar:bin/../lib/commons-lang-2.4.jar:bin/../lib/compress-lzf-0.8.4.jar:bin/../lib/concurrentlinkedhashmap-lru-1.3.jar:bin/../lib/guava-r08.jar:bin/../lib/high-scale-lib-1.1.2.jar:bin/../lib/jackson-core-asl-1.9.2.jar:bin/../lib/jackson-mapper-asl-1.9.2.jar:bin/../lib/jamm-0.2.5.jar:bin/../lib/jline-0.9.94.jar:bin/../lib/json-simple-1.1.jar:bin/../lib/libthrift-0.7.0.jar:bin/../lib/log4j-1.2.16.jar:bin/../lib/metrics-core-2.0.3.jar:bin/../lib/servlet-api-2.5-20081211.jar:bin/../lib/slf4j-api-1.6.1.jar:bin/../lib/slf4j-log4j12-1.6.1.jar:bin/../lib/snakeyaml-1.6.jar:bin/../lib/snappy-java-1.0.4.1.jar:bin/../lib/snaptree-0.1.jar:bin/../lib/jamm-0.2.5.jar
 INFO 02:44:17,493 JNA not found. Native methods will be disabled.
 INFO 02:44:17,504 Loading settings from file:/usr/java/apache-cassandra-1.1.1/conf/cassandra.yaml
 INFO 02:44:17,661 DiskAccessMode 'auto' determined to be mmap, indexAccessMode is mmap
 INFO 02:44:17,867 Global memtable threshold is enabled at 334MB
 INFO 02:44:18,082 Initializing key cache with capacity of 50 MBs.
 INFO 02:44:18,095 Scheduling key cache save to each 14400 seconds (going to save all keys).
 INFO 02:44:18,097 Initializing row cache with capacity of 0 MBs and provider org.apache.cassandra.cache.SerializingCacheProvider
 INFO 02:44:18,101 Scheduling row cache save to each 0 seconds (going to save all keys).
 INFO 02:44:18,396 Couldn't detect any schema definitions in local storage.
 INFO 02:44:18,397 Found table data in data directories. Consider using the CLI to define your schema.
 INFO 02:44:18,429 No commitlog files found; skipping replay
 INFO 02:44:18,469 Cassandra version: 1.1.1
 INFO 02:44:18,474 Thrift API version: 19.32.0
 INFO 02:44:18,477 CQL supported versions: 2.0.0,3.0.0-beta1 (default: 2.0.0)
 INFO 02:44:18,520 Loading persisted ring state
 INFO 02:44:18,525 Starting up server gossip
 INFO 02:44:18,583 Enqueuing flush of Memtable-LocationInfo@137493297(162/202 serialized/live bytes, 3 ops)
 INFO 02:44:18,585 Writing Memtable-LocationInfo@137493297(162/202 serialized/live bytes, 3 ops)
 INFO 02:44:18,636 Completed flushing /usr/java/cassandra/data/data/system/LocationInfo/system-LocationInfo-hd-1-Data.db (234 bytes) for commitlog position ReplayPosition(segmentId=1339717458349310000, position=586)
 INFO 02:44:18,677 Starting Messaging Service on port 7000
 INFO 02:44:18,686 This node will not auto bootstrap because it is configured to be a seed node.
 WARN 02:44:18,694 Generated random token 97298029669747831194770523185926143402. Random tokens will result in an unbalanced ring; see http://wiki.apache.org/cassandra/Operations
 INFO 02:44:18,697 Enqueuing flush of Memtable-LocationInfo@1141296884(77/96 serialized/live bytes, 2 ops)
 INFO 02:44:18,698 Writing Memtable-LocationInfo@1141296884(77/96 serialized/live bytes, 2 ops)
 INFO 02:44:18,707 Completed flushing /usr/java/cassandra/data/data/system/LocationInfo/system-LocationInfo-hd-2-Data.db (163 bytes) for commitlog position ReplayPosition(segmentId=1339717458349310000, position=767)
 INFO 02:44:18,713 Node localhost/127.0.0.1 state jump to normal
 INFO 02:44:18,714 Bootstrap/Replace/Move completed! Now serving reads.
 INFO 02:44:18,730 Will not load MX4J, mx4j-tools.jar is not in the classpath
 INFO 02:44:18,760 Binding thrift service to localhost/127.0.0.1:9160
 INFO 02:44:18,764 Using TFastFramedTransport with a max frame size of 15728640 bytes.
 INFO 02:44:18,770 Using synchronous/threadpool thrift server on localhost/127.0.0.1 : 9160
 INFO 02:44:18,780 Listening for thrift clients...

 

Loglarda herhangi bir exception görmediyseniz Cassandra sorunsuz bir şekilde başlamış demektir. Bundan sonra yapacağımız SQL benzeri CQL ile örnek birkaç işlem yapmak. CQL konsolunu çalıştırmak için bin/cqlsh komutunu kullanıyoruz.

$ bin/cqlsh
Connected to Test Cluster at localhost:9160.
[cqlsh 2.2.0 | Cassandra 1.1.1 | CQL spec 2.0.0 | Thrift protocol 19.32.0]
Use HELP for help.
cqlsh>

 

Cassandra mimarisinde RDBMS sistemlerdeki şema kavramına karşılık gelen Keyspace kavramı mevcut. Keyspace’ler verileri barındırmak dışında verilerin nasıl dağıtılacağının ve nasıl kopyalarının oluşturulacağının da belirlendiği katman. data partitioning strategy and replication strategy parametreleri ile bu değerleri Keyspace yaratırken veriyoruz.

cqlsh> create keyspace devveri with strategy_class='SimpleStrategy' and strategy_options:replication_factor=1;
cqlsh> use devveri;
cqlsh:devveri>

 

Keyspace yarattıktan sonra sıra verileri saklayacak olan Column Family objesi yaratmaya geliyor. Column Family objeleri tablolara benzer fakat çok daha dinamik ve esnektir. Column Family oluştururken key alanı dışında statik olarak kolonları belirlemeye gerek yoktur.

cqlsh:devveri> create columnfamily members (memberId int primary key);
cqlsh:devveri>

 

Bundan sonrası şekil itibariyle SQL cümlelerine çok benziyor, fakat işleyiş olarak ciddi bir fark var. Cassandra’da insert komutu yerine update komutu kullanabilirsiniz.

cqlsh:devveri> insert into members (memberId, name, email, age) values (1, 'Dave Mustaine', 'dave@megadeth.com', 51);
cqlsh:devveri> update members set name='David Ellefson', email='david@megadeth.com', age=48 where memberId=2;
cqlsh:devveri> select * from members;
 memberId | age | email              | name
----------+-----+--------------------+----------------
        1 |  51 | dave@megadeth.com  | Dave Mustaine
        2 |  48 | david@megadeth.com | David Ellefson

cqlsh:devveri>

 

Cassandra’nın güzel özelliklerinden birisi de oluşturacağınız kaydın küme içerisinde kaç sunucuda kopyasının olacağının query zamanında ayarlayabilir olması. Bu sayede verilerin tutarlılığı ayarlanabilir olmuş oluyor (tunable consistency). Örneğin 4 sunuculuk bir kümede verinin sunucuların yarısından bir fazlasına (quorum) yani 3 sunucuya da gitmesini isterseniz şöyle yapabiliyorsunuz:

cqlsh:devveri> update members using consistency quorum set name='Marty Friedman' where memberId=3;
cqlsh:devveri>

 

CQL kullanarak key olarak belirlenen alan üzerinden select cümlesi ile istediğiniz kayıtlara ulaşabilirsiniz. Ancak diğer kolonlar üzerinden sorgulama yapmak isterseniz o zaman daha öncesinde indeks oluşturmuş olmanız gerekiyor.

Umarım bu yazı Cassandra kurup kurcalamaya başlamanız için faydalı olmuştur.

,

15 thoughts on “Apache Cassandra Kurulumu

  • ümit dedi ki:

    Merhabalar! Yazınızı okudum ve söylediklerinizi de uyguladım çok da faydalı oldular ancak ben cassandrayı java ile bağlamak için çok uğraştım çok da kaynak buldum ancak sürekli bi hatalar zinciri aldı götürdü.. apache cassandra ile java arasında bağlantının yapıldığını, anlatabilir misiniz, (ben eclipse kullanıyorum ve işletim sistemim win7 ).. Şimdiden çok teşekkürler

  • Hakan İlter dedi ki:

    Merhaba Ümit,

    Cassandra istemci kütüphaneleri konusunda biraz sıkıntılı. http://devveri.com/nosql/apache-cassandra-jdbc yazımızda JDBC sürücüsü üzerinden nasıl kullanılabileceğini anlatmaya çalışmıştık. Bunun dışında aşağıdaki istemcileri kullanmak mümkün:

    Astyanax:
    https://github.com/Netflix/astyanax/wiki/Getting-Started

    Hector (en yaygın ama bence fazla karmaşık):
    http://prettyprint.me/2010/02/23/hector-a-java-cassandra-client/

    eBay’in açık kaynaklı kodu Turmetic üzerinden kullanım:
    https://www.ebayopensource.org/wiki/display/TURMERICDOC110GA/Cassandra

    Tüm liste şöyle:
    http://wiki.apache.org/cassandra/ClientOptions/

    Diğer istemci kütüphaneleri ile ilgili örnek yazmayı bizde istiyoruz. Umarım yardımcı olabilmişizdir.

  • ümit dedi ki:

    https://github.com/Netflix/astyanax/wiki/Getting-Started bu sayfada tamamen içerikten bahsediyo ama ben öncelikle bu dosyayı eclipse dahil etmek istiyorum.dosyayı indirdim ama eclipse ekleyemiyorum. Yardımcı olabilir misiniz?

  • harun dedi ki:

    1-)Hakan hocam öncelikle yazınız için çok tşk ederim çok faydalı oldu biz yeni başlayanlar için . hocam windows 7 üzerinde apache cassandra server bağlantısını gösterip CQL ile ekleme silme güncelleme seçme işlemlerini yapabilirmisiniz .
    2-) Bir de hocam metadata ne demek söyleyebilirmisiniz?

    • Hakan İlter dedi ki:

      Windows ile ilgili bir yazı da yazmaya çalışırım ilerleyen günlerde.

      Metadata, veri hakkındaki veri anlamına geliyor. Örneğin JDBC kullanarak çektiğin veriler hakkındaki bilgiler yani verinin tipi, boyutu, şekli, kuralları vs Metadata oluyor.

  • harun dedi ki:

    Hakan hocam ;
    bin klasörünün altıntaki cqlsh yi çalıştırmak istedigimde bana bu hata mesajını veriyor nasıl üstesinden gelebilirim yardımcı olurmusunuz ?

    hbingol@hbingol-virtual-machine:~/Masaüstü/usr/java/apache-cassandra-1.0.8$ ./bin/cqlsh

    Python CQL driver not installed, or not on PYTHONPATH.
    You might try “easy_install cql”.

    Python: /usr/bin/python
    Module load path: [‘/home/hbingol/Masa\xc3\xbcst\xc3\xbc/usr/java/apache-cassandra-1.0.8/bin/../pylib’, ‘/home/hbingol/Masa\xc3\xbcst\xc3\xbc/usr/java/apache-cassandra-1.0.8/bin’, ‘/usr/lib/python2.7’, ‘/usr/lib/python2.7/plat-linux2’, ‘/usr/lib/python2.7/lib-tk’, ‘/usr/lib/python2.7/lib-old’, ‘/usr/lib/python2.7/lib-dynload’, ‘/usr/local/lib/python2.7/dist-packages’, ‘/usr/lib/python2.7/dist-packages’, ‘/usr/lib/python2.7/dist-packages/PIL’, ‘/usr/lib/python2.7/dist-packages/gst-0.10’, ‘/usr/lib/python2.7/dist-packages/gtk-2.0’, ‘/usr/lib/python2.7/dist-packages/ubuntu-sso-client’, ‘/usr/lib/python2.7/dist-packages/ubuntuone-client’, ‘/usr/lib/python2.7/dist-packages/ubuntuone-control-panel’, ‘/usr/lib/python2.7/dist-packages/ubuntuone-couch’, ‘/usr/lib/python2.7/dist-packages/ubuntuone-installer’, ‘/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol’]

    Error: No module named cql

  • Tarık Yılmaz dedi ki:

    güzel bir yazı olmuş
    DataStax direk Ubuntu dağıtımı veriyor..
    direk servis olarak başlatabilirsiniz. init.d scripti aramaya gerek yok.
    ilgilenlere duyurulur.

  • ALİ UZUN dedi ki:

    Casandrayı Sıfırdan Eclipse Kurmayı Anlatırsanız Çok sevinirim

  • Bahadır dedi ki:

    Hocam merhaba cassandra hbase gibi bir hadoop projesi midir? Hadoop ile tam ilişkisi nedir? entegresi vs gibi bir durum var mı? Birde dışarıdan bir yazılım için her seferinde map reduce yazmak gerekir mi? Hadoop örneklerinde hep bir jar komutuyla map reduce tanımı yapılıyor(yada ben öyle sanıyorum) teşekkürler

  • eturhan dedi ki:

    Merhaba ,

    cassandra 3.7 kurdum.Localde çalışmak istiyorum.
    cqlsh çalıştırdığımda aldığım hatayı paylaşıyorum.Hatayı nasıl düzeltebilirim.

    Connection error: (‘Unable to connect to any servers’,
    {‘127.0.0.1’: error(61, “Tried connecting to [(‘127.0.0.1’, 9042)]. Last error: Connection refused”)}
    )

Bir Cevap Yazın

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