Program
dbt (data build tool), modern veri mühendisliği ve analitik iş akışlarında yaygın olarak kullanılan bir geliştirme çerçevesi haline geldi. Veri analistleri genellikle SQL ile dönüşümleri yazmak için veri mühendislerine güvenir. Ancak dbt ile dönüşümleri kendileri yazabilir ve veriler üzerinde daha fazla kontrol sahibi olabilirler. Ayrıca Git gibi popüler sürüm kontrol sistemleriyle entegrasyona izin vererek ekip iş birliğini geliştirir.
Veri mühendisi, veri analisti veya veri bilimci gibi bir veri ambarı rolüne hazırlanıyorsanız, temel ve ileri düzey dbt sorularına hâkim olmalısınız!
Bu yazıda, temel kavramlarınızı ve ileri düzey problem çözme becerilerinizi geliştirmek için en sık sorulan mülakat sorularını özetledim.
dbt nedir?
dbt, verileri dönüştürmenizi, doğruluğunu test etmenizi ve değişiklikleri tek bir platformda takip etmenizi sağlayan açık kaynaklı bir veri dönüşüm çerçevesidir. Diğer ETL (extract, transform, load) araçlarının aksine dbt yalnızca dönüşüm kısmını (T) yapar.
Bazı diğer ETL araçları verileri çeşitli kaynaklardan çıkarır, ambarın dışında dönüştürür ve sonra geri yükler. Bu çoğu zaman uzman seviyede kodlama bilgisi ve ek araçlar gerektirir. Ancak dbt bunu kolaylaştırır — yalnızca SQL kullanarak ambar içinde dönüşüm yapılmasına imkân tanır.
40.000’den fazla büyük şirket verilerini düzenlemek için dbt kullanıyor — bu nedenle işe alım uzmanları, veriyle ilgili rollerde en önemli becerilerden biri olarak listeler. Dolayısıyla, başlangıç seviyesinde bir veri uygulayıcısı olarak bile buna hâkim olursanız birçok kariyer fırsatının kapısını aralayabilirsiniz!

