๐Ÿš€ Optimasi Apache Spark: Memangkas Runtime Job Raksasa 7TB


Tanggal Berita: 9 Desember 2025

Guna Chandra Durgapu membagikan studi kasus teknis tentang bagaimana timnya merekayasa ulang pipeline data 7TB untuk mencapai target "1-day planning", memangkas waktu eksekusi job terberat dari 35 jam menjadi jauh lebih singkat.

๐Ÿšง Problem Statement: Mimpi Buruk Partisi 1.9 GB
Tantangan utamanya adalah mengejar tenggat waktu eksekusi total di bawah 24 jam untuk 19 rencana pemrosesan data. Namun, satu job ETL kritis saja memakan waktu 35 jam.

๐ŸŒ Inefisiensi Partisi & Disk Spills Akar masalah ditemukan di Spark UI: job tersebut membaca 400 part-files yang masing-masing berukuran 1.9 GB. Dalam Spark, 1 partisi dipetakan ke 1 core. Memaksa satu core memproses 1.9 GB data menyebabkan memori eksekutor jebol, memicu disk spill (data tumpah ke disk yang lambat), dan akhirnya crash OOM (Out Of Memory).

๐Ÿ›‘ Straggler Tasks & Idle Executors Selain itu, terjadi fenomena "Straggler Task" di mana 4.799 task selesai dalam 2 menit, tapi 1 task lambat (akibat data skew) berjalan selama 45 menit, menahan seluruh kluster. Konfigurasi alokasi statis juga membuat ribuan core menganggur (idle) saat tidak dipakai, membuang biaya komputasi.

๐Ÿ› ๏ธ Solusi: Bedah Jantung Arsitektur Spark
Tim melakukan rekayasa ulang holistik yang menyentuh level data, kode, dan konfigurasi kluster.

โœ‚๏ธ Repartitioning Strategis Alih-alih membiarkan partisi raksasa, mereka melakukan repartition data menjadi 3.200 file kecil (300-500 MB). Ini memungkinkan ribuan task berjalan paralel tanpa membebani memori per core.

๐Ÿ’พ Manajemen DAG & Caching Masalah komputasi ulang (re-computation) diatasi dengan persist() dan checkpoint(). Ini memutus garis keturunan (lineage) DAG yang terlalu panjangโ€”yang sering menyebabkan driver meledakโ€”dan menyimpan hasil komputasi mahal ke disk agar tidak perlu diulang.

๐Ÿง  Adaptive Query Execution (AQE) Mengaktifkan fitur "autopilot" Spark: spark.sql.adaptive.enabled. AQE secara otomatis mendeteksi data skew saat runtime dan memecah partisi yang miring menjadi sub-partisi kecil, secara efektif membunuh straggler tasks.

๐Ÿš€ Optimasi Shuffle & Memori Mengganti serializer default Java dengan Kryo (lebih cepat & ringkas) serta kompresi Snappy. Mereka juga mengaktifkan Off-Heap Memory (Project Tungsten) untuk memindahkan data shuffle keluar dari JVM, mengurangi drastis kejadian Stop-the-World GC pauses.

โšก Findings: Mencapai Target 24 Jam
Hasil dari serangkaian operasi bedah ini sangat signifikan.

๐Ÿ“‰ Runtime Terpangkas Waktu eksekusi keseluruhan berkurang sebesar 36%. Target jendela waktu pemrosesan 20-22 jam berhasil dicapai, jauh di bawah batas 24 jam.

๐Ÿ’Ž Efisiensi Sumber Daya Dengan beralih ke Dynamic Allocation, kluster hanya menggunakan sumber daya saat dibutuhkan. Stabilitas job meningkat drastis karena disk spills dan GC pauses berhasil dihilangkan.

โš™๏ธ How to Use: Panduan Tuning Anda
Jangan biarkan Spark berjalan dengan konfigurasi default untuk data besar. Ikuti langkah teknis berikut:

๐Ÿงฎ Hitung Partisi Optimal Gunakan rumus: Max(Total_Input_MB / 128, Total_Cores * 3). Pastikan ukuran partisi Anda berkisar di 128MB (untuk HDD) agar seimbang antara parallelism dan overhead.

โšก Aktifkan Konfigurasi Kunci Pastikan setelan ini ada di spark-submit Anda:

1๏ธโƒฃspark.sql.adaptive.enabled=true (Wajib untuk Spark 3.x)
2๏ธโƒฃspark.serializer=org.apache.spark.serializer.KryoSerializer
3๏ธโƒฃspark.memory.offHeap.enabled=true

๐Ÿ—๏ธ Gunakan Kolumnar Selalu gunakan format penyimpanan kolumnar seperti Parquet atau ORC daripada JSON/CSV. Ini memungkinkan fitur column pruning dan predicate pushdown bekerja maksimal.

๐Ÿ—๏ธ Key Takeaways
๐Ÿงฑ Partisi adalah Raja Performa Spark sangat bergantung pada bagaimana Anda membagi data. File input yang terlalu besar (1GB+) adalah pembunuh performa nomor satu.

๐Ÿค– Percayakan pada AQE Fitur Adaptive Query Execution bukan sekadar hiasan. Ia adalah solusi paling ampuh untuk menangani ketidakpastian data dan skew di lingkungan produksi.

๐Ÿ—‘๏ธ Hindari JVM untuk Data Besar Memanfaatkan Off-Heap memory menjauhkan data besar dari Garbage Collector Java, membuat aplikasi berjalan jauh lebih mulus tanpa jeda pembekuan.

๐Ÿ’ฌ Interaksi Pembaca
Coba cek Spark UI pada job terberat Anda. Apakah Anda melihat batang hijau panjang (task sukses) yang tertahan oleh satu batang yang tak kunjung selesai (straggler)? Itu tanda Anda butuh AQE dan repartitioning.

Sumber:
https://blog.flipkart.tech/apache-spark-optimisations-c3464f71bd38

#ApacheSpark #BigData #DataEngineering #PerformanceTuning #ETL #Scala #Python #DataPipeline #TechCaseStudy #SoftwareArchitecture

Leave a Comment