Putaran optimasi

Pemrofilan dan penyetelan berbasis bukti.

Daftar isi

Pipeline yang jalan bukan akhir proyek, melainkan titik mulai penyetelan yang disiplin. Topik terakhir ini merangkum kerangka kerja yang selama ini tersebar di seluruh jalur, yaitu putaran profil, keputusan, dan ukur ulang, dengan bukti nyata dari pipeline yang baru selesai dikerjakan pada topik implementasi.

Kerangka putaran profil dan keputusan#

Putaran optimasi yang sehat terdiri dari empat langkah yang berulang. Pertama, ukur keadaan saat ini dengan alat yang tersedia, yaitu durasi per stage pada Spark UI, jumlah dan ukuran berkas keluaran, serta rencana eksekusi. Kedua, nyatakan gejalanya dalam istilah teknis, misalnya satu stage jauh lebih lambat karena partisi timpang, atau keluaran berisi ratusan berkas kecil. Ketiga, ubah satu hal yang diduga penyebabnya, bukan lima hal sekaligus. Keempat, ukur ulang dengan cara yang sama dan bandingkan, lalu pertahankan perubahan bila buktinya mendukung.

Yang membuat putaran ini berbeda dari kebiasaan menyetel acak adalah basis buktinya. Setiap perubahan yang tidak diukur adalah dugaan, dan dua dugaan yang diterapkan bersamaan membuat bukti tidak bisa dipisahkan. Pada pipeline kecil, seluruh putaran bisa berlangsung beberapa menit, dan kebiasaan ini yang dibawa ke proyek besar karena biaya paling mahal di produksi adalah perubahan yang tidak bisa ditebak dampaknya.

Pemilihan target juga perlu disiplin. Optimasi pertama selalu diarahkan pada yang paling lambat dan paling sering berjalan, karena memangkas sepuluh persen dari pekerjaan harian bernilai jauh lebih tinggi daripada memangkas separuh dari pekerjaan tahunan. Ukuran keberhasilannya sudah tersedia dari topik pemilihan proyek, yaitu keluaran yang terukur dan jadwal yang diperjanjikan, sehingga keputusan berhenti menyetel juga punya dasar yang jelas.

Memprofil pipeline yang baru selesai#

Skrip berikut memeriksa keluaran pipeline dari topik implementasi dengan dua lensa, yaitu jumlah berkas data per lapisan dan isi tabel gold. Pada data kecil, profil ini sengaja dibuat ringan agar mudah diulang setelah setiap perubahan pipeline.

python profil_pipeline.py
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder
    .master("local[2]")
    .appName("profil-pipeline")
    .config("spark.sql.shuffle.partitions", "2")
    .getOrCreate()
)

akar = "/tmp/pipeline-absen"

print("=== jumlah berkas data per lapisan ===")
import os
for lapisan in ["bronze", "silver", "gold"]:
    jalur = os.path.join(akar, lapisan)
    parquet = [
        nama for nama in os.listdir(jalur) if nama.endswith(".parquet")
    ]
    print(f"{lapisan:7} : {len(parquet)} berkas")

print("=== isi gold ===")
gold = spark.read.parquet(f"{akar}/gold")
gold.orderBy("kelas").show()

spark.stop()
text Keluaran
WARNING: Using incubator modules: jdk.incubator.vector
=== jumlah berkas data per lapisan ===
bronze  : 1 berkas
silver  : 1 berkas
gold    : 1 berkas
=== isi gold ===
+-----+------+---------+
|kelas|jumlah|rata_rata|
+-----+------+---------+
|  10A|     2|     86.5|
|  10B|     2|     85.0|
+-----+------+---------+

Profil menyatakan satu berkas per lapisan, yang merupakan hasil keputusan .coalesce(1) dan memang benar untuk data kecil. Isi gold menegaskan keluaran akhir yang diperjanjikan, yaitu dua kelas dengan rata-rata yang benar. Pada skala ini tidak ada gejala yang menuntut tindakan, dan justru itu pelajarannya, yaitu profil yang bersih menutup putaran lebih cepat daripada menyetel tanpa alasan.