dbt anlamsal katmanı. Görsel kaynağı: dbt
Temel dbt Mülakat Soruları
Mülakat sürecinin başında görüşmeci temel bilginizi ölçer. Bunun için şu tür temel sorular sorabilir:
dbt’nin yaygın kullanım alanları nelerdir?
dbt, bir veri ekibini verileri dönüştürme, belgeleme ve test etme konusunda ortak bir zeminde buluşturur. Verilerin güvenilir ve anlaşılır olmasına yardımcı olur. dbt’nin yaygın kullanım alanları şunlardır:
- Veri dönüşümü: Analitiğin özüdür. dbt, SQL sorgularının yazılmasından teknik veri hatlarının sürdürülmesine kadar her şeyi yönetir ve veri analistleri ile mühendislerinin iş yükünü azaltır.
- Test etme: Canlıya almadan önce kodu doğrulamak esastır. dbt ile veri doğruluğunu ve güvenilirliğini sağlamak için birden fazla test yapabilirsiniz.
- Belgelendirme: Diğer ekip üyelerinin veri kümelerini daha iyi anlamasını sağlar. Burada kodumuzun, tabloların, DAG’ın (Directed Acyclic Graph) ve yaptığınız testlerin açıklamasını ekleyebiliriz.
- Sorunsuz geçiş: dbt, veri modellerini platformlar arasında taşımayı kolaylaştırır. Modeli bir kez oluşturduktan sonra, en az sözdizimi düzenlemesiyle taşıyabiliriz.
dbt bir programlama dili midir?
Hayır, dbt bir programlama dili değildir. Ambar içindeki veri dönüşüm işlerine yardımcı olan bir araçtır. SQL yazmayı biliyorsanız, dbt ile kolayca çalışabilirsiniz. Belirli görevler için Python’u da desteklemeye başladı. Ancak özünde SQL tabanlı dönüşümleri yönetir ve çalıştırır.
dbt ile Spark’ı nasıl karşılaştırırsınız?
dbt ve Spark farklı amaçlara hizmet eder ve farklı türde iş akışlarını hedefler. İşte veri altyapısındaki rollerine dair bir karşılaştırma:
|
Özellik |
dbt |
Spark |
|
Rol |
SQL tabanlı veri dönüşümleri ve modelleme |
Dağıtık veri işleme ve analitik |
|
Çekirdek dil |
Öncelikli SQL, sınırlı Python desteğiyle |
SQL, Python, Scala, Java, R desteği |
|
Veri yönetişimi |
Dokümantasyon ve köken (lineage) desteği |
Erişim kontrolü, denetim ve veri kökeni sağlar |
|
Hedef kullanıcılar |
SQL kullanıcıları, analistler ve mühendislik becerisi olmayan ekipler |
Veri mühendisleri, veri bilimciler, geliştiriciler |
|
Dönüşüm karmaşıklığı |
Yalnızca SQL dönüşümleri ve modellemeye odaklanır |
Diğer dillerdeki karmaşık dönüşümleri de kaldırabilir |
|
Test ve doğrulama |
Yerleşik test yetenekleri vardır |
Özel test stratejileri gerekir (birim ve entegrasyon) |
dbt ile ilgili zorluklar nelerdir?
dbt veri ekiplerine büyük değer katmasına rağmen, özellikle ölçek ve karmaşıklık arttığında bazı zorluklar da doğurabilir. En yaygın zorluklardan bazıları şunlardır:
- Zor öğrenme eğrisi: Yeni kullanıcılar veri modelleme, Jinja şablonlama ve proje yapılandırma gibi kavramlarda zorlanabilir.
- Veri kalitesi ve test: Yeterli test kapsamını sağlamak ve büyük projelerde testleri sürdürmek karmaşık olabilir.
- Ölçekleme sorunları: Büyük veri kümeleri veya karmaşık dönüşümlerde performans darboğazları oluşabilir.
- Bağımlılık yönetimi: Projeler büyüdükçe bağımlılıkları yönetmek ve DAG’i sorun gidermek zorlaşabilir.
- Orkestrasyon: dbt’yi daha geniş iş akışlarına entegre etmek, özellikle özel zamanlama ile zorlu olabilir.
- Dokümantasyon: Model dokümantasyonunu ve testleri güncel tutmak zaman alıcı olabilir.
- Veritabanına özgü sınırlamalar: Farklı veri platformlarının uyumluluk ve özellikleri değişiklik gösterebilir.
- Eski araçlardan geçiş: Eski ETL araçlarından iş akışlarını uyarlamak zor olabilir.
- Karmaşık iş mantığı: dbt içinde gelişmiş mantığı ele almak, makrolar gerektirebilir ve karmaşıklığı artırabilir.
Yukarıdaki potansiyel zorlukların etrafından nasıl dolaşılacağını bilmek, işverenlerin aradığı bir yetkinliktir; bu sorunun önemini göz ardı etmeyin.
dbt Core ile dbt Cloud arasındaki fark nedir?
dbt’nin iki ana sürümü vardır:
dbt Core, kullanıcıların yerelde SQL tabanlı dönüşümler yazmasına, çalıştırmasına ve yönetmesine olanak tanıyan dbt’nin ücretsiz ve açık kaynaklı sürümüdür. dbt projelerini yürütmek, modelleri test etmek ve veri hatları oluşturmak için bir komut satırı arayüzü (CLI) sunar. Açık kaynak olduğundan, dbt Core kullanıcıların dağıtım, orkestrasyon ve altyapı kurulumlarını kendilerinin yönetmesini gerektirir; genellikle otomasyon için egrating with tools like Airflow or Kubernetes for automation.
dbt Cloud ise dbt’nin geliştiricileri (Fishtown Analytics) tarafından sunulan yönetilen bir hizmettir. dbt Core’un tüm yeteneklerinin yanı sıra web tabanlı bir arayüz, entegre zamanlama, iş yönetimi ve iş birliği araçları gibi ek özellikler sunar. dbt Cloud ayrıca built-in CI/CD (sürekli entegrasyon ve dağıtım) özellikleri, API erişimi ve daha sıkı güvenlik ihtiyaçları olan kuruluşlar için SOC 2 ve HIPAA gibi gelişmiş güvenlik uyumluluğu içerir.
Orta Düzey dbt Mülakat Soruları
Artık temel dbt sorularını ele aldığımıza göre, işte bazı orta düzey dbt soruları. Bunlar belirli teknik yönlere ve kavramlara odaklanır.
dbt’de kaynaklar (sources) nedir?
dbt’de kaynaklar ham veri tabakalarıdır. Bu ham tablolarda doğrudan SQL sorguları yazmayız — şema ve tablo adını belirtip bunları kaynak olarak tanımlarız. Bu, tablolardaki veri nesnelerine atıfta bulunmayı kolaylaştırır.
Veritabanınızda sales şemasında orders adlı bir ham veri tablonuz olduğunu düşünün. Bu tabloyu doğrudan sorgulamak yerine, onu dbt’de şu şekilde bir kaynak olarak tanımlarsınız:
sources.yml dosyanızda kaynağı tanımlayın:
version: 2
sources:
- name: sales
tables:
- name: orders
Kaynağı dbt modellerinizde kullanın:
Bir kez tanımlandıktan sonra, ham orders tablosuna dönüşümlerinizde şu şekilde atıfta bulunabilirsiniz:
SELECT *
FROM {{ source('sales', 'orders') }}
Bu yaklaşım ham tablo tanımını soyutlayarak yönetimi kolaylaştırır ve alttaki tablo yapısı değişirse her sorguyu değil, tek bir yeri (kaynak tanımını) güncelleyebilmenizi sağlar.
dbt’de kaynak kullanmanın faydaları:
- Organizasyon: Kaynaklar ham verinizi düzenler ve bir proje içinde yönetimini kolaylaştırır.
- Soyutlama: Şema ayrıntılarını soyutlayarak hataları azaltır ve esnekliği artırır.
- Dokümantasyon: Kaynakları tanımlamak, ham veri girdileriniz için daha iyi dokümantasyon oluşturmanıza yardımcı olur.
dbt modeli nedir?
Bir dbt modeli, ham veriler için dönüşüm mantığını tanımlayan bir SQL veya Python dosyasıdır. dbt’de modeller; toplulaştırmalar, join’ler veya her tür veri işleme dahil olmak üzere dönüşümleri yazdığınız temel bileşendir.
- SQL modeller dbt’de dönüşümleri tanımlamak için
SELECTifadelerini kullanır ve .sqldosyaları olarak kaydedilir. - Python modeller, dbt’nin Python desteği ile sunulmuş olup
.pydosyaları olarak kaydedilir ve pandas gibi Python kütüphanelerini kullanarak veriyi işleyebilmenizi sağlar.
SQL model örneği:
Bir SQL modeli, SQL sorguları kullanarak ham verileri dönüştürür. Örneğin, bir orders tablosundan sipariş özeti oluşturmak için:
--orders_summary.sql
WITH orders_cte AS (
SELECT
customer_id,
COUNT(order_id) AS total_orders,
SUM(order_amount) AS total_revenue
FROM {{ ref('orders') }}
GROUP BY customer_id
)
SELECT *
FROM orders_cte
Bu örnekte:
orders_summary.sqlmodeli, her müşteri için toplam sipariş ve gelir özetini SQL kullanarak oluşturur.- Model,
orderstablosuna (zaten bir dbt modeli veya kaynak olarak tanımlanmış) başvurur.
Python model örneği:
Bir Python modeli, Python kodu kullanarak ham verileri işler. SQL’de zahmetli olabilecek karmaşık mantıklar için özellikle yararlıdır.
# orders_summary.py
import pandas as pd
def model(dbt, session):
# Load the source data
orders = dbt.ref("orders").to_pandas()
# Perform transformations using pandas
orders_summary = orders.groupby('customer_id').agg(
total_orders=('order_id', 'count'),
total_revenue=('order_amount', 'sum')
).reset_index()
return orders_summary
Bu örnekte:
- Python modeli, siparişleri müşteri bazında gruplayarak toplam sipariş sayısı ve geliri hesaplamak için pandas kullanır.
- Sonuç bir DataFrame olarak döndürülür ve dbt bunu kendi hattına entegre edebilir.
Bir dbt modeli nasıl oluşturursunuz?
Bir dbt modeli şöyle oluşturulur:
modelsklasörü altında bir dizin oluşturun.- Dizin içinde
.sqluzantılı yeni bir metin dosyası ekleyin (veya Python modeli ise.py). - Şimdi ham veriyi dönüştürmek için bir SQL sorgusu veya kod yazın.
dbt runkomutunu çalıştırarak dönüşümü uygulayın ve modeli oluşturun.
dbt modeller arasındaki bağımlılıkları nasıl yönetir?
dbt, modeller arası bağımlılıkları, modeller arasında net bir bağımlılık zinciri oluşturan ref() fonksiyonuyla yönetir.
dbt’de bir dönüşüm tanımladığınızda, ambarınızdaki tablolara doğrudan başvurmak yerine diğer dbt modellerine ref() ile başvurursunuz. Bu, hangi modellerin diğerlerine bağımlı olduğunu belirleyerek dbt’nin modelleri doğru sırayla inşa etmesini sağlar.
Örneğin, orders_summary adlı bir modeliniz orders modeline bağlıysa, bunu şöyle tanımlarsınız:
WITH orders AS (
SELECT * FROM {{ ref('orders') }}
)
SELECT
customer_id,
COUNT(order_id) AS total_orders,
SUM(order_amount) AS total_revenue
FROM orders
GROUP BY customer_id
Bu örnekte, {{ ref('orders') }} fonksiyonu, orders modelinin orders_summary’den önce inşa edilmesini sağlar; çünkü orders_summary, orders modelindeki verilere dayanır.
dbt’de makrolar nedir ve nasıl çalıştırılır?
dbt’de makrolar, Jinja şablonlama motoru kullanılarak yazılmış, yeniden kullanılabilir SQL kod bloklarıdır. Tekrarlayan görevleri otomatikleştirmenize, karmaşık mantığı soyutlamanıza ve SQL kodunu birden fazla modelde yeniden kullanmanıza olanak tanır; böylece dbt projeniz daha verimli ve sürdürülebilir olur.
Makrolar, dbt projenizin macros dizini içindeki .sql dosyalarında tanımlanabilir.
Makrolar, birden çok modelde benzer dönüşümler yapmanız gerektiğinde veya ortam bazlı mantık (ör. farklı şemaların kullanımı ya da dağıtım ortamlarına göre tarih biçimlerinin değiştirilmesi; geliştirme, hazırlık, üretim) gerektiğinde özellikle kullanışlıdır.
Makro oluşturma örneği:
- Tarih biçimlendirme makrosu: Modeller genelinde tarih biçimlendirmesini standartlaştırmak için bir makro oluşturabilirsiniz. Tarih biçim mantığını tekrar etmek yerine şöyle bir makro yazabilirsiniz:
-- macros/date_format.sql
{% macro format_date(column) %}
FORMAT_TIMESTAMP('%Y-%m-%d', {{ column }})
{% endmacro %}
Bir modelde kullanım:
SELECT
customer_id,
{{ format_date('order_date') }} AS formatted_order_date
FROM {{ ref('orders') }}
Bu örnekte, format_date makrosu, çağrıldığı her modelde order_date sütununun biçimini standartlaştırmak için kullanılır.
- Özel şema adı makrosu: Bu makro, ortama (ör. geliştirme veya üretim) bağlı olarak şema adlarını dinamik olarak değiştirir. Şema adlarını manuel değiştirmeden ortamları yönetmeye yardımcı olur.
-- macros/custom_schema.sql
{% macro custom_schema_name() %}
{% if target.name == 'prod' %}
'production_schema'
{% else %}
'dev_schema'
{% endif %}
{% endmacro %}
Bir modelde kullanım:
SELECT *
FROM {{ custom_schema_name() }}.orders
Burada makro, ortamın (target.name) "prod" olup olmadığını kontrol eder ve buna göre doğru şema adını döndürür.
Makrolar nasıl çalıştırılır:
Makrolar SQL modelleri gibi doğrudan çalıştırılmaz. Bunun yerine, modellerinizde veya diğer makrolarda referans verilir ve dbt projesi çalıştığında yürütülür. Örneğin bir model içinde makro kullanırsanız, dbt run komutunu çalıştırdığınızda makro da çalışır.
- Bir model içinde makro çağırma: Bir SQL modeline makro dahil ettiğinizde, makro modelin çalışması sırasında yürütülür.
- Makroları manuel çalıştırma:
dbt run-operationkomutuyla bazı makroları manuel olarak da çalıştırabilirsiniz. Bu genellikle tek seferlik işler için kullanılır; örneğin veri tohumlama veya bakım işlemleri.
dbt’de iki test türü nedir?
dbt’de iki test türü vardır: tekil testler ve genel testler.
- Tekil testler, bir dbt modelindeki belirli koşullara odaklanır. Test koşulu başarısız olursa satırları döndürür.
Örnek: Hiçbir siparişin negatif order_amount değerine sahip olmadığından emin olmak istediğinizi varsayalım. tests dizininde aşağıdaki gibi bir tekil test yazabilirsiniz:
-- tests/no_negative_order_amount.sql
SELECT *
FROM {{ ref('orders') }}
WHERE order_amount < 0
Bu test başarısız olursa, dbt orders tablosundan order_amount negatif olan tüm satırları döndürür.
- Genel testler, argüman kabul eden ön tanımlı testlerdir. Şu alt türlere ayrılır:
|
Genel testler |
Tanım |
|
Unique |
Sütundaki benzersiz değerleri kontrol eder. |
|
Not null |
Boş alan olup olmadığını kontrol eder. |
|
Available values |
Standartlaşmayı korumak için sütun değerlerinin beklenen değer listesyle eşleştiğini doğrular. |
|
Relationships |
Tutarsız verileri kaldırmak için tablolar arasındaki başvuru bütünlüğünü kontrol eder. |
Örnek: customers tablosunda customer_id’nin benzersiz ve boş olmadığından emin olmak için schema.yml dosyanızda kolayca genel bir test tanımlayabilirsiniz:
version: 2
models:
- name: customers
columns:
- name: customer_id
tests:
- unique
- not_null
Bu örnekte:
- Unique testi,
customerstablosundaki hercustomer_id’nin benzersiz olduğunu kontrol eder. - Not_null testi, hiçbir
customer_iddeğerinin eksik veya null olmadığını kontrol eder.
İleri Düzey dbt Mülakat Soruları
İlerledikçe daha karmaşık senaryolar ve ileri düzey kavramlarla karşılaşabilirsiniz. İşte uzmanlığınızı ölçmenize ve kıdemli düzey veri mühendisliği pozisyonlarına hazırlamanıza yardımcı olacak bazı zorlayıcı mülakat soruları.
dbt’de artımlı (incremental) modelleri nasıl yaparsınız ve ne zaman kullanırsınız?
dbt’de artımlı modeller, her seferinde tüm veri kümesini yeniden işlemek yerine yalnızca yeni veya değişmiş verilerin işlenmesini sağlar. Bu, özellikle büyük veri kümeleriyle çalışırken, modeli sıfırdan yeniden oluşturmanın zaman ve kaynak açısından maliyetli olduğu durumlarda faydalıdır.
Artımlı bir model, genellikle bir zaman damgası sütununa (örneğin updated_at) dayalı bir koşula göre yalnızca yeni verileri eklemeye (veya değişmiş verileri güncellemeye) imkân tanır.
Artımlı model nasıl oluşturulur:
1. Modeli, yapılandırmada artımlı olarak tanımlayın:
{{ config(
materialized='incremental',
unique_key='id' -- or another unique column
) }}
2. Yeni veya değişmiş satırları filtrelemek için is_incremental() işlevini kullanın:
SELECT *
FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
3. dbt bu modeli ilk kez çalıştırdığında tüm verileri işler. Sonraki çalıştırmalarda ise yalnızca updated_at değeri modelde zaten bulunan en son değerden büyük olan satırları işler.
Artımlı modeller ne zaman kullanılır:
- Büyük veri kümeleri: Milyonlarca veya milyarlarca satıra sahip büyük tablolarda her çalıştırmada tablonun tamamını yeniden oluşturmak verimsizdir.
- Sık güncellemeler: Veri ambarınız sık güncelleme veya yeni veri alıyorsa, ancak tüm veri kümesini yeniden işlemeye gerek yoksa, artımlı modeller işlem süresini ciddi ölçüde azaltabilir.
- Akış verisi: Verilerin düzenli olarak aktığı veya güncellendiği durumlarda, artımlı modeller tümünü yeniden çalıştırmadan dönüşümlerin güncel kalmasına yardımcı olur.
SQL kodunuzu geliştirmek için Jinja’yı nasıl kullanırsınız?
Jinja, SQL kodumuzu daha esnek hale getirir. Jinja ile yaygın SQL kalıpları için yeniden kullanılabilir şablonlar tanımlayabiliriz. Gereksinimler sürekli değiştiği için, Jinja’nın if ifadelerini kullanarak koşullara bağlı olarak SQL sorgularımızı ayarlayabiliriz. Bu, karmaşık mantığı bölerek SQL kodunu genellikle daha anlaşılır kılar.
Örneğin, tarih biçimini "YYYY-MM-DD"den "MM/DD/YYYY"ye dönüştürmek istiyorsanız, önceki soruda gördüğümüz örnek bir dbt makrosu şöyledir:
{% macro change_date_format(column_name) %}
to_char({{ column_name }}::date, 'MM/DD/YYYY')
{% endmacro %}
Bu kod örneğinde, {{ column_name }} makroyu kullandığınızda Jinja’nın gerçek sütun adını ekleyeceği yerdir. Çalışma zamanında gerçek sütun adıyla değiştirilir. Önceki örneklerde gördüğümüz gibi, Jinja değişimin nerede olacağını göstermek için {{ }} kullanır.
dbt’de özel materyalizasyonu (custom materialization) nasıl oluşturursunuz?
dbt’de özel materyalizasyon şöyle oluşturulur:
- Özel materyalizasyon için SQL dosyasını oluşturun.
- Ardından,
materialization_nameadıyla bir materyalizasyon makrosu tanımlayın:
{% materialization materialization_name, default -%}
- Hedef tabloyu kurmak için dbt’nin ön tanımlı
adapter.get_relationmakrolarını kullanın. Verilerin yükleneceği yer burasıdır. - Şimdi, tabloları oluşturmak ve verileri yüklemek için SQL komutlarını tanımlayın ve yürütün:
{% set sql %}
SELECT * FROM {{ ref('your_source_table') }}
WHERE your_conditions = true
{% endset %}
{{ adapter.execute(sql) }}
- Son olarak, dbt’nin önbelleğini güncellemek ve sorgu yürütmeyi optimize etmek için hedef ilişkiyi döndürün.
{{ return(target_relation) }}
{% endmaterialization %}
dbt modellerinizi nasıl hata ayıklarsınız? İki yol anlatın.
dbt modellerimizi hata ayıklamanın iki yolu şöyledir:
1. Hataları belirlemek ve izlemek için hedef klasördeki derlenmiş SQL dosyalarına erişin.
Bir dbt projesi çalıştırdığınızda, dbt (Jinja şablonlamayla yazılmış) modellerinizi ham SQL sorgularına derler ve bunları target dizinine kaydeder. Bu derlenmiş SQL, dbt’nin veri platformunuzda çalıştırdığı sorguların aynısıdır; bu dosyaları incelemek, sorunların nerede oluştuğunu belirlemenize yardımcı olabilir:
- dbt modellerinizi çalıştırın (örn.
dbt runveyadbt test). - dbt proje dizininizde
target/compiled/klasörüne gidin. - Hata ayıkladığınız modelin derlenmiş SQL dosyasını açın. Dosyada, Jinja makroları ve referanslardan gelen tüm dönüşümler dahil olmak üzere dbt’nin yürüttüğü ham SQL yer alır.
- Derlenmiş SQL sorgusunu kopyalayın ve veri platformunuzun SQL düzenleyicisinde (örn. Postgres, BigQuery) doğrudan çalıştırın; ayrıntılı hata iletilerini alın veya sorgunun gerçek davranışını görün.
2. Sorgu sonuçlarını doğrudan incelemek için VS Code için dbt Power User Eklentisini kullanın.
Visual Studio Code (VS Code) için dbt Power User eklentisi, dbt modellerinin hata ayıklanması için yararlı bir araçtır. Bu eklenti, sorgularınızı doğrudan IDE içinde gözden geçirip test etmenize olanak tanır; dbt, terminal ve veritabanınız arasında geçiş yapma ihtiyacını azaltır.
dbt sorguları nasıl derler?
dbt sorguları şu adımlarla derler:
- Ayrıştırma: dbt projedeki tüm SQL dosyalarını, YAML yapılandırmalarını ve makroları okur.
- Bağlam oluşturma: Her model için yapılandırmalar ve kullanılabilir makrolar dâhil bir bağlam oluşturur.
- Jinja işleme: Ardından, etiket ve ifadeleri değerlendirilen sonuçlarla değiştirmek için SQL dosyalarını Jinja şablonları olarak işler.
- SQL derleme: Her model için saf SQL sorguları üretilir.
- Artefakt oluşturma: Derlenen SQL,
target/compileddizinine kaydedilir. - Yürütmeye hazırlık:
dbt runiçin sorgular, gerekirse ek bir sarmalama ile yürütmeye hazırlanır.
Bu süreç, modüler ve şablonlanmış SQL’i veri ambarınıza özgü yürütülebilir sorgulara dönüştürür. Her model için son SQL’i görüntülemek ve hata ayıklamak üzere dbt compile kullanabilir veya target/compiled dizinine bakabiliriz.
Veri Ambarlama ve Entegrasyon Tabanlı dbt Mülakat Soruları
Çoğu veri mühendisinin işi, dbt ile veri ambarları inşa etmek ve entegre etmek etrafında döner. Bu senaryolara ilişkin sorular mülakatlarda çok yaygındır — bu yüzden en sık sorulanları derledim:
dbt’yi Airflow ile entegre etmenin üç avantajını açıklayın.
dbt’yi Airflow ile entegre etmek, düzenli bir veri hattı kurmayı sağlar. İşte bazı avantajları:
- ETL süreci: Airflow, verinin çıkarılması ve yüklenmesini yönetir; dbt’nin dönüşüm adımına odaklanmasını sağlayarak daha akıcı bir iş akışı oluşturur.
- dbt görevlerinin otomasyonu: Airflow, dbt modellerinin zamanlamasını ve yürütmesini otomatikleştirir; manuel müdahaleyi azaltır ve veri dönüşümlerinizin verimliliğini artırır.
- Paralel görev yürütme: Airflow, görevlerin paralel çalıştırılmasına izin vererek büyük veri kümelerinin performanstan ödün vermeden işlenmesini sağlar; bu da hızlı ve güvenilir veri hatlarını sürdürmeye yardımcı olur.
dbt’nin anlamsal katman (semantic layer) mimarisi nedir?
dbt’nin anlamsal katmanı, ham verileri anladığımız dile çevirmemize imkân tanır. Ayrıca metrikleri tanımlayıp bir komut satırı arayüzü (CLI) ile sorgulayabiliriz.
Bu, veri hazırlama süresi azaldığı için maliyeti optimize etmemizi sağlar. Ayrıca metrikleri kuruluş genelinde tutarlı kıldığı için herkes aynı veri tanımlarıyla çalışır.

