Episode ini membedah arsitektur Apache Spark: peran Driver, Executors, dan Cluster Manager dalam menjalankan pekerjaan, lalu core abstraction RDD, DataFrame, Dataset, dan Spark SQL. Kalian juga memahami DAG, stages, tasks, dan model storage dengan shuffle.

Setelah memahami mengapa Spark ada, episode 2 ini membedah bagaimana Spark bekerja. Memahami arsitektur internal Spark adalah pembeda antara pengguna yang sekadar menulis kode dan engineer yang bisa mendiagnosis masalah performa.
Di episode ini kita akan mengupas empat lapisan: arsitektur runtime dengan Driver dan Executors, core abstraction RDD dan DataFrame, model eksekusi berbasis DAG, serta storage model dengan partitioning dan shuffle. Materi ini adalah kacamata yang akan kalian pakai untuk membaca semua episode berikutnya.
Driver adalah proses utama yang menjalankan kode aplikasi kalian, khususnya fungsi main atau driver program. Tugasnya: membangun DAG (Directed Acyclic Graph), membaginya menjadi stages dan tasks, menjadwalkan task ke executor, dan mengumpulkan hasil. Driver juga menjadi tempat SparkContext dan SparkSession berdiri.
Executor adalah proses yang berjalan di node pekerja (worker) dan menjalankan task yang dijadwalkan driver. Setiap executor menyimpan data ter-cache dan mengeksekusi kode pada partisi data yang ditugaskan kepadanya. Secara umum: lebih banyak executor berarti lebih banyak paralelisme, tapi juga memakan lebih banyak memori cluster.
Cluster Manager mengalokasikan resource (CPU dan memori) untuk aplikasi Spark. Tiga tipe utama: Standalone (bawaan Spark), YARN (dari ekosistem Hadoop), dan Kubernetes. Pilihan cluster manager tidak mengubah cara kalian menulis kode, tapi menentukan bagaimana resource dibagi antar aplikasi.
Driver → membangun DAG, menjadwalkan task, mengumpulkan hasil
Executors → mengeksekusi task, menyimpan data cache
Cluster Manager → mengalokasikan CPU dan memoriRDD adalah abstraksi paling dasar Spark: kumpulan elemen yang terdistribusi lintas cluster, immutable, dan resilient — jika sebuah partisi hilang, Spark bisa merekonstruksinya dari lineage. RDD punya dua jenis operasi: transformation (lazy) dan action (eager). RDD kini jarang dipakai langsung karena API rendah tingkat, tapi memahami konsepnya wajib — akan kita bedah penuh di episode 4.
DataFrame adalah kumpulan baris terdistribusi dengan schema (kolom yang bertipe) dan memanfaatkan Catalyst optimizer untuk optimasi query. Ini adalah abstraksi paling sering dipakai di PySpark dan Spark SQL. Operasinya mengikuti pola data manipulation seperti di SQL: select, filter, groupBy, join.
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").appName("abstraksi").getOrCreate()
df = spark.createDataFrame([("budi", 25), ("sari", 30)], ["nama", "umur"])
df.filter(df.umur > 26).select("nama").show()df.filter(df.umur > 26) menunjukkan pola declarative: kalian menyatakan apa yang diinginkan, dan Spark memutuskan bagaimana menjalankannya secara optimal.
Dataset adalah DataFrame dengan typed API — kuat di Scala dan Java karena setiap baris adalah objek bertipe yang diperiksa saat kompilasi. Di PySpark, Dataset tidak tersedia karena Python bukan bahasa statis; konsepnya akan kita bedah di episode 6.
Spark SQL memungkinkan kalian menulis query SQL biasa terhadap data yang tersimpan di tabel atau view. Ini membuat Spark bisa dipakai oleh analis yang tidak menulis kode, dan memungkinkan code sharing antara query SQL dan program API.
Saat kalian memanggil action seperti count() atau show(), Spark membangun DAG dari semua transformation yang sudah diregistrasi. DAG adalah grafik berarah tanpa siklus yang menggambarkan ketergantungan antar operasi. DAG Scheduler kemudian membagi DAG menjadi stages.
Stage adalah kelompok task yang bisa dijalankan bersamaan tanpa shuffle. Batas antar stage muncul saat ada shuffle (misalnya groupBy atau join). Setiap stage berisi banyak task — satu task bekerja pada satu partisi data. Task inilah yang dikirim ke executor untuk dieksekusi.
kode → DAG → stages → tasks → schedulers → executorsSetiap action memicu satu job. Di dalam job, Task Scheduler mengirimkan task ke executor dengan lokasi data yang paling dekat (data locality). Memahami alur ini membantu kalian membaca Spark UI saat terjadi bottleneck — misalnya melihat banyak task dengan durasi tidak seimbang yang menandakan skew.
Data di Spark selalu terbagi menjadi partisi — potongan logis yang disebar ke executor. Jumlah partisi menentukan tingkat paralelisme. Untuk file di HDFS atau S3, satu partisi defaultnya berukuran sekitar 128MB. Kalian bisa mengatur jumlah partisi dengan repartition() dan coalesce().
Spark bisa menyimpan data di memory dan disk dengan berbagai level. Persistence membantu menghindari rekalkulasi saat data dipakai berulang kali:
MEMORY_ONLY → simpan di memory JVM
MEMORY_AND_DISK → memory dulu, spill ke disk jika penuh
DISK_ONLY → simpan langsung ke diskPemakaian df.cache() atau df.persist() harus disadari: menyimpan terlalu banyak data di memory bisa menyebabkan spill yang justru memperlambat. Strategi caching akan kita optimalkan di episode 9.
Shuffle terjadi ketika data perlu dikelompokkan ulang antar executor — seperti saat groupByKey, join, atau reduceByKey. Shuffle membutuhkan penulisan data ke disk, transfer jaringan, dan re-partisi. Inilah alasan utama mengapa pekerjaan Spark melambat. Seluruh series ini akan berulang kali menekankan cara meminimalkan shuffle.
Warning
Jika kalian baru mulai: perhatikan setiap operasi yang memicu shuffle. Sebagian besar optimasi Spark, dari broadcast join sampai memilih jumlah partisi, pada dasarnya adalah upaya mengurangi biaya shuffle.
Episode 2 memberi kalian peta arsitektur: Driver membangun DAG dan menjadwalkan, Executors mengeksekusi task, Cluster Manager menyediakan resource. Abstraksi data berlapis dari RDD, DataFrame, Dataset, sampai Spark SQL, semuanya berjalan di atas model eksekusi DAG yang membagi pekerjaan menjadi stages dan tasks.
Inti yang harus dibawa pulang:
Di episode 3 selanjutnya kita akan membahas instalasi dan menjalankan Spark — men-download binary, menjalankan spark-shell dan pyspark, memakai spark-submit dengan deployment mode client dan cluster, serta membaca Spark UI di port 4040. Semua prinsip arsitektur ini akan segera terlihat secara nyata.