Apache Kafka CLI Uygulaması

Merhabalar, önceki yazımda Apache Kafka’ya giriş yapıp, temel bileşenlerinden bahsetmiştim. Bu yazıdaysa kavramların daha iyi anlaşılması için komut satırında uygulama yapacağım. Özellikle topic partition ve consumer group gibi kavramların üzerinde durmayı planlıyorum.

1 – Kafka Topic Özellikleri

Kafka’da topic ile ilgili işlemler kafka-topics komutuyla yapılır. –create ile yeni bir topic oluşturabiliriz. Topic’ler daha önceleri sadece zookeeper ile oluşturulabilirken, zamanla Zookeeper’a olan bağımlılığı kırmak için Kafka broker’ları üzerinden de topic oluşturmaya olanak sağlandı.

kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic kitap

–bootstrap-server localhost:9092 yerine –zookeeper localhost:2181 yazarsanız (zookeeper’ınız farklı makinada ise o makinanın ip’sini yazmanız gerekiyor) topic aynı şekilde oluşacaktır.

Kafka’da bir komutun ne yaptığıyla ilgili yardım almak ve komutla birlikte kullanılan kodları öğrenmek için o anahtar kelimeyi yazıp enter’a basmak yeterlidir. Mesela kafka-topics yazarsak, komutun ne yaptığıyla ilgili özet bilgiye ve komutla birlikte kullanılan işlemlerin listesine alfabetik sırada ulaşabiliriz. Şekil – 1’de bu işlemlerle ilgili listenin bir kısmı görünmektedir.

Şekil – 1: kafka-topics komutu için yardım

Kafka’da oluşturduğumuz topic’lerin listesine –list komutuyla ulaşabiliriz. Şekil – 2’de kendi topic’lerimizle birlikte alt çizgiyle başlayan Kafka’nın kullandığı topic’leri de görüyoruz.

kafka-topics --list --bootstrap-server localhost:9092
Şekil – 2: Topic’leri listelemek

Oluşturduğumuz topic’in özelliklerine describe komutu ile ulaşabiliriz. kitap topic’ini yaratırken partition sayısını 3 olarak belirlediğimiz için Şekil – 3’de 0, 1 ve 2 olarak oluşturulan 3 partition görüyoruz. replication-factor sayımızı 1 olarak belirlediğimiz için tek bir broker vardır, dolayısıyla tüm partitionlar için leader, replica’lar ve leader’in senkronize replica’ları olan Isr’ler aynı sunucu üzerindedir. (1001 id’li broker)

kafka-topics --describe --bootstrap-server localhost:9092 --topic kitap 
Şekil – 3: Topic’i tanımlamak

2 – Kafka Producer

Örneğimiz için kitap topic’ine mesaj gönderecek bir console-producer oluşturuyoruz. Daha sonra Şekil – 4’deki gibi tek tek kitap isimleri giriyoruz.

kafka-console-producer --broker-list localhost:9092 --topic kitap
Şekil – 4: Producer örneği

2 – Kafka Consumer

Producer’da en son Satranç’ı girdikten sonra Şekil – 5’de görüldüğü gibi producer penceresini kapatmadan sağ tarafına yeni bir komut penceresi açarak kitap topic’ine abone (subscribe) olan bir console-consumer oluşturuyoruz. Ancak daha önce oluşturduğumuz (Şekil – 4’deki) kitaplar consumer penceresinde görünmüyor.  Consumer dinlerken producer’dan eklediğimiz yeni kitaplar (Satranç’tan sonrakiler) consumer penceresinde görünüyor.

kafka-console-consumer --bootstrap-server localhost:9092 --topic kitap
Şekil – 5: Consumer örneği

Topic’de en başından beri bulunan tüm verilere ulaşmamız gerekirse –from-beginning komutunu kullanırız. Şekil – 6’da consumer’da –from-beginning ile tüm verilerin çekildiği görülebilir. Ancak dikkatinizi çekmiş olmalı, consumer’da çekilen veriler, Şekil – 4’deki producer ile gönderilen sıradan farklı bir sıradadır. Eğer topic’i oluştururken partition sayısını 1 girseydik verilere yine sıralı bir şekilde erişebilirdik. Kafka aynı partition içinde verilerin sıralı olması garantisini verir. Ancak partition sayımız 1’den fazla olduğu için Kafka verileri iş yükünü dengelemek için verileri partition’lara dağıtık bir şekilde göndermiştir ve verilerimize sıralı bir şekilde erişme imkanımız kalmamıştır.

