ClickHouse : Hızlı ve Yüksek Performanslı Analitik Veri Tabanı

Herkese merhaba!

Bu yazıya giriş yaparken yine “verinin giderek artan hacmi ve önemi” hakkında birkaç cümle yazmayı düşünüyordum, ancak bu farkındalık noktasına bence çoktan ulaştık😉 Geçmişten günümüze veri hacmindeki artış sürerken, büyük veri kümelerini anlamlı ve kullanışlı bilgilere dönüştürmek için, yüksek performanslı ve ölçeklenebilir veri işleme çözümlerine ihtiyaç duyulmuş, böylece paralel hesaplama ve dağıtık sistemler gibi teknolojiler geliştirilmiştir.  Bu sistemler, veriyi parçalara bölerek ve bu parçaları birden fazla işlemci veya bilgisayarda işleyerek işlem hızını önemli ölçüde artırmayı sağlamıştır.  Bu durum, geleneksel veri tabanlarının sınırlarını aşan ve büyük veri kümeleriyle etkin bir şekilde başa çıkabilen yeni nesil veri depolama ve işleme çözümlerine olan ihtiyacı da beraberinde getirmiştir.  İşte bu noktada, ClickHouse gibi yüksek performanslı ve ölçeklenebilir çözümler ön plana çıkmıştır.

Bu makalede, ClickHouse’un ne olduğunu, nasıl çalıştığını ve neden giderek daha popüler hale geldiğini inceleyeceğiz.  Ayrıca, bu güçlü aracın kullanım alanlarına ve avantajlarına da detaylı bir şekilde değineceğiz. Veri dünyasında yeni ufuklar keşfetmek ve veri işleme süreçlerinizi optimize etmek için bu defa ClickHouse’u keşfe çıkıyoruz. Hadi!🤩

ClickHouse nedir?

ClickHouse, Yandex.Metrica için geliştirilmiş olan, çevrimiçi analitik işleme (OLAP) için yüksek performanslı, sütun odaklı bir SQL veri tabanı yönetim sistemidir (DBMS).  Hem açık kaynaklı olarak , hem de sunucusuz (serverless) bir hizmet olarak bulutta ( ticari amaçlı ) sunulmaktadır.

Bu tanıma istinaden, öncelikle OLTP ve OLAP kavramlarını bir tekrar hatırlayalım:

  • OLTP (Online Transactional Processing): “Çevrimiçi -İşlem- İşleme” anlamına gelir. Herhangi bir kuruluştaki günlük işlemleri yönetme görevine sahiptir.  Temel amacı veri analizi değil, veri işlemedir.  İnternet bankacılığı, çevrimiçi uçak bileti rezervasyonu, alışveriş sepetine kitap ekleme gibi işlemler için kullanımı örnek olarak verilebilir.
  • OLAP (Online Analytical Processing): “Çevrimiçi -Analitik- İşleme” anlamına gelir.  Karar destek sistemleri ve raporlama için veri analizi sağlayan sitemlerdir.  Bu sistemlerdeki asıl amaç ise veriyi işlemek değil, analiz etmektir.  Kullanıcıya özgü ürün, şarkı, film vb. listelerin oluşturulması için kullanıcı davranışlarının analiz edilmesi de burada örnek olarak gösterilebilir.

OLTP, veri tabanlarındaki birden fazla işlem akışını yönetmek ve depolamak için ideal çözüm olarak nitelendirilebilir, ancak veri tabanından karmaşık sorgular gerçekleştirmek için uygun değildir.  Bu nedenle iş analistleri çok boyutlu verileri analiz etmek için OLAP sistemini kullanır.  OLAP senaryoları, aşağıdaki özelliklere sahip karmaşık analitik sorgular için büyük veri kümelerinin üzerinde gerçek zamanlı yanıtlar gerektirir:

  • Veri kümeleri çok büyük olabilir (milyarlarca veya trilyonlarca satır).
  • Veriler birçok sütun içeren tablolarda düzenlenir.
  • Belirli bir sorguyu yanıtlamak için yalnızca birkaç sütun seçilir.
  • Sonuçlar milisaniye veya saniye cinsinden döndürülmelidir.
Şekil-1: OLAP & OLTP İlişkisi

