Apache Iceberg, büyük veri ekosisteminde açık tablo biçimleri için hızla standart haline geldi. Veri gölleri üzerinde doğrudan ACID işlemleri, şema evrimi ve sürümleme sağlayarak Iceberg, veri gölünün esnekliği ile veri ambarının güvenilirliği arasındaki boşluğu kapatır. Ancak, Iceberg'e başlamak, dahil edilen çeşitli bileşenler ve bağımlılıklar nedeniyle karmaşık olabilir.
Bu rehber, Apache Iceberg'i Apache Spark kullanarak nasıl kurup yapılandıracağınız konusunda orta ve ileri düzey geliştiriciler için kapsamlı bir yol gösterici sunar. Iceberg tablolarını işlemek için en yaygın motorlardan biri olan Spark ile çalışacağız. Ön gereksinimleri, bağımlılık kurulumunu ve ilk tablonuzu oluşturma adımlarını ele alacağız.
Ön Gereksinimler ve Ortam Kurulumu
Kurulumun detaylarına girmeden önce, ortamınızın aşağıdaki gereksinimleri karşıladığından emin olun:
- JDK 1.8 veya üzeri: Iceberg Java 8+ destekler, ancak performans için Java 11 veya 17 önerilir.
- Apache Spark 3.x: Bu örnekte, Iceberg ile daha iyi yerel entegrasyona sahip olduğu için Spark 3.3+ kullanacağız.
- Uygun Bir Dosya Sistemi: Geliştirme için yerel dosya sistemi veya üretim için S3/GCS/HDFS.
- Maven veya Gradle: Java/Scala projesinde bağımlılıkları yönetmek için.
Iceberg Bağımlılıklarını Ekleme
Iceberg kurulumundaki ilk adım, projenize gerekli kütüphaneleri eklemektir. Iceberg modülerdir, bu nedenle çekirdek kütüphaneye ve belirli motor entegrasyon kütüphanesine (bu durumda Spark) ihtiyacınız vardır.
Aşağıda Maven için pom.xml parçası yer almaktadır. 1.2.0 sürümüne dikkat edin; en son kararlı sürüm için resmi sürüm sayfasını kontrol etmelisiniz.
<dependency>
<groupId>org.apache.iceberg</groupId>
<artifactId>iceberg-core</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.iceberg</groupId>
<artifactId>iceberg-spark-runtime-3.3_2.12</artifactId>
<version>1.2.0</version>
</dependency>
Gölgelendirme (Shading) Hakkında Önemli Not: iceberg-spark-runtime artefaktı gölgelenmiştir (shaded), bu da mevcut Spark kütüphanelerinizle çakışmaları önlemek için dahili bağımlılıkları yeniden paketlediği anlamına gelir. Bu, Spark uygulamaları için önerilen yaklaşımdır.
Spark Oturumunu Yapılandırma
Bağımlılıklar eklendikten sonra, Iceberg kataloğunu tanıması için Spark oturumunu yapılandırmanız gerekir. Iceberg, hive, jdbc, rest ve hadoop dahil olmak üzere birden fazla kataloğu destekler. Basitlik ve yerel testler için, metadata'yi dosya sisteminin kendisinde saklayan HadoopCatalog'u kullanacağız.
Spark oturumunu yapılandırmak için bir Scala örneği aşağıdadır:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.execution.datasources.v2.V2SessionCatalog
val spark = SparkSession.builder()
.appName("IcebergInstallationGuide")
.master("local[*]")
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
.config("spark.sql.catalog.iceberg", "org.apache.iceberg.spark.SparkCatalog")
.config("spark.sql.catalog.iceberg.type", "hadoop")
.config("spark.sql.catalog.iceberg.warehouse", "/tmp/iceberg-warehouse")
.getOrCreate()
Temel yapılandırmaların açıklaması:
spark.sql.extensions: Iceberg'e özgü SQL uzantılarını kaydeder.spark.sql.catalog.iceberg: "iceberg" adlı adlandırılmış bir katalog tanımlar.spark.sql.catalog.iceberg.type: Katalog uygulamasını belirtir.hadoop, yerel geliştirme için en kolayıdır. Üretim içinhiveveyarestkullanın.spark.sql.catalog.iceberg.warehouse: Tablo verilerinin ve metadata'ın saklanacağı kök dizin.
İlk Iceberg Tablonuzu Oluşturma ve Sorgulama
Katalog yapılandırıldıktan sonra artık bir Iceberg tablosu oluşturabilirsiniz. analytics adlı bir isim alanında user_events adında basit bir tablo oluşturalım.
import org.apache.spark.sql.functions._
// Create namespace
spark.sql("CREATE NAMESPACE IF NOT EXISTS iceberg.analytics")
// Create table
spark.sql("""
CREATE TABLE IF NOT EXISTS iceberg.analytics.user_events (
id INT,
name STRING,
action STRING,
timestamp TIMESTAMP
)
USING ICEBERG
""")
// Insert sample data
val data = spark.createDataFrame(Seq(
(1, "Alice", "login", "2023-10-27 10:00:00".toTimestamp),
(2, "Bob", "purchase", "2023-10-27 10:05:00".toTimestamp)
)).toDF("id", "name", "action", "timestamp")
data.writeTo("iceberg.analytics.user_events").append()
// Query the table
spark.sql("SELECT * FROM iceberg.analytics.user_events").show()
Doğrulama ve En İyi Uygulamalar
Yukarıdaki kodu çalıştırdıktan sonra, örnek verilerin konsolda yazdırıldığını görmelisiniz. Kurulumun başarılı olduğunu doğrulamak için /tmp/iceberg-warehouse/analytics/user_events konumundaki dosya sistemini kontrol edin. Veri, metadata ve anlık görüntü (snapshot) için dizinler görmelisiniz.
Üretim İçin En İyi Uygulamalar:
- Bir Meta Store Kullanın:
hadoopkataloğu testler için uygun olsa da, üretimde çoklu motor desteği ve metadata yönetimi için Hive Metastore veya bir REST kataloğu kullanın. - Commit Sıklığı: Iceberg commit'leri maliyetli olabilir. Oluşturulan anlık görüntü sayısını azaltmak için yazmalarınızı toplu halde (batch) yapın.
- Anlık Görüntü Sonlanma Süresi: Depolama maliyetlerini yönetmek için anlık görüntü sonlanma politikaları yapılandırın. Eski anlık görüntüler, açıkça kaldırılana kadar disk alanı tüketir.
Sonuç
Apache Iceberg'i kurmak, katalog sistemini ve bağımlılık yönetimini anladığınızda basit bir süreçtir. Gölgelenmiş çalışma zamanı artefaktlarından yararlanarak ve Spark oturumunu doğru şekilde yapılandırarak, mevcut veri gölünüz üzerinde güvenilir, ACID uyumlu veri boru hatları oluşturmayı hızla başlatabilirsiniz. Üretime geçiş yaptığınızda, eşzamanlı erişim ve merkezi metadata yönetimi gibi gelişmiş özelliklerin kilidini açmak için Hadoop kataloğundan Hive veya REST kataloğuna geçmeyi düşünün.