kafka-console-consumer --bootstrap-server localhost:9092 --topic kitap --from-beginning
Şekil – 6: Consumer’la verilerin hepsine ulaşmak

2 – Kafka Consumer Group

Consumer’lar verileri gruplar halinde okur. Grupları bir uygulama gibi düşünebiliriz. Mesela kitap topic’imizi hem e-ticaret sitemiz hem de mobil uygulamamız okuyor olabilir. Consumer group sayesinde iki farklı gruptaki consumer’lar birbirlerini etkilemeden çalışabilir. Şekil – 7’de sağda producer’ımız, solda o producer’dan beslenen aynı gruba ait olan iki farklı consumer görülmektedir. Producer’dan girdiğimiz veriler aynı gruptaki iki consumer’a paralel olarak paylaştırılmaktadır. Veriler consumer’lara belli bir sıraya göre değil yük durumuna göre dağıtılır.

kafka-console-consumer --bootstrap-server localhost:9092 --topic kitap --group mobil-uygulama
Şekil – 7: Consumer grup örneği

Yeni bir komut penceresinde aynı gruba ait 3. bir consumer oluşturursak (aynı komutla), Şekil – 8’deki gibi üç consumer arasında yük dağılımı yeniden yapılır. Bu durumda üç partition ve üç consumer olduğu için her consumer veriyi farklı bir partition’dan okur. Şekil – 8’de görüldüğü gibi belli bir süre sonra en üstteki consumer’ı ctrl+c ile kapatıp producer’dan veri girmeye devam edersek, yükün geri kalan iki consumer tarafından yeniden paylaşıldığını görebiliriz. Bu durumda aktif olan iki consumer veriyi almaya devam edecektir.

Şekil – 8: Üç consumer’lı consumer grup

Consumer gruplarımızı describe komutu ile Şekil – 9’daki gibi tanımlayabiliriz. Belli bir partition’da current-offset consumer’ın en son okuduğu verinin offset’ini (id’sini) log-end-offset ise o partition’daki son verinin offset’ini gösterir. Consumer’larımız tüm verileri okuduğu için current-offset ve log-end-offset’leri aynıdır. Bunlar arasında fark olsaydı, Lag biriken bu farkı yani okunmayan veri sayısını gösterecekti. Consumer grubumuzda okunmamış veri olmadığı için gruba yeni bir consumer eklersek ve –from-beginning ile tüm verileri okumasını istersek geriye dönecek veri olmayacaktır. Çünkü –from-beginning o grup içinde okunmamış verileri getirmektedir. En baştan tüm verileri çağırmak istiyorsak bu offset’leri resetleyecek ileri seviye teknikler mevcuttur.

kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group mobil-uygulama
Şekil – 9: Consumer Grup’u tanımlama

Bu yazıda Apache Kafka’yla ilgili kavramların daha iyi pekişmesini sağlamak amacıyla komut satırı kullanarak örnekler yaptık. Gerçek hayat projelerinde Kafka Java gibi programlama dilleri ile kullanılmaktadır. Daha sonraki uygulama yazılarımda bir programlama diliyle Kafka uygulaması yapmayı planlıyorum.

Yeni yazılarda görüşmek ümidiyle.

Yazar Hakkında
Toplam 4 yazı
Fatih Bilgin
Fatih Bilgin
Sakarya Üniversitesi Bilgisayar Mühendisliği mezunuyum. 10 yıllık sektör hayatımda Data Warehouse Developer ve ETL Developer olarak çalıştım. Son üç yıldır Büyük Veri ve Veri Bilimi üzerine çalışmaktayım.
Yorumlar (2 yorum)
Ensar
Ensar Cevapla
- 10:13

Teşekkürler, Kafka yazı seriniz çok verimli oldu.

    Fatih Bilgin
    Fatih Bilgin Cevapla
    - 18:27

    Faydalı olmasına sevindim 🙂

Bir cevap yazın

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

×

Bir Şeyler Ara