Peki, satır ve sütun odaklı ne demek, bunlar arasındaki farkı da gözden geçirelim:

  • Satır odaklı veri tabanları (Row-oriented databases): Verileri kayıtlara göre düzenleyen, bir kayıtla ilişkili tüm verileri yan yana bellekte tutan veri tabanlarıdır. Satır odaklı veri tabanları, verileri organize etmenin geleneksel yoludur ve yine de verilerin hızlı bir şekilde depolanması konusunda bazı önemli faydalar sağlar.  Satırları verimli bir şekilde okumak ve yazmak için optimize edilmiştir.  (Örneğin, Postgresql, MySQL)
  • Sütun odaklı veri tabanları (Column-oriented databases):  Verileri alanlara göre düzenleyen ve bir alanla ilişkili tüm verileri bellekte yan yana tutan veri tabanlarıdır. Sütun tabanlı veri tabanları popülerlik kazanmış ve veri sorgulamada performans avantajları sağlamıştır. Sütunlar üzerinde verimli bir şekilde okuma ve hesaplama yapmak için optimize edilmişlerdir. (Örneğin, ClickHouse, Redshift, BigQuery)
Şekil-2: Satır Odaklı & Sütun Odaklı Karşılaştırması

Böylece ClickHouse’un üzerine inşa edildiği genel kavramları hatırlamış olduk.

Mimariye genel bakış

ClickHouse’un mimarisi, verilerin depolanması, sorgulanması ve yönetilmesi için ölçeklenebilir ve yüksek performanslı bir çözüm sunar.  Bileşenleri şu şekilde özetleyebiliriz:

Replica ve Shard Yapısı

ClickHouse, veri güvenilirliği ve yüksek erişilebilirlik sağlamak için bir replica ve shard yapısına sahiptir.

Replica : Replica, bir veri setinin kopyalarından biridir ve veri güvenilirliğini sağlamak için kullanılır. Her replica, verilerin tam bir kopyasını içerir ve herhangi bir replica arızalandığında diğer replica’lar aracılığıyla verilere erişim sağlanabilir. Replica, veri kaybını önlemek ve sistem kesintilerine karşı dirençli bir yapı oluşturmak için kullanılır.

Shard: Shard, bir replica içindeki verilerin bölündüğü parçalardır. Shard’lar, verilerin dağıtık bir şekilde saklanmasını ve işlenmesini sağlar. Her shard, bir veya daha fazla sunucu üzerinde çalışabilir ve belirli bir veri alt kümesini temsil eder. Sharding, veri kümesini paralel olarak işlemek ve yüksek performans sağlamak için kullanılır.

Şekil-3: ClickHouse Ölçekleme Mimarisi

Dağıtık Sistem

ClickHouse, dağıtık bir sistem olarak tasarlanmıştır ve birden fazla sunucu üzerinde çalışabilir. Dağıtık sistem, veri işleme yükünü paylaştırarak ölçeklenebilirlik sağlar. Bu, büyük veri kütleleri üzerinde hızlı ve etkili sorgu yanıtları elde etmek için önemlidir.

Veri Yönetimi

ClickHouse, verilerin depolanması, yönetilmesi ve erişilmesi için optimize edilmiş bir yapıya sahiptir. Veri partisyonlama, sıkıştırma, indeksleme ve optimizasyon gibi işlemler otomatik olarak gerçekleştirilir. Bu, veri yönetiminin daha verimli ve etkili olmasını sağlar.

Yük Denkleme ve Yüksek Erişilebilirlik

ClickHouse, yük denkleme ve yüksek erişilebilirlik için özel olarak tasarlanmıştır. Veri replikasyonu ve failover mekanizmaları sayesinde, sistem kesintilerine karşı dirençli bir yapı sağlar.

Bu genel yapısal bileşenler, ClickHouse’un yüksek performanslı, ölçeklenebilir ve güvenilir bir çözüm olmasını sağlar.

ClickHouse neden bu kadar hızlı?

