Vebende Akademi - apache-spark-explained
Uzmanla Konuşun
Blog
MAKALE

Apache Spark Explained — Mühendisler için Derinlemesine Rehber

Yayınlayan: Vebende Akademi  |  Okuma süresi: ~60–140 dk

Apache Spark Explained — Mühendisler için Derinlemesine Rehber

Yayınlayan: Vebende Akademi  |  Okuma süresi: ~60–140 dk

1. GİRİŞ

Apache Spark, dağıtık veri işleme alanında yüksek performanslı, esnek ve geniş kabul görmüş bir çerçevedir. Batch ve stream (Structured Streaming) iş yüklerini aynı API ile çalıştırma yeteneği, DataFrame/SQL odaklı programlama modeli ve zengin ekosistemi Spark'ı veri mühendisleri ve veri bilimciler için standart bir araç haline getirdi. Bu rehber mühendis perspektifiyle Spark'ın temel mimarisini, çalışma mantığını, performans davranışlarını ve üretime alma pratiklerini derinlemesine inceler.

Bu neden bugün önemli?

Veri hacimleri, model karmaşıklığı ve gerçek zamanlı işleme ihtiyaçları arttıkça, maliyet‑etkin ve gecikme odaklı çözümler önem kazanıyor. Spark; büyük veri batched processing, ETL, feature engineering ve ölçeklenebilir model eğitimi gibi iş yükleri için güçlü bir seçenek sunuyor. Ayrıca veri platformları lakehouse mimarileriyle Spark'ı yoğun şekilde kullanıyor.

Kimler için önemli?

Veri mühendisleri, platform mühendisleri, MLOps mühendisleri, veri bilimciler ve sistem mimarları Spark'ın iç işleyişini anlamalıdır; doğru kaynak planlaması, tuning ve DAG optimizasyonu üretim başarısını belirler.

Hangi problemleri çözüyor?

  • Büyük veri setlerinde paralel işlem ve toplu transformasyon
  • SQL tabanlı analitik ve ETL süreçlerinin ölçeklenmesi
  • Streaming ve batch iş yüklerinin tek çatı altında çalıştırılması

2. KAVRAMSAL TEMELLER

2.1 Temel bileşenler ve terminoloji

  • Driver: Uygulama koordinatörü; SparkContext/Session üzerinden DAG oluşturur ve cluster ile iletişimi yönetir.
  • Executor: Worker node üzerinde çalışan JVM süreçleri; görevleri (tasks) çalıştırır ve veri depolar (memory/disk).
  • Task: Bir partition üzerinde çalıştırılan en küçük iş birimi.
  • Stage: Shuffle boundary'leri ile ayrılan task grupları; DAG scheduler tarafından oluşturulur.
  • Job: Driver tarafından submit edilen bir aksiyonun tüm iş akışı; bir veya daha fazla stage içerir.
  • RDD / DataFrame / Dataset: RDD düşük seviyeli immutable collection; DataFrame/ Dataset üst seviyede optimizasyon ve Catalyst ile sorgu planlama sağlar.
  • Catalyst Optimizer: Spark SQL için sorgu optimizasyonu; logical→physical plan dönüşümlerini yönetir.
  • Tungsten: Bellek ve CPU verimliliği için Spark'ın fiziksel yürütme optimizasyon katmanı (off‑heap, binary processing).

2.2 Mimari ve çalışma modelleri

Spark, driver‑executor modelinde çalışır. Driver, kullanıcı kodunu analiz edip DAG üretir; DAG scheduler stage'leri planlar ve task'ları cluster manager (YARN/Kubernetes/Standalone/ Mesos) aracılığıyla executor'lara verir. Executor'lar veriyi işlerken shuffle, join ve aggregation gibi maliyetli operasyonlarda disk I/O ve network'e başvurur.

3. NASIL ÇALIŞIR?

3.1 DAG, Stage ve Task'ların oluşumu

Bir transformasyon zinciri (örn. map→filter→groupBy→agg→write) logical plan oluşturur. Catalyst ile logical optimizasyon sonrası physical plan elde edilir ve plan shuffle boundary'lerine göre stage'lere bölünür. Her stage birçok parallel task içerir; task'lar partition bazlı çalışır. Stage'ler arası veri transferi shuffle ile yapılır; shuffle büyük maliyet kaynağıdır.

3.2 Shuffle mekanizması ve maliyeti