Ketika data bertumbuh, profil yang sama akan berubah cerita. Jumlah berkas per lapisan naik tanpa kendali ketika pipeline menulis berkali-kali tanpa pemadatan, dan topik masalah berkas kecil pada modul berkas dan format menyediakan perbaikannya. Isi gold yang berubah isinya setiap pembacaan menandakan masalah transaksi, dan tabel Delta dari modul ekosistem menjadi jawabannya. Durasi stage yang timpang terbaca dari Spark UI, dan rencana eksekusi memperlihatkan apakah join yang dimaksud benar-benar menjadi broadcast. Setiap gejala itu punya topik pada jalur ini yang menjelaskan perbaikannya.

Putaran terakhir yang layak dikerjakan adalah menuliskan keputusan yang sudah teruji ke dalam skrip, yaitu konfigurasi yang dipilih beserta alasannya, schema tiap lapisan, dan cara memulihkan dari kegagalan. Dokumen kecil ini menjadikan pipeline dapat dipahami orang lain tanpa menelusuri riwayat percakapan, dan merupakan perbedaan utama antara proyek pembelajaran yang selesai dan latihan yang hilang begitu sesi tertutup.

Dengan selesainya topik ini, seluruh 42 topik pada jalur telah dilalui, dari sesi pertama sampai putaran optimasi. Pola yang paling bernilai untuk dibawa keluar dari jalur ini bukan sintaks yang bisa dicari ulang, melainkan kebiasaan membaca rencana sebelum menyetel, menjaga keluaran terukur sebelum mengoptimasi, dan menjaga kebenaran data pada lapisan yang tepat. Ketiga kebiasaan itu tetap berlaku ketika volume bertumbuh, versi Spark maju, dan pilihan alat berganti.

Kesalahan umum#

Kesalahan pertama adalah menyetel sebelum memprofil. Perubahan partisi shuffle, broadcast, atau format tanpa angka sebelum dan sesudah hanya menambah variasi tanpa arah, dan kemunduran kinerja sering tidak terdeteksi sampai jauh kemudian. Profil sederhana seperti skrip di atas cukup untuk memulai, dan Spark UI melengkapinya untuk stage yang lambat.

Kesalahan kedua adalah mengukur dengan cara yang berbeda di setiap putaran. Durasi yang diambil pada beban mesin yang berbeda, atau jumlah berkas yang dihitung dengan filter yang berbeda, membuat perbandingan tidak sah. Tetapkan satu cara ukur per gejala, dan jalankan minimal dua kali sebelum memutuskan, karena satu kali ukuran bisa terpengaruh keadaan mesin.

Kesalahan ketiga adalah menyetel yang bukan hambatan. Memangkas waktu stage yang berlangsung dua detik pada pekerjaan yang berjalan sepuluh menit tidak pernah terasa oleh konsumen, sedangkan satu berkas keluaran yang bengkak menahan seluruh tahap berikutnya. Urutan prioritas mengikuti biaya nyata pada keluaran, bukan kemudahan perbaikannya.

Ringkasan#

  • Putaran optimasi bergerak dari ukur, nyatakan gejala, ubah satu hal, lalu ukur ulang dengan cara yang sama, dan perubahan dipertahankan hanya dengan bukti.
  • Profil sederhana berupa jumlah berkas per lapisan dan isi gold sudah cukup untuk memulai, dan Spark UI menambah durasi per stage ketika data bertumbuh.
  • Setiap gejala umum pada pipeline punya topik rujukan pada jalur ini, dari berkas kecil, transaksi tabel, broadcast join, sampai partisi timpang.
  • Menuliskan keputusan yang teruji beserta alasannya menutup proyek dan menjadikannya dipahami ulang tanpa menelusuri sejarah percakapan.

Referensi#