Veri Bilimi Okulu

Apache Spark'ta Maven Coordinates
Apache Spark’ta Maven Coordinates
maven_koordinates_kapak_960x640

Loading

Apache Spark Scala ile yazılmış ama çoğunluk python ile kullanıyor. Ancak ana dilin, Scala, dünyasından tamamen kopamıyorsunuz. Harici paketler, yani maven repository, yani maven koordinatları (maven coordinates). İlk bakışta anlamsız bir kod gibi göründüğünden itici olabiliyor. Özellikle yeni başlayanlar için tam bir çile. Çünkü doğru koordinatı seçemezsen kafka ile konuşamıyorsun mesela. İşte bu yazı maven koordinatları hakkında sizleri aydınlatmayı hedefliyor.

Maven Coordinates Nedir? Neden Önemli?

Maven coordinates tam olarak nedir? Bir kütüphaneniz var ve milyonlarca kitap arasından tam istediğinizi bulmanız gerekiyor. İşte Maven coordinates, yazılım dünyasındaki bu kütüphane sistemi gibi çalışıyor [1].

Maven coordinates, bir yazılım paketini benzersiz şekilde tanımlayan üç temel bileşenden oluşuyor:

  1. groupId (Grup Kimliği): Projenin hangi organizasyona ait olduğunu gösterir
  2. artifactId (Artefakt Kimliği): Paketin kendisinin adı
  3. version (Versiyon): Hangi sürümü kullandığınız

Basitçe söylemek gerekirse: groupId:artifactId:version formatında bir üçlü.

Apache Spark ve Maven Coordinates Hikayesi

Şimdi gelelim işin Spark tarafına! Apache Spark, büyük veri işleme için kullanılan muazzam bir framework (çatı). Spark’ı kullanırken, gerçek dünyada çoğunlukla dış kaynaklarla entegrasyon için Maven coordinates’e ihtiyaç duyuyoruz.

Örneğin:

  • Kafka ile streaming (akış) verileri okumak
  • Apache Iceberg veya Delta Lake gibi modern tablo formatlarıyla çalışmak
  • PostgreSQL, MySQL gibi veritabanlarına bağlanmak
  • S3, Azure Blob Storage gibi cloud storage’lara erişmek

İşte bu noktada Maven coordinates devreye giriyor!

Spark’ın groupId’si: org.apache.spark

Apache Spark projelerinin hepsi org.apache.spark groupId’sine sahip. Bu mantıklı değil mi? Çünkü tersine domain adı kuralını takip ediyoruz [1]. Apache’nin domain’i apache.org, tersine çevirince org.apache, sonuna spark ekleyince org.apache.spark oluyor!

artifactId: İşte Burada İşler Karışıyor!

Burası biraz dikkat gerektiren kısım arkadaşlar. Spark’ın artifactId’leri şöyle görünüyor: spark-core_2.12 veya spark-sql_2.13.

“Ne bu alt çizgiden sonraki sayılar?” diye sorabilirsiniz. İşte burada Scala versiyonu devreye giriyor! Apache Spark, Scala diliyle yazılmış. Ve Scala’nın önemli bir özelliği var: farklı major versiyonları arasında binary uyumluluk (binary compatibility) yok [2]!

Yani:

  • spark-core_2.11 → Scala 2.11 ile derlenmiş
  • spark-core_2.12 → Scala 2.12 ile derlenmiş
  • spark-core_2.13 → Scala 2.13 ile derlenmiş

Spark ve Scala Versiyon Uyumluluğu

Şimdi öğreneceğimiz çok önemli bir konu: Her Spark versiyonu, belirli Scala versiyonlarını destekliyor [3]:

  • Spark 2.x serisi: Genellikle Scala 2.11 ile gelir
  • Spark 2.4.x: Scala 2.11 ve 2.12’yi destekler (2.12 deneysel)
  • Spark 3.x serisi: Varsayılan olarak Scala 2.12 ile gelir
  • Spark 3.2+: Scala 2.13 desteği de eklenmiş

İşte bir gerçek: Scala 2.11 ile derlenmiş bir jar dosyasını Scala 2.12 cluster’da çalıştıramazsınız! Bu yüzden Maven coordinates’i doğru seçmek hayati önem taşıyor.

Pratik Örnekler: Göreceğiz ve Öğreneceğiz! 💡

