Episode ini menyajikan penerapan nyata Spark: pipeline ETL, real-time analytics, dan recommendation systems, design patterns untuk reliabilitas pipeline, monitoring business metrics dan data quality, serta arsitektur end-to-end yang menggabungkan batch dan streaming.

Setelah 19 episode teori dan praktik, episode 20 ini menyatukan semuanya: bagaimana Spark dipakai untuk menyelesaikan masalah bisnis nyata. Tiga use case besar akan dibedah — ETL, real-time analytics, dan recommendation systems — ditambah pola arsitektur yang membuat pipeline tetap andal.
Ini adalah episode yang menghubungkan keterampilan teknis dengan nilai bisnis. Kode yang benar itu penting, tapi yang lebih penting adalah kode yang menyelesaikan masalah — dan masalah yang dipilih dengan baik akan menentukan kualitas seluruh data platform.
Episode ini membahas empat topik: pipeline ETL, real-time analytics, recommendation systems, design patterns untuk reliabilitas, dan arsitektur end-to-end batch plus streaming.
Contoh paling umum: tarik data dari database transaksional setiap malam, bersihkan, transformasi, dan tulis ke data lake untuk analitik:
from pyspark.sql import functions as F
orders = spark.read \
.format("jdbc") \
.option("url", os.environ["DB_URL"]) \
.option("dbtable", "orders") \
.option("partitionColumn", "id") \
.option("lowerBound", 0) \
.option("upperBound", 1000000) \
.option("numPartitions", 8) \
.load()
bersih = orders.filter(F.col("amount").isNotNull()) \
.withColumn("order_date", F.to_date("created_at")) \
.repartition(4, "order_date")
bersih.write \
.mode("overwrite") \
.partitionBy("order_date") \
.parquet("s3a://datalake/orders")Pola di atas memakai partitioning di sisi pembacaan (partitionColumn) dan di sisi penulisan (partitionBy) — keduanya menjaga query database tidak overload dan file data lake tetap terorganisir.
Untuk ETL batch, pastikan setiap run menghasilkan hasil yang sama tanpa bergantung pada run sebelumnya:
mode("overwrite") untuk partisi yang dihitung ulang penuh.Real-time analytics menjawab pertanyaan seperti "berapa klik dalam 5 menit terakhir" atau "konversi per channel sekarang". Arsitekturnya: event masuk ke Kafka, Spark mengagregasi dengan window, hasil masuk ke sink cepat:
from pyspark.sql import functions as F
events = spark.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "localhost:9092") \
.option("subscribe", "clicks") \
.load() \
.select(F.from_json(F.col("value").cast("string"),
F.schema_of_json('{"halaman":"/","waktu":"2026-08-10T10:00:00Z"}')).alias("d")) \
.select("d.*")
metrik = events \
.withWatermark("waktu", "2 minutes") \
.groupBy(F.window("waktu", "1 minute"), "halaman") \
.count()
metrik.writeStream \
.outputMode("update") \
.format("console") \
.start() \
.awaitTermination()Pipeline ini bisa diarahkan ke sink berkecepatan tinggi seperti Cassandra, Redis, atau Kafka lain yang memberi makan dashboard. Latensi total dari event sampai dashboard biasanya dalam hitungan detik.
Pilih trigger dan sink sesuai kebutuhan: processingTime("5 seconds") cukup untuk dashboard; untuk kebutuhan near-real-time yang lebih ketat, pertimbangkan engine seperti Flink. Spark memenangkan kasus ini ketika tim butuh satu engine untuk batch dan stream sekaligus.
Sistem rekomendasi memakai data interaksi pengguna-produk untuk memprediksi preferensi. Dengan ALS dari episode 11, pipeline lengkapnya:
from pyspark.ml.recommendation import ALS
from pyspark.ml.evaluation import RegressionEvaluator
(train, test) = interaksi.randomSplit([0.8, 0.2], seed=42)
als = ALS(userCol="user_id", itemCol="produk_id", ratingCol="rating",
coldStartStrategy="drop")
model = als.fit(train)
prediksi = model.transform(test)
evaluator = RegressionEvaluator(
metricName="rmse", labelCol="rating", predictionCol="prediction")
print("RMSE:", evaluator.evaluate(prediksi))
rekomendasi = model.recommendForAllUsers(10)recommendForAllUsers(10) menghasilkan 10 rekomendasi per pengguna. Hasilnya bisa ditulis ke cache untuk disajikan API rekomendasi, atau di-recompute setiap malam dengan ETL batch.
Rekomendasi produksi biasanya menggabungkan beberapa sinyal: popularitas, kategori, dan filter toksisitas. Spark memberi fleksibilitas untuk menggabungkan skor ALS dengan logika bisnis lain dalam satu pipeline sebelum menulis hasil akhir.
Beberapa design pattern yang menjaga pipeline tetap andal:
ingest → validasi awal → transform → validasi akhir → publish → alert jika gagalReliabilitas tidak lengkap tanpa pengamatan:
Tip
Mulai dari business metric, bukan technical metric. "Berapa transaksi masuk hari ini" lebih berguna daripada "berapa partisi terproses" — tapi keduanya saling melengkapi: metrik teknis menjelaskan mengapa metrik bisnis berubah.
Arsitektur yang menggabungkan batch dan streaming dengan satu engine:
Kafka/DB → ingestion → Spark (stream) → lakehouse (Delta/Iceberg)
↓
Spark (batch) → warehouse → BI & MLPola ini sering disebut lambda architecture dalam bentuk ringan: aliran real-time menyediakan data segar, batch menjaga akurasi dan data lengkap, dan lakehouse menjadi titik temu keduanya. Spark menjadi engine tunggal untuk keduanya.
Episode 20 menunjukkan Spark dalam aksi nyata: ETL menghubungkan database dengan data lake, real-time analytics menyajikan metrik segar, recommendation systems memakai MLlib end-to-end, design patterns menjaga reliabilitas, dan arsitektur batch-plus-streaming memanfaatkan Spark sebagai satu platform.
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita akan membahas ekosistem dan resources — tooling seperti Delta Lake, Iceberg, Hudi, dan Spark SQL Gateway, managed Spark services seperti Databricks, AWS EMR, dan GCP Dataproc, library dan extensions seperti GraphX dan Pandas API on Spark, serta sumber belajar komunitas dan dokumentasi resmi.