ClickHouse da başlangıçta –verileri olabildiğince hızlı filtrelemek (to filter) ve toplamak(to aggregate)- için bir prototip olarak oluşturulmuştur. Bu görevin başarılmasını mümkün kılmak için de aşağıdaki başlıklara odaklanılmıştır:

  • Sütun odaklı depolama: Sütun odaklı veri tabanları OLAP senaryolarına daha uygundur.  Toplu veri analizleri için optimize edilmesi ve sorguların sadece ilgili sütunları işlemesine izin vermesi işlem hızını artırır.  (Kaynak veriler genellikle yüzlerce hatta binlerce sütun içerirken bir rapor bunlardan yalnızca birkaçını kullanabilir. ) Pahalı disk okuma işlemlerinden kaçınmak için sistemin gereksiz sütunları okumaktan kaçınması gerekir.
  • İndeksler: Bellekte yerleşik ClickHouse veri yapıları yalnızca gerekli sütunların ve bu sütunların yalnızca gerekli satır aralıklarının okunmasına olanak tanır.
  • Veri sıkıştırma: Aynı sütunun farklı değerlerinin bir arada saklanması genellikle daha iyi sıkıştırma oranlarına yol açar (satır odaklı sistemlerle karşılaştırıldığında), çünkü gerçek verilerde bir sütun, komşu satırlar için genellikle aynı veya çok fazla farklı değerlere sahip değildir. Genel amaçlı sıkıştırmaya ek olarak ClickHouse, verileri daha da kompakt hale getirebilecek özel codec bileşenlerini destekler.
  • Vektörleştirilmiş sorgu yürütme: ClickHouse yalnızca verileri sütunlarda depolamaz, aynı zamanda sütunlardaki verileri de işler.  Bu, daha iyi CPU önbellek kullanımına yol açar ve SIMD CPU talimatlarının kullanımına izin verir.
  • Ölçeklenebilirlik: ClickHouse, tek bir sorguyu bile yürütmek için mevcut tüm CPU çekirdeklerinden ve disklerinden yararlanabilir (bu bir sunucu veya bir küme (cluster) olabilir).

Bir çok veri tabanı yönetim sistemi benzer teknikleri kullanırken, ClickHouse’u farklı kılan konular ise şunlar:

  • Belirli Görevler için Mikro Optimizasyon: ClickHouse, hash tabloları ve sorting algoritmaları gibi ortak veri tabanı işlemlerinin ince ayarına odaklanır. Genel uygulamalara güvenmek yerine, her bir sorgu için en verimli varyasyonu seçmek üzere veri boyutu, bellek düzeni ve erişim modelleri gibi faktörleri dikkate alır. Düşük seviyeli ayrıntılara verilen bu titiz dikkat, önemli performans kazanımlarına yol açar.
  • Veriye Duyarlı Algoritma Seçimi: ClickHouse genel algoritmaları körü körüne uygulamaz. İşlenen verileri (sayılar, diziler, yapılar vb.) analiz eder ve yaklaşımını buna göre uyarlar. Buna kısmi sıralama, kararlı sıralama, bellek içi işleme ve verileri önceden getirme gibi hususlar dahildir.  ClickHouse, veri özelliklerini anlayarak görev için en uygun algoritmayı seçer ve bu da daha hızlı yürütme sağlar.
  • Sürekli Karşılaştırma ve Entegrasyon: ClickHouse ekibi, “en iyisi” olarak lanse edilen yeni algoritmaları ve veri yapılarını aktif olarak arar ve değerlendirir. Bu durum, ClickHouse’un en son gelişmelerden yararlanmasını ve performansın ön saflarında kalmasını sağlar.

Kullanım senaryoları ve örnek uygulama

ClickHouse’un kullanımı aşağıdaki senaryolarda rahatlıkla değerlendirilebilir:

  • Gerçek zamanlı veri analitiği
  • Günlük (log), olay (event) ve iz (trace) gözlemleme
  • İş zekası ve raporlama
  • Makine öğrenmesi ve üretici yapay zeka

Ayrıca ClickHouse Azure Blob Storage, DeltaLake, HDFS, Kafka, Postgresql gibi bir çok harici sistemle entegre edilebilmektedir.  Hangi entegrasyonu kullanacağınız tamamen ihtiyacınıza bağlı tabii.

Bu yazıda, Postgresql, ClickHouse ve Superseti nasıl entegre edeceğimize değineceğiz.  Microsoft’un sağladığı “AdventureWorksDw” veri setlerini kaynak olarak değerlendireceğiz ve şu şekilde ilerlerleyeceğiz:

  1. Docker ile PostgresqlClickHouse, Superset konteynerleri oluşturma (ClickHouse’u tek node olarak kullanacağız)
  2. Postgresql’e veri setlerini yükleme
  3. Postgresql ile ClickHouse bağlantısını kurma
  4. Superset yapılandırma
  5. Superset ve ClickHouse bağlantısını kurma

1.Docker ile Postgresql, ClickHouse, Superset konteynerleri oluşturma

  •  docker-compose.yaml dosyasını aşağıdaki şekilde ayarlayalım. (Tabi normalde şifreleri açıkça yazmıyoruz değil mi:))