Örnek 1: Kafka ile Streaming – Real-Time Veri İşleme

Kafka, gerçek zamanlı veri akışları için en popüler platformlardan biri. Spark’ı Kafka ile entegre etmek için şu Maven coordinates’i kullanıyoruz:

PySpark ile:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("KafkaExample") \
    .config("spark.jars.packages", 
            "org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0") \
    .getOrCreate()

# Kafka'dan okuma
df = spark.readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "my-topic") \
    .load()

spark-submit ile:

./bin/spark-submit \
    --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0 \
    myapp.py

Dikkat! spark-sql-kafka-0-10 artifact’ı hem streaming hem de batch Kafka okuma/yazma için kullanılır. Versiyon numarasını Spark versiyonunuzla eşleştirmeyi unutmayın! Yuarıdaki kodla Spark 3.5.0 scala 2.12 ile kafka 0.10 ve üzeri sürümlerle entegre oldunuz demektir.

Örnek 2: Apache Iceberg – Modern Data Lake Format

Apache Iceberg, büyük analytics tabloları için modern bir tablo formatı [4]. Netflix, Apple gibi şirketler kullanıyor.

PySpark ile:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("IcebergExample") \
    .config("spark.jars.packages", 
            "org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.0") \
    .config("spark.sql.extensions", 
            "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtension") \
    .config("spark.sql.catalog.spark_catalog", 
            "org.apache.spark.sql.SparkCatalog") \
    .config("spark.sql.catalog.spark_catalog.type", "hive") \
    .getOrCreate()

# Iceberg tablosu okuma
df = spark.read.format("iceberg").load("db.table")

Önemli: Iceberg için Spark versiyonuyla uyumlu runtime artifact’ını seçmelisiniz. iceberg-spark-runtime-3.5_2.12 → Spark 3.5 ve Scala 2.12 için.

Örnek 3: Delta Lake – ACID Transactions for Data Lakes

