Lineage: veri nereden geldi, nereye gitti?
Data lineage
Bu derste neler öğreneceksin
- bruin lineage ile görselleştirir
- dbt docs lineage karşılaştırır
- Hata ayıklamada lineage kullanır
Lineage Neden Birinci Sınıf Vatandaş?
Yüzlerce tablo, binlerce dönüşüm, on farklı kaynak. Üç ay sonra birisi “şu rapor neden yanlış?” diye sorduğunda ilk yapacağın şey: o raporun upstream’ini takip etmek. Bu iz sürme işine lineage denir.
Lineage üç şeyi yanıtlar:
- Nereden geldi? Kaynak API, dosya, başka tablo.
- Neyle değişti? Hangi SQL, hangi Python, hangi macro.
- Nereye gitti? Hangi dashboard, hangi model, hangi alert.
Üretim veri ekiplerinin en çok zaman kaybettiği aktivite lineage aramaktır. Üç kategori:
| Kategori | Soru |
|---|---|
| Audit | ”Bu kolon KVKK kapsamında mı?” |
| Impact analysis | ”Bu kaynağı değiştirirsem kaç model etkilenir?” |
| Root cause | ”Bugünkü rapor yanlış; hangi upstream bozdu?” |
İlk ikisi dbt ve Bruin tarafından declarative olarak sağlanır (dosyaya depends: yazarsın, gerisini araç çözer). Üçüncüsü ancak iyi log + lineage + alert kombinasyonuyla çözülür.
Bruin Lineage
Dünkü pipeline’ı hatırla. Şimdi ona üç farklı açıdan bakalım:
# 1. Pipeline seviyesi: tüm asset'lerin bağlantıları
bruin lineage pipeline/
# 2. Asset seviyesi: tek bir asset'in upstream + downstream
bruin lineage pipeline/ --asset chess.player.stats
# 3. Kolon seviyesi (alpha): hangi kolon nereden geliyor
bruin lineage pipeline/ --column win_rate_pct
Çıktı DOT formatındadır (Graphviz). Görselleştirmek için:
bruin lineage pipeline/ --format dot > lineage.dot
# https://dreampuf.github.io/GraphvizOnline/ adresine yapıştır
ya da CLI doğrudan görsel:
bruin lineage pipeline/ --format mermaid
# Terminalde Mermaid diagramı basar.
Örnek çıktı:
graph LR
A[chess.com API] --> B[chess.games.ingest]
B --> C[chess.games.staging]
C --> D[chess.player.stats]
D --> E[Metabase dashboard]
dbt Docs Lineage
dbt, lineage’ı statik olarak dosyalardan okur (ref() ve source() çağrıları). Çıktısı interaktif bir web UI’dır:
dbt docs generate
dbt docs serve --port 8080
# http://localhost:8080 aç
/#!/overview adresinde her model bir kutu, oklar dependency. Bir modelin üstüne tıklayınca:
- Lineage sekmesi: upstream + downstream.
- Description: modelin markdown açıklaması (sen yazarsın,
description:bloğunda). - Columns: her kolonun tipi, test sayısı, açıklaması.
- Code: SQL’in derlenmiş hali.
dbt’nin lineage avantajı kolon düzeyinde detaydır. Bruin henüz alpha’da, ama dosya yapısı declarative olduğu için Bruin ileride kolon lineage’ı da destekleyecek.
Karşılaştırma
| Boyut | Bruin lineage | dbt docs |
|---|---|---|
| Kapsam | Python + SQL + tüm asset tipleri | Sadece dbt modelleri |
| Çıktı | DOT / Mermaid / JSON | Self-served HTML |
| Kolon düzeyi | Alpha | Tam |
| CI entegrasyonu | bruin validate | dbt parse + JSON artifact |
| Performans (1000 asset) | Hızlı (graph DB) | Yavaşlayabilir |
Pratikte: ikisini birlikte kullan. Bruin platform seviyesinde tüm pipeline’ı yönetir; dbt docs ise SQL modellerinin detaylı lineage’ını sunar. Capstone’da ikisini de göster.
Lineage ile Hata Ayıklama
Senaryo: Metabase dashboard’unda win_rate_pct bugün %40, geçen hafta %52’ydi.
Adımlar:
bruin lineage pipeline/ --asset chess.player.stats→ upstream:chess.games.staging.- Staging’e git,
WHEREkoşulunu kontrol et. Belki yeni oyun tipi (bullet) geldi, filtreye takılmıyor. - Staging doğruysa
bruin run --only chess.games.stagingile sadece staging’i tekrar çalıştır. Üsttekiler tekrar çalışmaz. - Hâlâ yanlışsa ingest’e in: API sözleşmesi değişmiş olabilir. Response’u
jq '.games[0]'ile incele.
Bu dört adım lineage + incremental + selective rerun olmadan yapılamaz. Üçü de modern veri platformlarının temel özelliğidir.
Hands-on
- Chess pipeline’ı kurduğun klasöre git.
bruin lineage pipeline/çalıştır, çıktıyı bir.dotdosyasına kaydet.- GraphvizOnline’da görselleştir.
- dbt projen varsa
dbt docs generate && dbt docs serveile UI lineage’ı aç. - Bir SQL’i kasıtlı boz.
bruin runhata mesajı hangi asset’te patladığını gösteriyor mu kontrol et.
Sıradaki
Lineage’yi anladın. Şimdi “hangi aracı ne zaman seçerim?” sorusunun endüstriyel cevabı →