version: '3.7'
services:
  # CLICKHOUSE - default
  clickhouse:
    container_name: clickhouse
    image: clickhouse/clickhouse-server
    ports:
      - "8123:8123"
      - "9000:9000"
    volumes:
      - clickhouse_data:/var/lib/clickhouse/
    environment:
      - CLICKHOUSE_DB=clickhouse_db
      - CLICKHOUSE_USER=clickhouse
      - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1
      - CLICKHOUSE_PASSWORD=Ankara06

  # POSTGRESQL - Adventureworks
  postgresql:
    container_name: postgresql
    image: erkansirin78/postgresdata-101:15
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=Ankara06
    volumes:
      - postgresql_data:/var/lib/postgresql/data
    restart: always

  # SUPERSET - default
  superset:
    container_name: superset
    restart: always
    build: ./superset
    image: superset_clickhouse
    volumes:
      - ./superset/superset-conf/config:/etc/superset
      - ./superset/superset-conf/data:/var/lib/superset
      - superset_data:/app/superset_home
    ports:
      - "8088:8088"
    environment:
      - SUPERSET_SECRET_KEY=9XR8sk0Xt9MYCb7lvi/2wNtlUU/YC/1xX8UGIUO1uUdX2BcLXlwjpEhI

volumes:
  postgresql_data:
  clickhouse_data:
  superset_data:
  • Superset’in ClickHouse bağlantısını kurabilmemiz için,  ClickHouse sürücüsünü indirmemiz gerekiyor.  Bunu Dockerfile kullanarak, baz imaj üzerine ekleyeceğiz. Bu yüzden öncelikle docker-compose dosyası ile aynı dizinde bir “superset” klasörü oluşturalım. Ardından bu dizine geçerek Dockerfile oluşturalım.
mkdir superset
cd /superset
touch Dockerfile
  • Dockerfile içeriği de aşağıdaki gibi olacak.
FROM apache/superset
# Switching to root to install the required packages
USER root
# Example: installing the Clickhouse driver to connect
RUN pip install clickhouse-connect
# Switching back to using the `superset` user
USER superset
  • Konteynerleri çalıştıralım.
docker-compose up --build -d

2.Postgresql’e veri setlerini yükleme

  • Postgresql shell’ine bağlanalım
docker exec -it postgresql psql -U postgres
  • Veri ambarı için verileri yükleyelim
create database adventureworksdw;
\c adventureworksdw;
\i AdventureWorksDW2012.sql

Artık verilerimiz Postgresql’de hazır durumda:)

Not: Aynı terminali kullanmaya devam etmek istiyorsak ctrl + D ile çıkış yapalım veya yeni bir terminal açarak aşağıdaki adımları takip etmeye devam edelim.

3. Postgresql ile ClickHouse bağlantısını kurma

Postgresql’de bulunan veriye ClickHouse ile ulaşmanın bir kaç farklı yolu buluyor:

Şekil-4: Postgresql & ClickHouse Bağlantısı

Biz bu çalışmada veri tabanı motorunu kullanacağız.

  • ClickHouse konteynerine, ardından istemcisine bağlanalım.  Bizi bir gülümseme karşılayacak:)
docker exec -it clickhouse bash -c "clickhouse client --user clickhouse --password Ankara06"

Çıktı:

root@09006fee88e8:/# clickhouse client
ClickHouse client version 24.2.2.71 (official build).
Connecting to localhost:9000 as user clickhouse.
Connected to ClickHouse server version 24.2.2.

Warnings:
 * Linux transparent hugepages are set to "always". Check /sys/kernel/mm/transparent_hugepage/enabled

09006fee88e8 :)
  • ClickHouse’da Postgresql bilgilerini vererek veri tabanı bağlantısı oluşturalım.
CREATE DATABASE adv_dw ENGINE = PostgreSQL('postgresql:5432', 'adventureworksdw', 'postgres', 'Ankara06', `public`, 1);

Yukarıda parantez içerisinde verdiğimiz parametreler, sırayla:

  1. Sunucu ve port
  2. Bağlanacağımız veri tabanı
  3. Kullanıcı adı
  4. Şifre
  5. Veri tabanında bağlanmak istediğimiz şema
  6. use_table_cache parametresi  (1 olarak ayarlanırsa tablo yapısı önbelleğe alınır ve değiştirilip değiştirilmediği kontrol edilmez)
  •  “adv_dw” veri tabanı oluşmuş mu doğrulayalım.