dbt ve anlamsal katman. Görsel kaynağı: dbt
BigQuery kullanıyorsanız, dbt gereksiz bir veri dönüşüm katmanı mıdır?
BigQuery oldukça kullanışlıdır ve birçok dönüşümü yerel olarak yapabilir; yine de dbt gerekli olabilir. Nedeni şu:
- dbt, BigQuery’de yerel olarak desteklenmeyen dönüşümleri sürüm kontrolüne almanızı sağlar.
- dbt, yerleşik test çerçeveleri ve dokümantasyon üretimi sunar; bu da veri kalitesini ve anlaşılabilirliği artırır.
- dbt’nin
ref()fonksiyonu ve makroları daha modüler ve yeniden kullanılabilir SQL koduna imkân tanır. - dbt, BigQuery’de birden fazla ortamın (dev, test, prod) yönetimini kolaylaştırır.
- dbt, dönüşümler arasındaki bağımlılıkları yönetmek için bütünlüklü bir yol sağlar.
dbt veri güvenliği sağlar mı?
dbt, önceki bir soruda da görüldüğü gibi iki sürümde gelir: dbt Core ve dbt Cloud. dbt Core açık kaynaklı ve ücretsiz bir sürümdür. Bu nedenle yerleşik bir güvenlik özelliği sunmaz; dağıtım ve güvenlikten kullanıcılar sorumludur.
Buna karşılık dbt Cloud, tam güvenlik sağlamak üzere tasarlanmıştır. HIPAA ve diğer yaygın çerçevelere uygundur; böylece gizliliğin ihlal edilmemesini güvence altına alır. Dolayısıyla ihtiyaçlarımıza göre, iş uyumluluğumuza uygun bir dbt sürümü seçmeliyiz.
Büyük veri kümelerinde dbt dönüşümlerinin performansını nasıl optimize edebilirsiniz?
Özellikle Snowflake, BigQuery veya Redshift gibi bulut tabanlı veri ambarlarıyla çalışırken, büyük veri kümeleri için dbt dönüşümlerini optimize etmek performansı artırmak ve maliyeti azaltmak açısından kritiktir. İşte bazı temel teknikler:
1. Artımlı modeller kullanın
Artımlı modeller, her seferinde tüm veri kümesini yeniden işlemek yerine yalnızca yeni veya güncellenen verilerin işlenmesini sağlar. Bu, büyük veri kümeleri için çalışma sürelerini önemli ölçüde azaltabilir. Bu süreç, işlenen veri miktarını sınırlandırarak dönüşüm sürelerini hızlandırır.
2. Bölümlendirme ve kümelendirmeden yararlanın (Snowflake ve BigQuery gibi veritabanlarında)
Snowflake veya BigQuery gibi veritabanlarında büyük tabloların bölümlendirilmesi ve kümelendirilmesi, verileri verimli bir şekilde düzenleyerek ve sorgular sırasında taranan veri miktarını azaltarak sorgu performansını artırır.
Bölümlendirme, yalnızca ilgili veri kısımlarının sorgulanmasını sağlarken; kümelendirme, verinin fiziksel yerleşimini daha hızlı erişim için optimize eder.
3. Materyalizasyonları optimize edin (table, view, incremental)
Performansı optimize etmek için uygun materyalizasyonları kullanın:
- Görünümler (views) hafif dönüşümler için yararlıdır ancak ağır iş yükleri için ideal değildir.
- Tablolar veriyi fiziksel olarak depolar; performansı artırır ancak daha fazla depolama alanı kullanır.
- Artımlı modeller, düzenli güncelleme alan büyük veri kümeleri için en iyisidir.
4. Geliştirme sırasında LIMIT kullanın
Dönüşümler geliştirilirken sorgulara LIMIT eklemek, işlenen satır sayısını sınırlamak için faydalıdır. Bu, geliştirme döngülerini hızlandırır ve test sırasında devasa veri kümeleriyle çalışmayı önler.
5. Sorguları paralel çalıştırın
Veri ambarınızın sorguları paralel yürütme yeteneğinden yararlanın. Örneğin, dbt Cloud paralelliği destekler ve altyapınıza göre ayarlanabilir.
6. Veritabanına özgü optimizasyon özelliklerini kullanın
Birçok bulut veri ambarı, performans optimizasyon özellikleri sunar:
- BigQuery: Materyalize görünümler veya bölümlendirilmiş tablolar kullanın.
- Snowflake: Otomatik kümelendirmeyi etkinleştirin ve paralel yürütme için ambar ölçeklendirmesinden yararlanın.
dbt çalıştırmalarını Snowflake’te nasıl optimize edersiniz?
Snowflake’te dbt çalıştırmalarını optimize etmek için:
1. Tablo kümelendirme kullanın:
{{ config(
cluster_by = ["date_column", "category_column"]
) }}
SELECT ...
2. Paralel model yürütmesi için Snowflake’in çoklu küme ambarlarından yararlanın:
models:
my_project:
materialized: table
snowflake_warehouse: transforming_wh
3. Uygun olduğunda artımlı modeller kullanın:
{{ config(materialized='incremental', unique_key='id') }}
SELECT *
FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
Bu optimizasyonlar, Snowflake’te dbt çalıştırmalarının performansını ve maliyet etkinliğini artırabilir.
Davranışsal ve Problem Çözme Odaklı dbt Mülakat Soruları
Mülakat sürecinin sonunda, görüşmeciler genellikle problem çözme becerilerinizi test eder. Gerçek hayattaki sorunlara nasıl tepki vereceğinizi görmek için sorular sorabilirler.
Bu alanda gereken sosyal becerilere dair şu alıntıyı unutmayın from Deepak Goyal, CEO & Founder at Azurelib Academy, when he spoke on the DataFramed podcast:
Bir Veri Mühendisi olarak iletişim kurabilmelisiniz. Bir veri mühendisi, ne tür bir çıktı veya sonuç istediklerini anlamak için birçok paydaşla konuşması gerektiğinden iletişim kurmak zorundadır.
Deepak Goya, CEO & Founder at Azurelib Academy
İşte birkaç davranışsal ve problem çözme sorusu:
dbt dağıtımını birden fazla ortamda (dev, staging, production) nasıl yönetirsiniz?
dbt dağıtımını ortamlar arasında şöyle yönetebilirsiniz:
1. Ortama özgü yapılandırmalar
dbt, dbt_project.yml dosyasında her ortam (dev, staging ve production) için farklı yapılandırmalar tanımlamanıza izin verir. Şema, veritabanı ve veri ambarı yapılandırmaları gibi ayarlar ortam bazında belirtilebilir.
Örnek dbt_project.yml:
models:
my_project:
dev:
schema: dev_schema
staging:
schema: staging_schema
prod:
schema: prod_schema
Bu örnekte, projeyi çalıştırırken dbt hedef ortama (dev, staging veya prod) göre doğru şemayı otomatik olarak seçer.
2. target değişkeninin kullanımı
target değişkeni, çalıştığınız ortamı (dev, staging, production) tanımlamak için kullanılır. Bu değişkene, ortama bağlı davranış özelleştirmeleri için modellerinizde veya makrolarınızda başvurabilirsiniz.
Bir modelde örnek:
{% if target.name == 'prod' %}
SELECT * FROM production_table
{% else %}
SELECT * FROM {{ ref('staging_table') }}
{% endif %}
Bu mantık, ortama bağlı olarak farklı tablo veya şemaların kullanılmasını sağlar.
3. Dallanma ve sürüm kontrolü
Her ortamın sürüm kontrolde (örn. Git) kendi dalı olmalıdır. Geliştiriciler dev dalında çalışır, testçiler ve analistler staging kullanır ve yalnızca onaylanan değişiklikler prod dalına birleştirilir.
4. Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD)
Üretimde, modelleri dağıtmadan önce test ve doğrulamaları çalıştıran otomatik bir dağıtım hattına sahip olmak önemlidir. dbt Cloud’da, ortama göre belirli görevleri çalıştıracak iş takvimleri kurabilirsiniz. dbt Core için, bu GitHub Actions veya Jenkins gibi CI/CD araçlarıyla gerçekleştirilebilir.
Özellikle birden fazla ekip üyesiyle çalışırken, dbt’de sürüm kontrolünü nasıl yönetirsiniz?
Özellikle bir ekip ortamında aynı kod tabanına birden çok kişinin katkıda bulunduğu dbt projelerinde sürüm kontrolü kritik önemdedir. dbt’de sürüm kontrolünü şöyle yönetirim:
1. Sürüm kontrolü için Git kullanın
dbt projelerimizde birincil sürüm kontrol aracı olarak Git kullanırız. Her ekip üyesi, uyguladığı değişiklikler veya özellikler için kendi dalında çalışır. Bu, yalıtılmış geliştirmeye imkân tanır ve farklı görevler üzerinde eş zamanlı çalışan ekip üyeleri arasında çatışmaları önler.
Örnek: Yeni bir dbt modeli üzerinde çalışırken feature/customer_order_transformation gibi yeni bir özellik dalı oluştururum.
2. Dallanma stratejisi
Şu Git dallanma stratejisini izleriz:
devdalı, devam eden geliştirme ve test için kullanılır.stagingdalı, değişiklikleri üretime hazırlamak için kullanılır.mainveyaproddalı, üretim ortamına ayrılmıştır.
Ekip üyeleri değişikliklerini dev dalına iter ve kod incelemesi için çekme isteği (PR) açarlar. Değişiklikler incelenip onaylandıktan sonra staging dalına birleştirilir ve ardından production’a terfi ettirilir.
3. Sürekli entegrasyon (CI)
Her çekme isteğinde (pull request) dbt testlerini otomatik olarak çalıştıran bir CI hattı (örn. GitHub Actions, CircleCI) entegre ettik. Bu, ana dala birleştirilmeden önce yeni kodun gerekli testleri geçtiğinden emin olmamızı sağlar.
CI süreci, modelleri oluşturmak için dbt run ve veriyi doğrulamak, hataları veya tutarsızlıkları kontrol etmek için dbt test çalıştırır.
4. Birleştirme çatışmalarını çözme
Birden fazla ekip üyesi aynı modelde veya dosyada değişiklik yaptığında birleştirme çatışmaları oluşabilir. Bunu ele almak için önce koddaki çatışma işaretlerini gözden geçirir ve hangi değişikliklerin korunacağına karar veririm:
- İki değişiklik de geçerliyse, bunları yeni bir sürümde birleştiririm.
- Yalnızca bir değişiklik seti doğruysa, onu korur ve diğerini atarım.
Çatışmayı çözdükten sonra, çözümün yeni hatalar getirmediğinden emin olmak için yerelde testleri çalıştırırım. Onaylandıktan sonra çözülen değişiklikleri dala geri iterim.
5. Dokümantasyon ve iş birliği
Her birleştirme veya çekme isteğinde yapılan değişikliklerin uygun dokümantasyona sahip olmasını sağlarız. Otomatik üretilen dbt dokümantasyonunu güncelleriz; böylece ekipteki herkes yeni veya güncellenmiş modelleri net biçimde anlar.
Mevcut bir veri hattına dbt’yi nasıl uygularsınız?
dbt’yi mevcut bir hatta şöyle uygularım:
- Mevcut hattı değerlendirin: Verimsizlikleri ve dbt’nin dönüşüm süreçlerini iyileştirebileceği alanları belirleyin.
- dbt’yi kurun: dbt’yi yükleyin, yeni bir proje oluşturun ve veri ambarına bağlantıları yapılandırın.
- Dönüşümleri dönüştürün: Mevcut SQL veya dönüşüm mantığını dbt modellerine taşıyın; modülerlik ve netliği sağlayın.
- Test ve dokümantasyon ekleyin: Veri kalitesi ve şeffaflığı sağlamak için dbt’nin yerleşik test ve dokümantasyonunu uygulayın.
- Orkestrasyonla entegre edin: Airflow veya Prefect gibi mevcut araçlarla dbt çalıştırmalarını zamanlayın.
- Küçük başlayın: dbt’yi önce hattın küçük bir alt kümesinde uygulayarak değişiklikleri doğrulayın; sonra ölçekleyin.
- İzleyin ve optimize edin: Performansı sürekli izleyin ve gerektiğinde modelleri optimize edin.
Bir dbt modeli "relation does not exist" hatası nedeniyle başarısız oluyor. Bu tür bir hatayı nasıl hata ayıklarsınız?
dbt’de "relation does not exist" hatasıyla karşılaşıldığında, genellikle modelin oluşturulmamış veya yanlış yazılmış bir tabloya ya da modele başvurmaya çalıştığı anlamına gelir. Şöyle hata ayıklarım:
- Yazım hatalarını kontrol edin:
ref()fonksiyonundaki tablo veya model adının doğru yazıldığından emin olun ve doğru modelin veya tablonun referans alındığını doğrulayın.
SELECT * FROM {{ ref('orders') }} -- Ensure 'orders' is the correct model name
- Model bağımlılıklarını doğrulayın: Modeliniz diğer modellere bağlıysa, dbt DAG’ini (Directed Acyclic Graph) kontrol ederek başarısız model çalışmadan önce yukarı akıştaki modellerin başarıyla inşa edildiğinden emin olun.
- dbt’yi debug modunda çalıştırın:
dbt debugkullanın ve dbt’nin ne yapmaya çalıştığı ve neden başarısız olduğuna dair ayrıntılı bilgiler için günlükleri kontrol edin. - Veri platformu izinlerini kontrol edin: dbt’nin veri ambarında referans verilen tabloya veya modele erişmek için uygun izinlere sahip olduğundan emin olun.
- Bireysel modelleri çalıştırın: Bağımlı modelleri tek tek çalıştırmayı deneyin (örn.
dbt run --models orders) ve başarısız modelden önce bunların var olduğundan ve doğru şekilde inşa edildiğinden emin olun.
dbt Mülakatına Hazırlık İçin İpuçları
dbt, kademeli olarak gelişen yeni bir çerçevedir. Eski materyali öğrenirken yeni güncellemeleri takip etmek sizi bunaltabilir. Bu yüzden dengeli bir yaklaşım benimseyip çekirdek özelliklerle başlayın. Onlara hâkim olduktan sonra, nelerin değiştiğini anlamak için eklemeleri keşfedin.
Mülakatların, özellikle dbt gibi uzmanlaşmış bir araç için, stresli olabileceğini biliyorum. Ama endişelenmeyin — hazırlanmanıza ve kendinizi daha güvende hissetmenize yardımcı olacak bazı ipuçlarını bir araya getirdim:
dbt özelliklerine hâkim olun
Bunu yeterince vurgulayamam — modeller, testler, dokümantasyon ve bunların nasıl bir araya geldiği gibi dbt’nin temel kavramlarıyla rahat olun. Bu temellere sağlam bir şekilde hâkim olmak, teknik tartışmalarda işinize yarar.
DataCamp’in bunun için ideal bir kursu var: Introduction to dbt
DataCamp ayrıca diğer veri mühendisliği konularını derinlemesine ele alan başlangıç seviyesine uygun bazı kurslar da sunar:
- Veri mühendisliğine giriş için: Understanding Data Engineering
- Veritabanı tasarımı için: Database Design
- Veri ambarı temelleri için: Data Warehousing Concepts
- Snowflake temelleri için: Introduction to Snowflake
- Veri mimarisi için: Understanding Modern Data Architecture
- Python ile ETL ve ELT öğrenmek için: ETL and ELT in Python
dbt ile uygulamalı deneyim edinin
Bir şeyleri okumak iyidir, fakat yapmak daha iyidir. Bu, dbt becerilerinde ustalaşmanın en etkili yollarından biridir. Çevrimiçi olarak dönüşüm ve testler yapabileceğiniz çok sayıda ham veri kümesi bulabilirsiniz. Kendi dbt projenizi kurun ve farklı özelliklerle denemeler yapın. dbt’yi gerçekten kullandığınızda, hakkında konuşurken kendinizi çok daha güvende hissedeceksiniz.
Gerçek dünya örnekleri hazırlayın
Görüşmeciler pratik uygulamaları dinlemeyi sever. dbt kullanarak çözdüğünüz bir problem ya da varsayımsal bir senaryoda nasıl kullanacağınız hakkında düşünebilir misiniz? Paylaşmaya hazır birkaç örnek elinizin altında olsun. Örnek toplamak için dbt’nin resmi sitesindeki çok sayıda vaka çalışmasını inceleyebilir veya Git’teki public dbt projects üzerinden fikir edinebilirsiniz.
Sonuç
İş arama yolculuğunuzda size yardımcı olacak temel düzeyden ileri seviyeye geniş bir dbt mülakat sorusu yelpazesini ele aldık. dbt’yi bulut veri ambarlarıyla nasıl entegre edeceğinizi anlayarak, her veri entegrasyon sürecinin özü olan ileri düzey veri dönüşümü becerileriyle donanmış olacaksınız.
Bununla birlikte, dbt öğrenmek SQL ile el ele gider. SQL’e yeniyseniz, DataCamp’in SQL kurslarına göz atın.
SSS
dbt öğrenmek ne kadar sürer?
dbt becerilerine tamamen hâkim olmak birkaç ay sürebilir. Ancak her gün birkaç saat ayırırsanız, hızlıca öğrenebilirsiniz.
dbt’yi kendi başıma nasıl öğrenebilirim?
DataCamp’in kursları, YouTube eğitimleri ve blog yazıları gibi çevrimiçi kaynakları kullanabilirsiniz. Ayrıca mevcut projeleri yeniden yazarak kendi projelerinizi oluşturmaya çalışın. Bu, uygulamalı becerilerinizi güçlendirecektir.
dbt, veri mühendislerinin rolünü ortadan kaldırır mı?
Hayır, dbt veri mühendislerinin rolünü ortadan kaldırmaz. Aksine, işlerinde onlara yardımcı olur. Bu çerçeveyi dönüşümler ve testler gibi görevleri otomatikleştirmek için kullanabilirler.
Karmaşık konuları basitleştirmeyi seven bir içerik stratejistiyim. Splunk, Hackernoon ve Tiiny Host gibi şirketlerin hedef kitleleri için ilgi çekici ve bilgilendirici içerikler üretmelerine yardımcı oldum.

