Databricks kullanım rehberi
2025 · 30 dakika okuma · Databricks Community Edition ile başlayabilirsin
Veri mühendisliği, veri bilimi ve makine öğrenmesi — genellikle üç farklı araç, üç farklı ekip, birbiriyle konuşmayan üç pipeline. Databricks bu üçünü tek bir platformda toplamak için kuruldu.
Bu rehberde Databricks'i sıfırdan kavrayacak, Delta Lake'i ve Medallion mimarisini anlayacak, PySpark ile veri işleyecek, MLflow ile deney takip edecek ve maliyet tuzaklarından kaçınacaksın.
Databricks nedir?
Databricks, Apache Spark'ın yaratıcıları tarafından kurulan bir şirketin geliştirdiği birleşik analitik platformu. Altta Spark çalışır, ama Databricks onun üzerine şunları ekler:
- Delta Lake — ACID işlemler destekleyen açık formatlı depolama katmanı
- Photon Engine — SQL sorgularını hızlandıran C++ tabanlı vectorized execution engine
- Unity Catalog — merkezi veri yönetimi ve erişim kontrolü
- MLflow — model deneyi takibi ve deployment
- Notebooks — Python, SQL, Scala, R desteği tek arayüzde
AWS (EMR), Azure (Synapse) veya GCP (Dataproc) ile de Spark kullanabilirsin — ama Databricks bunların üzerinde çalışan, yönetilen ve optimize edilmiş bir katman sunar. Fiyat farkı vardır; karşılığında ciddi operasyonel kolaylık alırsın.
Lakehouse mimarisi
Geleneksel yaklaşımda Data Warehouse (yapılandırılmış, pahalı, esnek değil) ile Data Lake (ham, ucuz, ama yönetilmesi zor) arasında seçim yapılırdı. Lakehouse, ikisinin güçlü yanlarını birleştiriyor: Data Lake'in düşük maliyetli depolaması + Data Warehouse'un ACID işlemleri ve performansı.
Katmanlara tıklayarak ne içerdiğini görebilirsin. Temel fikir: her şey açık formatta (Delta Lake → Parquet + transaction log) depolanıyor, farklı motorlar aynı veriyi okuyabiliyor.
İlk adımlar: Community Edition
Databricks'i denemek için kredi kartı gerekmez. Community Edition ücretsiz, sınırlı ama öğrenmek için yeterli.
# 1. community.cloud.databricks.com adresine git # 2. Hesap oluştur (Google ile giriş yapabilirsin) # 3. Compute → Create Cluster # Runtime: 14.3 LTS (Scala 2.12, Spark 3.5.0) # Node Type: Community Edition otomatik seçer # 4. Cluster başlaması ~3-5 dakika sürer # 5. New → Notebook → Python seç # 6. Hazırsın! # İlk test — Spark çalışıyor mu? spark.version
Community Edition'da cluster başlattıktan 2 saat sonra otomatik kapanır. Çalışmanı kaybet memek için DBFS'e veya GitHub'a düzenli commit yap.
Cluster türleri
Databricks'te hangi cluster'ı ne zaman kullanacağını bilmek hem doğru sonuç hem de düşük maliyet için kritik.
# Cluster yapılandırması — Terraform ile Infrastructure as Code
resource "databricks_cluster" "etl_cluster" {
cluster_name = "etl-prod"
spark_version = "14.3.x-scala2.12"
node_type_id = "m5d.2xlarge" # AWS
autoscale {
min_workers = 2
max_workers = 10 # iş yüküne göre scale
}
auto_termination_minutes = 30 # 30 dk boşta → kapat
aws_attributes {
availability = "SPOT_WITH_FALLBACK" # önce spot, yoksa on-demand
first_on_demand = 1 # driver always on-demand
spot_bid_price_percent = 80
}
spark_conf = {
"spark.databricks.delta.optimizeWrite.enabled" = "true"
"spark.databricks.delta.autoCompact.enabled" = "true"
}
}Notebook temelleri
Databricks Notebook'lar Jupyter'a benzer ama Spark entegrasyonu hazır gelir. spark ve dbutilsnesneleri her notebook'ta otomatik tanımlıdır.
# spark: SparkSession otomatik tanımlı
df = spark.read.format("csv") .option("header", "true") .option("inferSchema", "true") .load("/databricks-datasets/airlines/")
df.printSchema()
display(df.limit(10)) # Databricks'e özel güzel tablo görünümü
# dbutils: dosya sistemi, gizli anahtarlar, widget'lar
dbutils.fs.ls("/databricks-datasets/")
dbutils.secrets.get(scope="prod", key="api_key")
# Magic komutlar
# %sql → SQL hücresi
# %md → Markdown
# %sh → Shell komutu
# %pip → Paket yükle
# %run → Başka notebook çalıştır%sql -- Aynı notebook'ta SQL SELECT origin, COUNT(*) as ucus_sayisi FROM airlines GROUP BY origin ORDER BY ucus_sayisi DESC LIMIT 20
Delta Lake
Delta Lake, Databricks'in kalbindeki depolama formatı. Parquet'ın üzerine bir transaction log (_delta_log/) ekler — bu sayede ACID garantisi, time travel ve schema evolution kazanırsın.
# Delta tablosu oluştur — Python
df.write.format("delta") .mode("overwrite") .partitionBy("siparis_yili", "siparis_ayi") .save("/delta/siparisler")
# Veya Spark SQL
CREATE TABLE IF NOT EXISTS siparisler
USING DELTA
PARTITIONED BY (siparis_yili, siparis_ayi)
AS SELECT * FROM json.'/landing/siparisler/';
# Tabloya kaydet
spark.sql("""
CREATE TABLE IF NOT EXISTS siparisler
LOCATION '/delta/siparisler'
""")
# Tablo özelliklerini gör
DESCRIBE DETAIL siparisler;
-- numFiles, sizeInBytes, partitionColumns, minWriterVersion...Medallion mimarisi
Databricks'te veri katmanlandırması için endüstri standardı yaklaşım. Her katmanın kendi amacı, dönüşüm mantığı ve kalite beklentisi vardır.
# Bronze → Silver dönüşümü örneği
from pyspark.sql import functions as F
from pyspark.sql.types import TimestampType
# Bronze: ham JSON verisi
bronze_df = spark.read.format("delta").load("/delta/bronze/siparisler")
# Silver: temizle, doğrula, normalize et
silver_df = (
bronze_df
# Duplikat temizle (aynı sipariş_id tekrar işlendiyse)
.dropDuplicates(["siparis_id"])
# NULL kritik alanları filtrele
.filter(F.col("musteri_id").isNotNull())
.filter(F.col("tutar") > 0)
# Tip dönüşümleri
.withColumn("siparis_tarihi", F.to_timestamp("siparis_tarihi_str"))
.withColumn("tutar", F.col("tutar").cast("double"))
# Derived columns
.withColumn("siparis_yili", F.year("siparis_tarihi"))
.withColumn("siparis_ayi", F.month("siparis_tarihi"))
# İşlenme metadata
.withColumn("_silver_ts", F.current_timestamp())
.drop("siparis_tarihi_str") # ham string artık gereksiz
)
silver_df.write.format("delta") .mode("overwrite") .option("overwriteSchema", "true") .partitionBy("siparis_yili", "siparis_ayi") .save("/delta/silver/siparisler")# Silver → Gold: iş metriklerini hazırla
gold_df = (
spark.read.format("delta").load("/delta/silver/siparisler")
.join(
spark.read.format("delta").load("/delta/silver/musteriler"),
on="musteri_id", how="left"
)
.groupBy("musteri_id", "musteri_segmenti", "siparis_yili", "siparis_ayi")
.agg(
F.count("siparis_id").alias("siparis_sayisi"),
F.sum("tutar").alias("toplam_tutar"),
F.avg("tutar").alias("ort_tutar"),
F.countDistinct("urun_id").alias("benzersiz_urun"),
)
)
gold_df.write.format("delta") .mode("overwrite") .save("/delta/gold/musteri_aylik_ozet")PySpark ile veri işleme
Databricks'te PySpark, Pandas'tan daha yaygın — çünkü milyarlarca satırı dağıtık işleyebilir. Temel dönüşümler Pandas'a benzer ama lazy evaluation ile çalışır: collect() veya display()çağırılana kadar hiçbir şey gerçekten işlenmez.
from pyspark.sql import functions as F, Window
df = spark.read.format("delta").load("/delta/silver/siparisler")
# ─── Temel dönüşümler ────────────────────────────────
df.select("musteri_id", "tutar", "siparis_tarihi")
df.filter(F.col("tutar") > 100)
df.withColumn("kdvli_tutar", F.col("tutar") * 1.20)
df.groupBy("musteri_id").agg(F.sum("tutar").alias("toplam"))
df.orderBy(F.col("tutar").desc())
# ─── Window fonksiyonlar ─────────────────────────────
w = Window.partitionBy("musteri_id").orderBy("siparis_tarihi")
df.withColumn("onceki_siparis", F.lag("tutar", 1).over(w)) .withColumn("kumulatif_tutar", F.sum("tutar").over(w)) .withColumn("siparis_no", F.row_number().over(w))
# ─── Pandas API (küçük veri) ─────────────────────────
# Spark 3.2+ ile Pandas API doğrudan kullanılabilir
import pyspark.pandas as ps
psdf = ps.read_delta("/delta/silver/siparisler")
psdf.describe() # Pandas sözdizimiyle!
# ─── UDF (User Defined Function) ─────────────────────
from pyspark.sql.types import StringType
@F.udf(returnType=StringType())
def segment_belirle(tutar):
if tutar is None: return "bilinmiyor"
if tutar > 10000: return "premium"
if tutar > 1000: return "standart"
return "basic"
df.withColumn("segment", segment_belirle(F.col("tutar")))Python UDF'ler Spark'ın JVM'ini her satır için terk ettiğinden yavaştır. Mümkünse built-in
pyspark.sql.functionskullan. Mecbur kalırsan Pandas UDF (@F.pandas_udf) kullan — çok daha hızlı.
Structured Streaming
Databricks'in en güçlü özelliklerinden biri: aynı PySpark kodu hem batch hem streaming için çalışır. Kafka, Kinesis, Event Hub veya Delta tablosunu kaynak olarak kullanabilirsin.
# Kafka'dan gerçek zamanlı okuma
stream_df = (
spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "broker:9092")
.option("subscribe", "siparis-olaylari")
.option("startingOffsets", "latest")
.load()
)
# JSON parse et
from pyspark.sql.types import StructType, StructField, StringType, DoubleType
siparis_schema = StructType([
StructField("siparis_id", StringType()),
StructField("musteri_id", StringType()),
StructField("tutar", DoubleType()),
])
parsed_df = stream_df.select(
F.from_json(F.col("value").cast("string"), siparis_schema).alias("data")
).select("data.*")
# Delta tablosuna yaz — continuous micro-batch
query = (
parsed_df.writeStream
.format("delta")
.outputMode("append")
.option("checkpointLocation", "/delta/checkpoints/siparisler")
.trigger(processingTime="30 seconds") # her 30 sn'de bir işle
.start("/delta/bronze/siparisler")
)
# Aktif stream'leri izle
spark.streams.activeDatabricks SQL
SQL tabanlı analistler için Databricks SQL ayrı bir arayüz sunar — SQL Warehouse üzerinde sorgu çalıştır, dashboard kur, alert tanımla. BI araçlarına (Tableau, Power BI, Superset) JDBC/ODBC ile bağlanır.
-- Unity Catalog ile tam yolu belirt: katalog.şema.tablo
USE CATALOG prod_catalog;
USE SCHEMA gold;
-- Performanslı sorgu — partition pruning için tarih filtresi
SELECT
musteri_segmenti,
siparis_yili,
siparis_ayi,
SUM(toplam_tutar) AS aylik_ciro,
AVG(ort_tutar) AS ort_sepet,
SUM(siparis_sayisi) AS siparis_adedi
FROM musteri_aylik_ozet
WHERE siparis_yili = 2024
GROUP BY ALL
ORDER BY siparis_yili, siparis_ayi, aylik_ciro DESC;
-- Canlı tablo (Materialized View gibi)
CREATE OR REPLACE LIVE TABLE gunluk_ciro
AS
SELECT
DATE(siparis_tarihi) AS gun,
SUM(tutar) AS gunluk_ciro
FROM LIVE.silver_siparisler
GROUP BY 1;MLflow entegrasyonu
Databricks'te MLflow otomatik entegre gelir — hiçbir kurulum gerekmez. Her deneyi, metriği, parametreyi ve modeli kayıt altına alır.
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score, accuracy_score
mlflow.set_experiment("/Users/ali@sirket.com/churn-modeli")
with mlflow.start_run(run_name="rf-baseline"):
# Parametreler
params = {"n_estimators": 200, "max_depth": 8, "random_state": 42}
mlflow.log_params(params)
# Model eğit
model = RandomForestClassifier(**params)
model.fit(X_train, y_train)
# Metrikler
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
mlflow.log_metric("accuracy", accuracy_score(y_test, y_pred))
mlflow.log_metric("roc_auc", roc_auc_score(y_test, y_prob))
mlflow.log_metric("train_size", len(X_train))
# Modeli kaydet
mlflow.sklearn.log_model(
model,
artifact_path="model",
registered_model_name="churn-rf",
input_example=X_train.iloc[:3],
)
# Ekstra artifact (feature importance grafiği vb.)
mlflow.log_artifact("feature_importance.png")# Model Registry ile deployment
from mlflow.tracking import MlflowClient
client = MlflowClient()
# Modeli Staging'e al
client.transition_model_version_stage(
name="churn-rf",
version=3,
stage="Staging",
)
# Production'a al
client.transition_model_version_stage(
name="churn-rf",
version=3,
stage="Production",
)
# Production modelini yükle ve kullan
model_uri = "models:/churn-rf/Production"
loaded_model = mlflow.sklearn.load_model(model_uri)
predictions = loaded_model.predict(new_data)Jobs & Workflows
Manuel çalıştırma production'a gitmez. Jobs ile notebook veya Python script'ini zamanlayabilir, birden fazla task'ı zincirlere bağlayabilirsin.
# Databricks Asset Bundle ile job tanımla (databricks.yml)
bundle:
name: veri-pipeline
resources:
jobs:
gunluk_etl:
name: "Günlük ETL — Medallion Pipeline"
schedule:
quartz_cron_expression: "0 0 3 * * ?" # her gün 03:00
timezone_id: "Europe/Istanbul"
pause_status: UNPAUSED
tasks:
- task_key: bronze_yukle
notebook_task:
notebook_path: /Repos/main/notebooks/01_bronze
job_cluster_key: etl_cluster
timeout_seconds: 3600
- task_key: silver_temizle
depends_on:
- task_key: bronze_yukle
notebook_task:
notebook_path: /Repos/main/notebooks/02_silver
job_cluster_key: etl_cluster
- task_key: gold_aggregate
depends_on:
- task_key: silver_temizle
notebook_task:
notebook_path: /Repos/main/notebooks/03_gold
job_cluster_key: etl_cluster
job_clusters:
- job_cluster_key: etl_cluster
new_cluster:
spark_version: "14.3.x-scala2.12"
node_type_id: "m5d.xlarge"
num_workers: 4
aws_attributes:
availability: SPOT_WITH_FALLBACKUnity Catalog
Unity Catalog, tüm Databricks workspace'larında merkezi veri yönetimi sağlar: erişim kontrolü, veri lineage, audit log. 3 katmanlı isim alanı:katalog.şema.tablo
-- Katalog yapısı
-- prod_catalog
-- ├── bronze
-- │ ├── siparisler
-- │ └── musteriler
-- ├── silver
-- │ ├── siparisler
-- │ └── musteriler
-- └── gold
-- └── musteri_aylik_ozet
-- Tabloya erişim ver
GRANT SELECT ON TABLE prod_catalog.gold.musteri_aylik_ozet
TO analist_grubu;
-- Sütun bazlı maskeleme (hassas veri)
CREATE OR REPLACE FUNCTION mask_email(email STRING)
RETURNS STRING
RETURN CASE
WHEN IS_MEMBER('admin') THEN email
ELSE CONCAT(LEFT(email, 2), '***@***.com')
END;
ALTER TABLE musteriler
ALTER COLUMN email
SET MASK mask_email;
-- Veri lineage — hangi tablo nereden geliyor?
-- Databricks UI'da otomatik görünür
-- API ile de çekilebilir:
-- GET /api/2.0/lineage-tracking/column-lineage/getMaliyet optimizasyonu
Databricks DBU (Databricks Unit) bazlı fiyatlandırır. Yanlış yapılandırılmış bir cluster aylık faturayı 10x artırabilir.
# Akıllı partition stratejisi
# Kötü: çok küçük partitionlar (< 128 MB) → overhead
# Kötü: çok büyük partitionlar (> 1 GB) → parallelism yok
# İdeal: 128MB - 512MB arası partition
df.repartition(200) # shuffle repartition
df.coalesce(50) # azalt (shuffle yok)
# Partition sayısını otomatik ayarla
spark.conf.set(
"spark.sql.adaptive.enabled", "true" # AQE açık olsun
)
spark.conf.set(
"spark.sql.adaptive.coalescePartitions.enabled", "true"
)
# Delta'da küçük dosya birleştirme — auto-optimize
spark.conf.set(
"spark.databricks.delta.optimizeWrite.enabled", "true"
)
spark.conf.set(
"spark.databricks.delta.autoCompact.enabled", "true"
)Databricks vs Alternatifler
| Databricks | AWS EMR | Google Dataproc | Azure Synapse | |
|---|---|---|---|---|
| Spark Yönetimi | ✅ Tam yönetilen | ⚠️ Kısmen | ⚠️ Kısmen | ⚠️ Kısmen |
| Delta Lake | ✅ Nativ | ⚠️ Ekstra kur | ⚠️ Ekstra kur | ⚠️ Ekstra kur |
| MLflow | ✅ Entegre | ❌ Manuel | ❌ Manuel | ❌ Manuel |
| Notebook | ✅ Gelişmiş | ⚠️ JupyterHub | ⚠️ Jupyter | ⚠️ Synapse NB |
| Fiyat | 💰💰💰 | 💰💰 | 💰💰 | 💰💰 |
| Multi-cloud | ✅ AWS/Azure/GCP | ❌ Sadece AWS | ❌ Sadece GCP | ❌ Sadece Azure |
Başlangıç için pratik yol haritası
- 1. Hafta:Community Edition kurulumu, ilk notebook, DBFS'e dosya yükleme, temel PySpark dönüşümleri (
filter,groupBy,join). - 2. Hafta: Delta Lake oluşturma, Time Travel dene, OPTIMIZE çalıştır. Küçük bir Bronze→Silver pipeline yaz.
- 3. Hafta: MLflow ile bir sklearn modelini kaydet. Job oluştur, schedule ayarla, notifkasyon kur.
- 4. Hafta: Medallion mimarisini tam kur: 3 katman, gerçek veriyle. Unity Catalog izinlerini ayarla.
Databricks'i öğrenmek için en iyi kaynak: Databricks Academy. Ücretsiz online kursları var — Data Engineering with Databricks ile başla. Associate sınavı (~200$) endüstride geçer akçe.
Bu rehber temel akışı kapsar. Daha ileri konular: Delta Live Tables (DLT) ile deklaratif pipeline, Databricks Feature Store, Model Serving endpoint'leri ve Lakehouse Monitoring.