Google Dataproc’ta Kafka Topic’e Gelen Mesajların Spark İle Bigquery’e yazdırılıp Python — Streamlit ile görselleştirilerek Docker ile Deploy edilmesi.

Kerem NOGAY
5 min readNov 19, 2022

--

Birkaç ay önce İstanbul Data Science Academy’nin düzenlediği Cloud & Data Engineering Bootcamp’e başlayarak DATA ENGINEER olma yolunda en önemli adımı atmıştım.

Burada daha önce kullanma şansım olmayan Google Cloud Platform’u tanıyarak GCP üzerinde birçok çalışmalar yapma fırsatı yakaladım.

Bitirme projesi olarak GCP üzerinde DATAPROC clusterda KAFKA kurarak data.gov ‘dan edindiğim bir veri setini TOPIC’e mesaj olarak gönderdim ve bunu SPARK ile BIGQUERY’e yazdırdım. Daha sonra bu veri ile STREAMLIT aracılğıyla veri görselleştirmesi oluşturarak GCP Üzerinde oluşturduğum VM INSTANCE’a da DOCKER ile deploy ettim. Bu yazıda bu adımları anlatarak projeden bahsedeceğim.

Ayrıca veri görselleştirmesi kısmında PYTHON, STREAMLIT, PANDAS ve PLOTLY’de kullanmış olacağız.

PROJE ÖZETİ

New York şehrindeki köpek saldırılarına ait DATASET’i kullanılarak DATAPROC üzerinde KAFKA’ya mesaj gönderilmesi ve SPARK aracılığı ile BIGQUERY’de oluşturulan tablonun STREAMLIT ile görselleştirilerek DOCKER ile DEPLOY edilmesi.

Öncelikle projeyi gerçekleştireceğimiz ortamı hazırlayarak başlayacağız. GCP üzerinde DATAPROC’a gelerek COMPUTE ENGINE ile yeni bir CLUSTER oluşturuyoruz. CLUSTER’ı default ayarları kullanarak oluşturuyoruz fakat burada oluşturduğum CLUSTER’ı bir web arayüzden monitör edebilmek için Enable component gateway seçeneğini seçiyorum. Gerekli olması halinde kullanmak üzere Jupyter Notebook’u da kuruluma ekledim.

CLUSTER aktif hale geldikten sonra cluster içerisinde CLOUD SHELL kullanarak SSH bağlantısı yapacağım.

KAYNAK DOSYA

Kurulumlara başlamadan önce üzerinde çalışacağımız CSV dosyasını sunucuya yükledim. Projeye kaynak olarak oluşturduğum kopeksaldiri.csv dosyası ile devam edeceğim.

GEREKLİ KURULUMLAR

DATAPROCTA cluster içerisinde SSH bağlantısı yaptıktan sonra KAFKA’yı sitesinden aldığım bağlantı ile indirerek arşivden çıkarttım. Ardından KAFKA PYTHON paketini kuracağım.

KAFKADA İLK ADIMLAR

PRODUCER HAZIRLANMASI

Burada daha önce CSV olarak yüklediğim DATASET ile KAFKA’ya mesaj gönderiyormuş gibi bir SENARYO oluşturuyorum. PY dosyasında KAFKA TOPIC’i ve ilgili CSV dosyasını tanımladım. Oluşturduğum PY dosyasını sunucuya UPLOAD ederek çalıştırdığımda her 5 saniyede bir CSV dosyasından 10 satır olarak KAFKA da tanımladığım TOPIC’e mesaj gönderiyor.

KAFKA üzerinde oluşturduğumuz TOPIC’e PRODUCER’dan veri gelip gelmediğini kontrol ediyoruz. Aşağıdaki gibi TOPIC’e mesajlar geldiğini görebiliriz

SPARK SÜREÇLERİ

Şimdi SPARK ile TOPIC’ten gelen veriyi BIGQUERY’e yazdıracağız. KAFKA bağlantısını yarapaka DATAFRAME ve SCHEMA’lar ile devam edeceğim. SPARK ile TOPIC’ten gelen veriyi BIGQUERY’e yazdıracağız. Öncelikle BIGQUERY değişkenlerini tanımladım. BUCKET ile DATAPROC aynı REGION da olmalı.

Daha önce oluşturduğum SCHEMA’yı tekrar kullanıyorum. BASEDF ile veriyi okuyarak COUNTDF ile gruplama yaparak daha sonra veriyi TABLO’ya yazdıracağız.

Veriyi yazdırmak için BIGQUERY’de tablo oluşturacağım. Şimdilik tarih alanını da STRING olarak oluşturuyorum raporlama sürecinde DATE olarak kullanacağım. Ardından IAM de BIGQUERY’e veri yazabilmek için servis hesabı oluşturup KEY dosyasını terminalden yükledim.

KEY dosyasını CREDENTIALS olarak tanımladım ve writeStream ile BIGQUERY’de oluşturduğum DATASET altındaki TABLO’ya yazdırdım.

STREAMLIT

STREAMLIT ile kullanmak üzere yeni bir servis hesabı açtım ve BIG QUERY data viewer yetkisi verdim. STREAMLIT ile kullanmak için CREDENTIALS dosyasını indirip format değişikliği yaptım. Ayarları STREAMLIT ‘in kendi dökümantasyonundan devam ettirdim. sonraki slaytlarda PYTHON ile oluşturduğum görselleştirmenin kodlarını inceleyeceğiz.

Nihai olarak DASHBOARD şu şekilde olacaktır.

DOCKER

STREAMLIT üzerinde oluşturduğum uygulamayı CLOUD üzerinde bir VM oluşturup DOCKER ile DEPLOY etmek istiyorum. Öncelikle HTTP ve HTTPS trafiklere izin veren bir VM INSTANCE oluşturup DOCKER yükleyeceğim. Ardından hazırladığım projeyi DOCKERFILE ile IMAGE olarak yazıp bu IMAGE’dan bir CONTAINER oluşturacağım. DOCKERFILE dosyasında CREDANTIALS dosyasını göndermek için STREAMLIT klasörünü oluşturup SECRETS.TOML dosyasını gönderiyorum. Aynı zamanda MAIN.PY dosyasınıda ekliyorum.

DOCKER ile CONTAINER’i ayağa kaldırmadan önce bir FIREWALL RULE oluşturup VM’in FIREWALL ayarlarında 8501 PORT için oluşturduğum FIREWALL RULE TAG’ini tanımladım. DOCKER CONTAINER ‘ı RUN ederken VM INSTANCE’ın INTERNAL IP’si ile RUN ediyorum ve kısa bir süre sonra EXTERNAL IP üzerinden 8501 PORT’u ile ulaşılabilir hale gelmiş oluyor. VM EXTERNAL IP ile proje bağlantıya hazır hale geliyor.

Bir başka projede görüşmek üzere.

https://github.com/keremngy

--

--