Shuffle, reducer tarafında veriyi yeniden partitionlayıp join/aggregation gibi opsiyonları mümkün kılar. Spark shuffle sırasında maptask çıktısını spill edip local disk'e yazar; reducer'lar bu parçaları fetch eder. Shuffle heavy I/O, network ve disk kullanımına neden olur — partitioning stratejisi, map‑side combiners ve reduceByKey gibi API seçimleri shuffle maliyetini etkiler.

3.3 Bellek yönetimi ve Tungsten

Spark'ın belleği JVM heap ve off‑heap (Tungsten) olarak yönetilebilir. executor memory ayrımı `spark.executor.memory` ve `spark.memory.fraction` gibi ayarla yapılandırılır. Joins ve aggregations memory‑intensive olduğundan spill (disk fallback) davranışı kritik önemdedir. Tungsten ile binary format ve cache optimizasyonları sayesinde CPU ve GC yükü azaltılır.

3.4 DataFrame/Dataset avantajları

DataFrame API, sorgu planlama ve optimizasyon sayesinde RDD'lere göre daha yüksek performans sunar. Catalyst optimizer reordering, predicate pushdown ve projection pruning gibi optimizasyonlar uygular. Ayrıca kodda tip güvenliği için Dataset kullanılabilir; ancak serialization overhead dikkatle değerlendirilmelidir.

4. GERÇEK DÜNYA KULLANIMLARI

4.1 Netflix — ETL ve öneri sistemleri

Netflix gibi platformlar Spark'ı geniş kapsamlı ETL, feature engineering ve offline model eğitimleri için kullanır. Günlük batch job'ları, feature precomputation ve büyük ölçekli join/aggregation işleri Spark üzerinde yürütülür.

4.2 Uber — Batch + Streaming entegrasyonu

Uber, Spark Structured Streaming ile batch iş akışlarını stream tabanlı işlemlerle entegre eder; state management, watermarking ve exactly‑once semantics gibi konular produksiya önem taşır.

4.3 Finans ve telekom — büyük veri analitiği

Yüksek hacimli işlem kayıtları ve telemetri için Spark, toplu analiz, risk hesaplamaları ve raporlama iş akışlarında tercih edilir. DataFrame SQL performansı büyük sorgularda kritik avantaj sağlar.

5. AVANTAJLAR VE SINIRLAMALAR

Avantajlar

  • Genel amaçlı veri işleme: Batch ve stream aynı API ile işlenebilir.
  • Optimizasyon katmanları: Catalyst ve Tungsten performans kazanımları sağlar.
  • Zengin ekosistem: MLlib, GraphX, Structured Streaming ve birçok connector.

Sınırlamalar

  • Shuffle maliyeti: Büyük shuffles I/O ve network darboğazı yaratır.
  • GC ve bellek yönetimi: JVM temelli olması GC tuning ihtiyacını doğurur.
  • Small files problemi: Çok küçük Parquet dosyaları performansı bozar; compaction gereklidir.

6. ALTERNATİFLER VE KARŞILAŞTIRMA

Aşağıdaki tablo Spark'ı diğer yaklaşımlarla karşılaştırır:

TeknolojiAvantajDezavantaj
Apache SparkBatch+Streaming, optimizasyon, geniş ekosistemShuffle maliyeti, JVM GC tuning
FlinkStreaming-first, düşük latency state handlingBatch performansı için ek ayar gerekebilir
Presto/TrinoAd‑hoc SQL sorgularında düşük latencyETL/complex transformations için sınırlı
MapReduceBasit, deterministikGecikme yüksek, verim düşük

7. EN İYİ PRATİKLER

Production kullanımı

  • Partitioning stratejilerini iş sorgularına göre tasarlayın; skew'u minimize edin.
  • Shuffle‑heavy job'ları map‑side aggregation (combine) ile azaltın.
  • Şema ve Parquet/ORC snapshot'larını kullanarak projection ve predicate pushdown'dan faydalanın.

Performans optimizasyonu

  • Executor memory ve cores dengesini test ederek ayarlayın; small‑task overhead'ini azaltın.
  • Broadcast join'leri küçük taraflı tablolar için kullanın; büyük join'ler için doğru partition key seçin.
  • Adaptive Query Execution (AQE) ve dynamic partition pruning gibi Spark özelliklerini kullanın.