show databases;

Çıktı:

Query id: 1c3f04d0-907b-4330-a470-a3c3bb3ca1b4

┌─name───────────────┐
│ INFORMATION_SCHEMA │
│ adv_dw             │
│ clickhouse_db      │
│ default            │
│ information_schema │
│ system             │
└────────────────────┘

6 rows in set. Elapsed: 0.002 sec.

Artık ClickHouse doğrudan Postgresql’de “public” şemasındaki tablolara ulaşabiliyor.

Postgresql ile doğrudan bağlantı yapmak ve buradaki tablolara ClickHouse üzerinden ulaşmak ClickHouse performansını deneyimlemeyi mümkün kılmayacaktır.  Burada amacımız, ihtiyaç durumunda Postgresql’e nasıl bağlantı sağlanacağını göstermektir.  Postgresql/ClickHouse bağlantısı için yaklaşımlar ve performans değerlendirmeleri için aşağıdaki linkleri de incelemenizi bu noktada önerebilirim.

Not: Aynı terminali kullanmaya devam etmek istiyorsak ctrl + D ile çıkış yapalım veya yeni bir terminal açarak aşağıdaki adımları takip etmeye devam edelim.

4. Superset yapılandırma

Daha önce Superset ile ilgili yazımda bulunan adımları burada da uygulayalım.

  • Admin kullanıcısı oluşturalım
docker exec -it superset superset fab create-admin \
              --username admin \
              --firstname Superset \
              --lastname Admin \
              --email admin@superset.com \
              --password admin
  • Lokal veri tabanı son sürüme yükseltelim
docker exec -it superset superset db upgrade
  • Rolleri oluşturalım
docker exec -it superset superset init

5.Superset ve ClickHouse bağlantısını kurma

Kurulumda Superset için clickhouse sürücüsünü indirmiştik.  Bu yüzden aşağıdaki şekilde bağlantıyı kolaylıkla sağlayabiliriz.

  • http://localhost:8088/login/  arayüzünden admin/admin ile giriş yapalım
  • Veri tabanı bağlantılarının sayfasına ulaşalım (Sağ üst köşede “Settings” menüsünde “Database Connections”)
  • Yeni veri tabanı bağlantısı oluşturma penceresine ulaşalım ve ClickHouse’u seçelim (Sağ üst köşede “+ DATABASE” )
Şekil-5: Superset & ClikHouse Bağlantısı – 1
  • Bağlantı bilgilerimizi girelim ve bağlantıyı tamamlayalım
Şekil-6: Superset & ClikHouse Bağlantısı – 2

Böylece ClickHouse ve Superset iletişimini de sağlamış olduk. (Superset ile ilgili yazımda SQL Lab, grafik ve panel oluşturma ile ilgili genel bilgilerden de bahsetmiştim)

Bu makalede, ClickHouse’un ne olduğunu, nasıl çalıştığını ve entegrasyona dair bazı örneklerini inceledik.  Sütun odaklı mimarisi, yüksek performansı ve ölçeklenebilirliği ile ClickHouse, büyük veri analitiği ve iş zekası uygulamaları için ideal bir çözüm sunmaktadır.  ClickHouse’un sunduğu bu avantajları keşfetmek ve veri işleme süreçlerinizi optimize etmek için şimdi ClickHouse’u denemeye ne dersiniz? Hadi, veri dünyasında yeni ufuklara yelken açalım! 🚀

Tekrar görüşmek üzere ✌️

Kaynaklar

https://clickhouse.com/docs/en/intro

https://aws.amazon.com/tr/what-is/olap/

https://unsplash.com/photos/time-lapse-photography-eH_ftJYhaTYhttps://unsplash.com/photos/silver-bell-alarm-clock-dhZtNlvNE8M

Yazar Hakkında
Toplam 7 yazı
Elif Sinem AKTAŞ
Elif Sinem AKTAŞ
DataLonga'da Data Engineer olarak çalışmaktadır. Teknolojiye ve veri bilimine olan ilgisi sebebiyle çıktığı yolda, günümüzün yeniliklerine yönelik gelişmeye ve öğrendiklerini paylaşmaya devam etmektedir.
Yorumlar (1 Yorum)
Caner
Caner Yanıtla
- 10:47

Uzun zamandır araştırma yapıpda en net bulduğum içerik.
Teşekkürler.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara