Topik ini menempatkan Apache Spark pada peta alat pengolahan data. Definisi Spark dirumuskan sebagai mesin analitik terdistribusi, kemudian dibedakan dari pandas yang bekerja pada satu mesin dan dari basis data yang menyimpan data secara permanen. Di bagian akhir, beberapa situasi yang umum dijumpai dirangkum sebagai kondisi ketika Spark merupakan pilihan yang tepat.
Spark sebagai mesin data terdistribusi#
Apache Spark adalah mesin analitik terdistribusi yang berperan sebagai engine komputasi, yakni komponen perangkat lunak yang murni menjalankan pengolahan data. Spark membaca data dari penyimpanan eksternal, memparalelkan transformasi di banyak komputer, lalu menuliskan hasilnya kembali ke penyimpanan. Kata kuncinya adalah engine, bukan basis data dan bukan tempat penyimpanan. Spark tidak memiliki format berkasnya sendiri dan tidak mengelola data secara permanen, sehingga data tetap berada pada HDFS, penyimpanan objek terdistribusi, atau sistem berkas lain yang sudah ada. Perannya dimulai ketika komputasi diminta dan berakhir ketika hasil selesai ditulis.
Komputasi tersebut berlangsung pada sebuah cluster, yaitu sekumpulan komputer yang dikelola sebagai satu kesatuan agar pekerjaan dapat dibagi di antara mesin-mesinnya. Model inilah yang membedakan Spark dari pustaka analitik yang berjalan dalam satu proses Python. Selain membagi data, Spark juga menunda pekerjaan yang belum diperlukan. Rangkaian transformasi dikumpulkan menjadi rencana, dan komputasi baru berjalan ketika hasil benar-benar diminta. Pola ini disebut lazy evaluation, yakni penundaan eksekusi sampai sebuah perintah meminta hasilnya.
Engine yang sama melayani pemrosesan batch, yakni pekerjaan yang dijalankan sekali atas sekumpulan data, pemrosesan aliran (streaming), kueri SQL, dan pembelajaran mesin melalui pustaka yang menyatu dengan engine tersebut. Keterpaduan ini membuat Spark sering menjadi komponen utama satu pipeline data, dari pembacaan data mentah hingga agregat akhir. Komponen-komponennya berbagi engine eksekusi yang sama, sehingga optimasi berlaku lintas antarmuka.
Perbandingan dengan pandas#
pandas adalah pustaka analitik data Python yang lazim dipakai untuk data tabular berukuran kecil hingga menengah. Seluruh data dimuat ke memori satu komputer, dan setiap operasi dieksekusi segera saat baris kodenya dijalankan. Sifat segera ini disebut eager, yaitu kebalikan dari lazy evaluation. Keunggulan pandas adalah kemudahan eksplorasi karena hasil setiap langkah dapat diperiksa langsung, sedangkan batasnya tegas, yaitu kapasitas memori satu mesin.
Spark mengambil arah yang sebaliknya. Data dipecah menjadi partisi, yaitu potongan data yang tersebar di banyak mesin. Transformasi dirangkai menjadi rencana eksekusi, dan pelaksanaannya diparalelkan di antara partisi tersebut. Tabel berikut merangkum perbedaan yang paling menentukan.
| Aspek | pandas | Spark |
|---|---|---|
| Skala data | Data yang muat pada memori satu mesin | Data yang terbagi di banyak mesin pada cluster |
| Model eksekusi | Eager, setiap operasi dieksekusi segera | Lazy, rencana dieksekusi ketika hasil diminta |
| Bahasa API | Python | Python, Scala, Java, R, dan SQL |
| Penulisan hasil | Satu berkas pada satu mesin | Banyak berkas terpartisi yang ditulis paralel |
Perbedaan model eksekusi paling mudah terlihat dari kode. Contoh berikut membandingkan urutan berpikir keduanya pada pekerjaan yang sama, yaitu menandai siswa yang lulus.
# tidak-dijalankan
# pandas: setiap baris langsung dieksekusi
nilai_pd = pd.read_csv("nilai_ujian.csv")
nilai_pd["lulus"] = nilai_pd["nilai"] >= 75 # komputasi berjalan sekarang
# Spark: baris pertama hingga kedua hanya menyusun rencana
nilai_df = spark.read.csv("nilai_ujian.csv")
nilai_df = nilai_df.withColumn("lulus", F.col("nilai") >= 75)
nilai_df.show() # komputasi baru berjalan di siniPada pandas, kesalahan pengetikan nama kolom langsung terasa karena error muncul di baris yang bersangkutan. Pada Spark, kesalahan yang sama baru terlihat ketika aksi (action), yaitu operasi yang meminta hasil komputasi, dijalankan. Sebagai gantinya, rencana yang utuh memberi Spark keleluasaan menyusun ulang langkah demi langkah komputasi agar lebih hemat, misalnya dengan menyaring data lebih dahulu sebelum data itu dipindahkan antar mesin.
Perbandingan dengan basis data#
Basis data relasional adalah sistem yang menyimpan data sekaligus melayani kuerinya. Data diatur oleh sistem manajemen basis data (DBMS) dalam format internal miliknya, dilindungi transaksi, dan dipercepat oleh indeks. SQL pada basis data berjalan dekat dengan data, sehingga kueri interaktif pada tabel berukuran sedang selesai dalam hitungan detik tanpa penyetelan apa pun.
Spark menggunakan SQL yang mirip, tetapi kedudukannya berbeda. Spark tidak menyimpan data dan tidak menjamin transaksi atasnya. Berkas yang diolah biasanya berada pada data lake, yakni kumpulan berkas di penyimpanan terdistribusi yang dibiarkan dalam format aslinya, misalnya CSV, JSON, atau Parquet. Spark SQL menerjemahkan kueri menjadi rencana komputasi terdistribusi atas berkas-berkas tersebut.
Perbedaan lainnya terletak pada cakupan pekerjaan. SQL pada basis data unggul untuk menyatakan apa yang diinginkan dari data, sedangkan Spark mengizinkan komputasi umum di sekitarnya, seperti pemanggilan fungsi kustom, pembelajaran mesin, dan penggabungan batch dengan streaming. Karena itu keduanya sering bekerja berdampingan, yaitu basis data menjadi sumber atau tujuan tabel jadi, sedangkan Spark menyiapkan datanya dalam skala besar.
Kapan Spark digunakan#
Spark menjadi pilihan yang tepat ketika salah satu kondisi berikut berlaku.
- Volume data melebihi memori dan kenyamanan satu mesin, mulai dari puluhan gigabyte ke atas.
- Transformasi berat dijalankan secara rutin atas data yang terkumpul di penyimpanan terdistribusi.
- Satu pipeline perlu mencakup batch, streaming, SQL, dan pembelajaran mesin sekaligus.
- Pekerjaan dapat menunggu beberapa menit, sehingga throughput, yaitu jumlah kerja yang selesai per satuan waktu, lebih menentukan daripada latensi sesaat.
Sebaliknya, ada situasi ketika Spark justru menambah biaya tanpa manfaat. Pada data kecil, waktu untuk memulai JVM dan mengoordinasikan beberapa proses melebihi waktu komputasinya, sehingga pandas atau alat satu mesin lain lebih cepat siap dan lebih cepat selesai. Spark juga bukan pengganti basis data untuk aplikasi transaksional karena tidak menyediakan indeks dan jaminan transaksi yang menjadi kekuatan DBMS. Untuk penyajian data dengan latensi milidetik, alat khusus yang menyimpan hasil akhir lebih sesuai daripada mesin komputasi.
Ringkasan#
- Spark berperan sebagai engine komputasi terdistribusi yang mengolah data milik penyimpanan eksternal, bukan sebagai sistem penyimpanan itu sendiri.
- pandas mengeksekusi operasi segera pada satu mesin, sedangkan Spark menunda eksekusi (lazy) dan memparalelkannya ke banyak mesin.
- Basis data menyimpan dan melayani data dengan jaminan transaksional, sedangkan Spark melakukan komputasi umum atas berkas di data lake.
- Spark layak dipertimbangkan ketika volume data atau kompleksitas komputasi melebihi kemampuan satu mesin.
Referensi#
- Apache Spark Overview — Apache Software Foundation — Ringkasan resmi komponen Spark dan ekosistemnya.
- Spark SQL Guide — Apache Software Foundation — Dokumentasi mesin SQL Spark yang menjadi dasar API DataFrame.
- pandas documentation — pandas development team — Dokumentasi resmi pustaka pandas yang menjadi pembanding pada topik ini.