Modül 8 · Toplu İşleme (Batch) · ⏱ 7 dk

Spark nedir? Pizzacı ekibi analojisi

What is Spark

Bu derste neler öğreneceksin

  • Spark ın dağıtık yapısını açıklar
  • RDD vs DataFrame farkını bilir
  • PySpark + DuckDB karşılaştırması yapar

Pizza Günü: 500 Sipariş Birden!

Elif’in limonatası o kadar meşhur oldu ki artık okuldaki herkes biliyor. Ama bir gün okulun pansiyonunda pizza gecesi var. 500 öğrenci aynı anda pizza istiyor. Elif tek başına yapamaz. Bir pizzacı ekibi kurması lazım.

İşte bugün öğreneceğimiz Spark, tam olarak bu: tek başına yapamayacağın işi, bir ekiple birlikte yapmak.

Spark Nedir?

Spark, büyük veriyi hızlı işlemek için yapılmış bir ekip çalışma aracı. Normalde Python’da bir tablo üzerinde işlem yaparsın, bilgisayarın tek başına çalışır. Ama ya milyonlarca satır varsa? Tek bilgisayar çok yavaş kalır.

Spark diyor ki: “Verini parçalara böl, birkaç bilgisayara (ya da bir bilgisayarın birkaç çekirdeğine) dağıt, her biri kendi parçasını işlesin, sonra sonuçları birleştirelim.” Buna dağıtık hesaplama deniyor.

Bir pizzacı düşün: tek bir aşçı 500 pizza yapamaz. Ama 10 aşçı, her biri 50 pizza — olur biter!

Pizzacı Ekibi Analojisi

Şimdi Spark’ı bir pizzacı ekibine benzetelim:

  • Sipariş listesi (veri): 500 pizzalık sipariş kağıdı.
  • Şef (driver/master): Patron. İşi parçalara böler, aşçılara verir.
  • Aşçılar (executors/workers): Asıl pizzayı yapanlar.
  • Hamur tezgahı (cluster): Mutfak. Birden çok tezgah olabilir (birden çok bilgisayar).

Şef patron sipariş listesini alır: “Aşçı 1, sen 1-50’yi yap. Aşçı 2, sen 51-100’ü yap…” Herkes kendi bölümünü bitirir, sonra şef hepsini servis tepsisine dizer.

Spark’ta buna paralel işleme denir. Bir iş tek bir aşçıya değil, birçok aşçıya aynı anda verilir.

RDD vs DataFrame: Eski Usul ve Yeni Usul

Spark’ta veriyi temsil etmenin iki yolu var:

RDD (Eski Usul)

RDD = Resilient Distributed Dataset. Dayanıklı Dağıtılmış Veri Seti. Çok uzun isim!

RDD’de sen veriye adım adım, fonksiyonla işlem yaparsın. Örneğin:

# RDD ile: her satıra ayrı ayrı fonksiyon yaz
siparisler = sc.parallelize([("margherita", 50), ("sucuklu", 70), ("mozzarella", 60)])
ucuz = siparisler.filter(lambda x: x[1] < 65)
print(ucuz.collect())

Çıktı: [('margherita', 50), ('mozzarella', 60)]

Düşün: aşçıya “şunu yap, bunu yap” diye tek tek tarif vermek gibi. Çok esnek ama yorucu.

DataFrame (Yeni Usul)

DataFrame, bildiğimiz tablo. Sütunlar var, satırlar var. SQL benzeri komutlarla çalışırsın:

# DataFrame ile: SQL gibi yaz, Spark optimize etsin
df = spark.createDataFrame(
    [("margherita", 50), ("sucuklu", 70), ("mozzarella", 60)],
    ["pizza", "fiyat"]
)
df.filter(df.fiyat < 65).show()

Çıktı:

+---------+-----+
|    pizza|fiyat|
+---------+-----+
|margherita|   50|
|mozzarella|  60|
+---------+-----+

DataFrame neden daha iyi? Çünkü Spark senin için “akıllı plan” yapar. Hangi aşçıya hangi pizzayı verse daha hızlı olur, kendisi hesaplar. RDD’de bunu sen düşünürsün.

Kural: Bugün yeni proje yazıyorsan DataFrame kullan. RDD eski usul, 2026’da çoğu yerde öğretilmiyor (sadece eski kodu okumak için bilmek lazım).

PySpark ve DuckDB: Aynı Pizza, Farklı Mutfak

Spark’ı Python’dan kullanıyorsan buna PySpark deniyor. Tıpkı SQL’i Python’dan kullanmak gibi.

Bir de DuckDB var. DuckDB de büyük veriyi hızlı işler ama tek bir bilgisayarda çalışır, ekip kurmaz. Bir nevi “evde tek başına pişen pizza” — Spark ise “lokanta mutfağında 10 kişilik ekip”.

PySparkDuckDB
Çalışma yeriBirçok bilgisayarTek bilgisayar
Ne zaman seçilirVeri bir bilgisayara sığmıyorVeri 10-100 GB arası
Hız (küçük veri)Yavaş (ekip kurma maliyeti)Çok hızlı
Hız (çok büyük veri)Çok hızlıYetersiz
Öğrenme zorluğuOrtaKolay

Çocuklar için kural: Verin laptopuna sığıyorsa DuckDB ile başla. Sığmıyorsa Spark’a geç. Çoğu zaman DuckDB yeter!

Minik Bir PySpark Örneği

Aşçı ekibinin nasıl çalıştığını görmek için 1 milyon satırlık sahte sipariş üretelim:

from pyspark.sql import SparkSession

# Şef patronu çağır
spark = SparkSession.builder.appName("pizza-ekibi").getOrCreate()

# 1 milyon satırlık sipariş üret
import random
random.seed(42)
siparisler = [(f"pizza_{i}", random.choice(["kucuk", "orta", "buyuk"]), random.randint(50, 200))
              for i in range(1_000_000)]
df = spark.createDataFrame(siparisler, ["isim", "boy", "fiyat"])

# Hangi boydan kaç tane satılmış?
df.groupBy("boy").count().show()

Çıktı:

+-----+------+
|  boy| count|
+-----+------+
| kucuk|333234|
| orta|333668|
|buyuk|333098|
+-----+------+

Tek groupBy çağrısıyla Spark, veriyi parçalara böldü, her parçayı ayrı aşçıya saydırdı, sonuçları birleştirdi. Normal Python’da bu 10-30 saniye sürerdi, Spark 1-2 saniyede bitirir.

Özet

Bugün öğrendik:

  • Spark, büyük veriyi dağıtık işleyen bir ekip aracı.
  • Pizzacı ekibi benzetmesi: şef iş bölüştürür, aşçılar paralel pişirir.
  • RDD eski usul, DataFrame yeni usul — yeni kodda DataFrame seç.
  • PySpark Python’dan Spark kullanmak; DuckDB tek bilgisayarda hızlı alternatif.
  • Çoğu çocuk projesi için DuckDB yeterli, Spark’a terfi şart değil.

Küçük Ödev

  1. Yukarıdaki PySpark örneğini kendi bilgisayarında çalıştır (önce pip install pyspark).
  2. groupBy("boy") yerine groupBy("boy").avg("fiyat") yaz. Her boyun ortalama fiyatı ne?
  3. Bir cümle yaz: “Pizza ekibinde şef patron rolü nedir?”

Sıradaki

Spark’ı öğrendin. Şimdi DataFrame ile gerçek bir batch iş yazıyoruz →