PySpark ile:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("DeltaExample") \
    .config("spark.jars.packages", "io.delta:delta-spark_2.13:4.0.0") \
    .config("spark.sql.extensions", 
            "io.delta.sql.DeltaSparkSessionExtension") \
    .config("spark.sql.catalog.spark_catalog", 
            "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
    .getOrCreate()

# Delta tablosu yazma
data = spark.range(0, 5)
data.write.format("delta").save("/tmp/delta-table")

# Delta tablosu okuma
df = spark.read.format("delta").load("/tmp/delta-table")

Not: Delta Lake’in groupId’si io.delta, Apache Spark’tan farklı!

Örnek 4: PostgreSQL ve MySQL – JDBC Bağlantıları

Veritabanlarına bağlanmak için JDBC driver’ları Maven coordinates ile ekliyoruz [6]:

PySpark’ta PostgreSQL kullanımı:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("PostgreSQLExample") \
    .config("spark.jars.packages", "org.postgresql:postgresql:42.2.19") \
    .getOrCreate()

# PostgreSQL'den okuma
df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://localhost:5432/mydb") \
    .option("dbtable", "users") \
    .option("user", "postgres") \
    .option("password", "secret") \
    .option("driver", "org.postgresql.Driver") \
    .load()

df.show()

# PostgreSQL'e yazma
df.write \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://localhost:5432/mydb") \
    .option("dbtable", "users_backup") \
    .option("user", "postgres") \
    .option("password", "secret") \
    .option("driver", "org.postgresql.Driver") \
    .mode("overwrite") \
    .save()

Örnek 5: Birden Fazla Dependency – Virgülle Ayırma

Gerçek projelerde birden fazla dependency’e ihtiyaç duyabiliriz:

./bin/spark-submit \
    --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0,\
org.postgresql:postgresql:42.2.19,\
org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.0 \
    myapp.py

Dikkat: Virgüller arasında boşluk olmamalı!

PySpark’ta:

spark = SparkSession.builder \
    .config("spark.jars.packages", 
            "org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0,"
            "org.postgresql:postgresql:42.2.19,"
            "org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.0") \
    .getOrCreate()

Version Numaraları: Semantic Versioning

Maven, Semantic Versioning (Anlamsal Sürümleme) kullanır: MAJOR.MINOR.PATCH

  • MAJOR: Geriye dönük uyumluluğu bozan değişiklikler
  • MINOR: Geriye dönük uyumlu yeni özellikler
  • PATCH: Geriye dönük uyumlu hata düzeltmeleri

Örnek: 3.5.7 → Major: 3, Minor: 5, Patch: 7

SNAPSHOT Versiyonları: Maven’de -SNAPSHOT versiyonları vardır [1]. Bunlar kararsız (unstable), development versiyonlarıdır. Production’da kullanmayın! Örneğin: 3.5.8-SNAPSHOT.

Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler ⚠️

1. Scala Versiyonu Uyumsuzluğu

En yaygın hata: Cluster’ınız Scala 2.11 kullanıyor ama siz _2.12 artifact’ı indiriyorsunuz. Bu ClassNotFoundException ve benzeri hatalar verir!

Hatalı:

--packages org.apache.spark:spark-sql-kafka-0-10_2.13:3.5.0
# Cluster Scala 2.12 kullanıyor ama biz 2.13 istiyoruz!

Doğru:

--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0

Çözüm: Cluster’ınızın hangi Scala versiyonunu kullandığını kontrol edin ve ona göre artifact seçin.

2. Yanlış Maven Coordinate Formatı

Maven coordinates, tam olarak groupId:artifactId:version formatında olmalı. Jar dosya yolu DEĞIL!

Hatalı:

.config("spark.jars.packages", "/path/to/delta-core_2.12-1.0.0.jar")

Doğru:

.config("spark.jars.packages", "io.delta:delta-core_2.12:1.0.0")

3. spark.jars vs spark.jars.packages Karışıklığı

İki farklı konfigürasyon var:

  • spark.jars.packages: Maven coordinates kullanır, otomatik dependency resolution yapar, bağımlılıkları da indirir
  • spark.jars: Jar dosya yolu kullanır, transitive dependencies çözmez

Genellikle spark.jars.packages kullanın – daha pratik!

4. Driver Sınıfını Belirtmeyi Unutmak

JDBC bağlantılarında driver class’ı belirtmelisiniz:

.option("driver", "org.postgresql.Driver")  # PostgreSQL için
.option("driver", "com.mysql.cj.jdbc.Driver")  # MySQL için

5. Çok Fazla Bağımlılık Eklemek

Her Spark modülü, kendi bağımlılıklarını da getiriyor. spark-sql eklediğinizde, spark-core otomatik gelir. Gereksiz yere her şeyi eklemeyin, jar dosyanız şişmesin!

6. Network/Proxy Sorunları

Kurumsal ağlarda Maven Central’a erişim engellenebilir.

Çözümler:

  • Proxy ayarları yapın (HTTP_PROXY, HTTPS_PROXY environment variables)
  • Jar’ları local repository’ye manuel indirin
  • Internal Maven repository kullanın
  • spark.jars ile önceden indirilmiş jar’ları kullanın

7. Versiyon Uyumsuzlukları

Spark versiyonunuzla uyumlu connector versiyonunu seçin:

Spark VersiyonuKafka ConnectorIcebergDelta Lake
3.5.xspark-sql-kafka-0-10_2.12:3.5.xiceberg-spark-runtime-3.5_2.12delta-spark_2.13:4.0.0
3.4.xspark-sql-kafka-0-10_2.12:3.4.xiceberg-spark-runtime-3.4_2.12delta-spark_2.13:3.2.0
3.3.xspark-sql-kafka-0-10_2.12:3.3.xiceberg-spark-runtime-3.3_2.12delta-core_2.12:2.4.0

Maven Central ve Spark Packages

Spark ile çalışırken iki önemli kaynak var:

  1. Maven Central (https://mvnrepository.com): Resmi Maven repository’si
  2. Spark Packages (spark-packages.org): Spark için özel topluluk paketleri

Databricks gibi platformlarda, bu paketleri arayüz üzerinden kolayca ekleyebiliyorsunuz. Maven coordinate girip “Create Library” diyorsunuz, otomatik iniyor!

İpuçları ve En İyi Pratikler 🎯

1. Doğru Versiyonu Seçin

Cluster’ınızın Spark ve Scala versiyonuna uygun artifact’ları seçin. Uyumsuzluk = baş ağrısı!

2. MVNRepository.com’u Kullanın

Hangi versiyonların mevcut olduğunu görmek için https://mvnrepository.com kullanın. Arama yapın, doğru coordinates’i kopyalayın.

3. Test Edin

Yeni bir versiyon kullanmadan önce, development ortamında test edin. Production’da sürprizler istemiyoruz!

4. Dependency Conflicts’ten Kaçının

Farklı kütüphaneler farklı Spark versiyonları isteyebilir. maven-dependency-plugin ile kontrol edin.

5. Provided Scope Kullanın

Spark cluster’ınızda zaten Spark kütüphaneleri var. Maven’de <scope>provided</scope> kullanın:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>3.5.7</version>
    <scope>provided</scope>
</dependency>

6. Local Test için spark-submit Kullanın

Koordinatlarınızı test etmek için:

spark-submit \
    --packages org.postgresql:postgresql:42.2.19 \
    --master local[*] \
    test_script.py

7. Dokümantasyonu Takip Edin

Her connector’ın kendi dokümantasyonu var:

  • Kafka: https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html
  • Iceberg: https://iceberg.apache.org/
  • Delta Lake: https://docs.delta.io/

Güncel Kalın: Spark 4.x ve Gelecek

Spark ekosistemi sürekli gelişiyor. Spark 4.0 Eylül 2025’te yayınlandı [7]. Yeni versiyonlar çıktıkça, Maven coordinates’leri de güncelleniyor.

Önemli değişiklikler:

  • Spark 4.0, Scala 2.13’ü varsayılan olarak kullanıyor
  • Yeni connector’lar ve format’lar ekleniyor
  • Performans iyileştirmeleri

Resmi Spark dokümantasyonunu ve release notes’ları takip etmeyi unutmayın!

Sonuç

Maven coordinates konusunun sonuna geldik. Toparlamak gerekirse;

✅ Maven coordinates’lerin ne olduğunu biliyoruz
✅ Apache Spark’ta nasıl kullanıldığını öğrendik
✅ Kafka, Iceberg, Delta Lake, veritabanları ile entegrasyon yapabiliyoruz
✅ Scala versiyon uyumluluğunun önemini kavradık
✅ Pratik örneklerle deneme yaptık
✅ Yaygın hataları ve çözümlerini gördük

Unutmayın: Doğru Maven coordinates kullanmak, uygulamanın çalışabilmesi için kritik! Spark versiyonunuzu kontrol edin, doğru Scala versiyonunu seçin, dependency’lerinizi test edin ve her zaman dokümantasyonu takip edin. Yapay zekalar doğru koordinatları bulma konusunda çok becerikli değiller saatlerinizi yiyebilir size bir süre deneme yanılma yaptırabilir. Söylemesi benden, dinlemesi sizden 🙂

Kaynaklar

[1] Apache Maven. “Guide to Naming Conventions on Maven Coordinates.” https://maven.apache.org/guides/mini/guide-naming-conventions.html

[2] Stack Overflow. “Scala/Spark Version Compatibility Matrix.” https://stackoverflow.com/questions/43883325/scala-spark-version-compatibility

[3] Spark By Examples. “Spark PySpark Versions Supportability Matrix.” https://sparkbyexamples.com/spark/spark-versions-supportability-matrix/

[4] Apache Iceberg. “Official Releases and Maven Coordinates.” https://iceberg.apache.org/releases/

[5] Delta Lake Documentation. “Quick Start Guide with Maven Setup.” https://docs.delta.io/latest/quick-start.html

[6] Apache Spark Documentation. “JDBC To Other Databases Integration Guide.” https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

[7] Apache Spark. “MLlib and Latest Releases.” https://spark.apache.org/mllib/

[8] Databricks Blog. “Using 3rd Party Libraries: Apache Spark Packages and Maven.” https://www.databricks.com/blog/2015/07/28/using-3rd-party-libraries-in-databricks-apache-spark-packages-and-maven-libraries.html

[9] Maven Repository. “Apache Spark Artifacts Central Repository.” https://mvnrepository.com/artifact/org.apache.spark

[10] Stack Overflow. “PySpark Programmatically Adding Maven JAR Coordinates.” https://stackoverflow.com/questions/54227744/pyspark-2-x-programmatically-adding-maven-jar-coordinates-to-spark

[11] Kapak Görseli: Photo by GeoJango Maps on Unsplash

0

Bir yanıt yazın

Password Requirements:

  • At least 8 characters
  • At least 1 lowercase letter
  • At least 1 uppercase letter
  • At least 1 numerical number
  • At least 1 special character