ETL Pipeline: Strategi Planning dan Construction untuk Data Skala Besar

Tim kami punya masalah, terdapat data (dari pihak lain) yang digunakan untuk analisa dan dashboard aplikasi, sedangkan akses ke sumber data ga bisa ambil data periode satu tahun sekaligus, tetapi dari setiap tanggal-bulan, dan setiap request memakan waktu 30 detik. Total seluruh data dapat mencapai ratusan ribu

  • Bagaimana cara mengatasi latensi data sumber yang lambat?
  • Bagaimana melakukan ETL dengan mudah?

Untuk mengatasi masalah diatas, perlu membuat program untuk ekstraksi data dalam jumlah banyak sekaligus. Disini akan saya ceritakan proses pemecahan masalahnya.

ETL: Extract-Transform-Load

ETL (Extract, Transform, Load) adalah proses pengolahan data dari satu tempat ke tempat lainnya seperti data warehouse atau database.

Singkatnya memang terlihat seperti download data tetapi ada yang perlu ditanyakan:

  • Bagaimana membuat program extraction yang bisa iterasi setiap tanggal dalam satu bulan?
  • Bagaimana jika gagal ditengah jalan?
  • Bagaimana menjalankan kembali program tanpa mengulang seluruh proses—resumable?
  • Bagaimana tracing error jika gagal ditengah jalan?
  • Bagaimana load data ke database tujuan terjadi gagal?

Program sederhana mungkin memecahakn masalah sederhana, tetapi semakin lama akan menemukan beberapa kendala dan perlu sebuah arsitektur program yang mampu membuat workflow ETL mudah digunakan.

Arsitektur ETL

Diperlukan perencanaan (planning), construction dan workflow untuk memecahkan masalah ini. Pertama-tama, rencana pengerjaan:

  1. Program memiliki parameter periode (bulan dan tahun), sehingga bisa iterasi seluruh hari dalam satu bulan.
  2. Program bisa menyimpan data mentah di database local
  3. Program memiliki job unit sebagai referensi pekerjaan.

Dari planning diatas, maka jelas bahwa program memiliki beberapa integrasi modul yaitu:

  1. Database Local: menyimpan seluruh data, proses, dan job unit.
  2. Input: input parameter berupa tahun, bulan dan nama batch.
  3. Output: program langsung menyimpan data kedalam Database.

Database yang aku gunakan adalah sqlite, kenapa? karena tidak perlu setup server, mudah di hapus dan reset, mudah dipindahkan, dan mampu menampung jutaan baris data.

Pseudocode alur dari Extraction. Disini kita fokus pada ekstraksi karena proses pengambilan data memerlukan waktu yang lama.

input = month, year
batch_name = string

for month in input[month]
  for year in input[year]
    job = get_job(month, year, batch_name)
    if job.status is 'done':
      continue
    df = fetch_data(job)
    if df is 'failed':
      job.set_status('failed')
    df.save(sqlite)
    job.set_status('done')

Proses extraction memerlukan batch_name karena perbedaan batch mengindikasikan bahwa proses pengambilan yang berbeda, dan setiap job memiliki id masing-masing sehingga memudahkan pengecekan data mana yang sudah dilakukan ekstraksi dan belum.

Selanjutnya adalah proses transformation. Disini kita perlu melabeli setiap baris data dengan tahun, bulan, job id dan load timestamp.

df_edit["meta_source_year"] = int(params["year"])
df_edit["meta_source_month"] = int(params["month"])
df_edit["meta_load_ts"] = dt.datetime.now()
df_edit["meta_job_id"] = job.id

Terakhir, proses load, simpan semua dataframe kedalam database sqlite.

Construction

Bagian construction fokus pada bagian teknikal, alat yang digunakan dan pengerjaan.

Alat yang aku gunakan:

  • Python: bahasa pemrograman yang mudah digunakan dan cepat
  • Pandas: memudahkan pengolahan data tabel, import-export ke berbagai tipe data
  • sqlalchemy: library python untuk interaksi kepada database berbasis SQL
  • Sqlite: library untuk komunikasi ke database lokal

Alat diatas sudah cukup untuk melakukan seluruh proses.

Workflow

Alur kerja (workflow) cukup sederhana

  1. Jalankan program untuk satu bulan.
  2. Secara parallel jalankan untuk bulan lainnya.
  3. Jika gagal, ulangi program yang sama—tidak akan mengulang proses yang sebelumnya
  4. Setelah berhasil, lakukan import data ke database tujuan

Latensi pengambilan data dari data sumber yang lama tidak menjadi masalah karena data segera disimpan dan proses ekstraksi mudah dilanjutkan pada bagian yang error—program bersifat resumbable.

Bagaimana jika terjadi kesalahan pada proses transformasi? aku harus mengulang proses dari awal lagi. Tentu saja ini akan jadi masalah karena ekstraksi data satu bulan butuh waktu hampir 1 jam.

Mengatasi Masalah Transformasi

Untuk mengatasi masalah trasnformasi dan membutuhkan proses ekstraksi ulang, maka setiap proses ekstraksi data, output data disimpan dalam KV database sebagai penyimpanan sementara. Sehingga ekstraksi ulang dari data sumber tidak perlu dilakukan.

Saat aku implementasi fitur ini, secara tidak sengaja terdapat manfaat lain yaitu Memudahkan tracing log output data pada setiap request. Ini penting apabila ada saat inspeksi data terdapat anomali, misalnya data bulan X kosong dan bisa diperiksa langsung dalam database KV sebagai history log.

ETL ke-dua

ETL pertama fokus pada proses “sumber data -> local”, sedangkan ETL kedua berfokus pada “local -> production” untuk digunakan oleh aplikasi lain.

ETL ini tidak perlu proses yang panjang karena aku sudah siapkan program migrasi sqlite ke postgresql, sehingga tabel database production mirip dengan sqlite local.

Parallelism

Untuk mempercepat proses ekstraksi perlu lakukan parallel, solusi umum adalah multi-thread—menjalankan berbagai program pada thread berbeda-beda. Tetapi multi-thread cukup kompleks dan sulit untuk dilakukan tracing error. Maka, alternatif lain adalah menjalankan sebagai program yang berbeda dengan kombinasi parameter berbeda pula.

[program 1]: python fetch.py 01-2026
[program 2]: python fetch.py 02-2026
[program 3]: python fetch.py 03-2026
….

Sederhananya, setiap program berjalan pada shell yang berbeda-beda. Sehingga proses menjadi parallel, tracing log, resumable dapat dilakukan dengan mudah dan terisolasi pada masing-masing program.

Work Smart, not harder

Penggunaan kode pemrograman untuk mengerjakan pekerjaan repetitif dan membosankan bisa jadi rewarding bagi pengguna—diri saya sendiri— karena memecahkan masalah dengan efektif dan efisien. Pemilihan alat dan alur yang tepat dapat meningkatkan efisiensi dalam berbagai aspek. Walaupun begitu, masih banyak ruang untuk belajar dan meningkatkan pengetahuan.

Sekian dari saya, terima kasih. sampai jumpa.

Add a comment

Subscribe now!