Güvenlik ve veri yönetimi

  • Encryption, access control ve audit log ile veriyi koruyun.
  • Data lineage ve reproducibility için job metadata, run id ve output checksums saklayın.

8. SIK YAPILAN HATALAR

  • Small files oluşturarak filesystem ve query performansını kötüleştirmek.
  • Yetersiz shuffle optimizasyonu — groupByKey gibi pahalı API'lerin bilinçsiz kullanımı.
  • Local mode veya düşük kaynaklı test ortamlarında tuning sonuçlarını doğrudan prod'a taşımak.
  • Yetersiz monitoring: executor memory, task timeouts ve shuffle spill metriklerini izlememek.

9. GELECEK TRENDLER

9.1 Lakehouse entegrasyonu

Spark, Delta Lake/Hudi gibi lakehouse teknolojileriyle tight entegrasyon sağlayarak ACID işlemler, zaman yolculuğu ve daha iyi performans sunuyor; bu trend artarak devam edecek.

9.2 Native Python ve Arrow optimizasyonları

PySpark performansı için Apache Arrow entegrasyonu ve Pandas API uyumlulukları gelişecek; Python kullanıcıları daha az serialization overhead ile yüksek performans alacak.

9.3 Serverless Spark ve resource abstraction

Serverless Spark çözümleri (autoscaling executors, serverless runtime) operasyonel yükü azaltacak; kaynak optimizasyonu ve iş izolasyonu gelişecek.

EK BÖLÜMLER

Sık Sorulan Sorular (FAQ)

  1. Spark ve Hadoop MapReduce arasındaki temel fark nedir?

    Spark bellek‑bazlı işlemler ve DAG scheduler sayesinde MapReduce'a göre çok daha hızlıdır; MapReduce daha basit ve deterministiktir ama gecikmesi yüksektir.

  2. Adaptive Query Execution nedir?

    AQE, çalışma zamanında planı optimal hale getiren bir mekanizmadır; shuffle bölmelerini yeniden düzenleme ve join stratejilerini dinamik değiştirme yeteneği vardır.

  3. Small files sorunu nasıl çözülür?

    Compaction job'ları, write batching ve uygun partitioning ile küçük dosya sayısını azaltın.

  4. Structured Streaming ile exactly‑once nasıl sağlanır?

    Sink'in transactional veya idempotent write desteklemesi ve checkpointing mekanizmalarının doğru yapılandırılması gerekir.

  5. PySpark ile performans nasıl artırılır?

    Arrow ile serileştirme, UDF yerine built‑in fonksiyonlar, vectorized UDF'ler ve broadcast join kullanımı önerilir.

  6. Executor sayısı mı yoksa her executor için core sayısı mı önemli?

    Task paralelliği ve overhead dengesine göre; genelde daha fazla küçük executor core'ları (örn. 1–3 core) task throughput'u optimize edebilir, ancak test edilmelidir.

  7. Shuffle spill'leri nasıl azaltırım?

    Bellek ayarlarını, partitioning ve map‑side aggregation'ı optimize ederek spill'leri azaltabilirsiniz.

  8. Spark job'larında en kritik metrikler hangileri?

    Task duration, shuffle read/write bytes, GC time, memory spills, executor CPU ve disk I/O metrikleri kritik önemdedir.

Anahtar Kavramlar

RDD
Immutable dağıtık koleksiyon; düşük seviyeli API.
DataFrame
Columnar, optimize edilebilir yapı; Catalyst ile sorgu optimizasyonu sağlar.
Shuffle
Stage'ler arası veri redistribusyonu; I/O ve network maliyeti getirir.
Tungsten
Bellek ve CPU optimizasyonları sağlayan fiziksel yürütme katmanı.

Öğrenme Yol Haritası

  1. 0–1 ay: Spark temel kavramları, Spark Shell/ PySpark ile küçük örnekler.
  2. 1–3 ay: DataFrame API, Parquet, partitioning, basit ETL job'ları ve local cluster deneyimi.
  3. 3–6 ay: Performance tuning, shuffle optimizasyonu, AQE ve broadcast join kullanımı.
  4. 6–12 ay: Structured Streaming, state management, checkpointing ve production deployment (Kubernetes/YARN/EMR).
  5. 12+ ay: Lakehouse entegrasyonu, serverless Spark, büyük ölçekli optimizasyon ve MLOps/feature engineering süreçleri.