01 Lingkungan sumber
Provisioning lingkungan Snowflake yang mencerminkan deployment pelanggan nyata — 50 juta baris, pipeline dbt Medallion, producer perjalanan live, dan tiga dashboard Superset.
Titik awal
Modul 00 selesai: toolchain terpasang, kedua akun trial cloud aktif, repo sudah dikloning,
dan virtualenv dbt-snowflake sudah terbangun. Modul ini memakan sekitar 45 menit dan
menghabiskan kurang lebih 2-4 kredit Snowflake.
Mengapa
Anda tidak bisa merencanakan migrasi terhadap sumber mainan. Satu tabel datar dengan
segelintir baris akan membuat Anda melewati setiap keputusan yang membuat migrasi nyata
menjadi sulit. Modul ini justru membangun bentuk deployment pelanggan yang sebenarnya:
kolom VARIANT yang menyimpan JSON semi-terstruktur, sebuah stream CDC, task terjadwal,
pipeline MERGE inkremental, dan lapisan BI yang membaca di atas semuanya. Setiap hal itu
menjadi keputusan migrasi yang spesifik di modul 02 — modul ini ada supaya Anda punya
barang nyata untuk ditunjuk ketika keputusan tersebut muncul, bukan sekadar abstraksi.
Konsep — di balik layar
Infrastruktur (Terraform). Menjalankan setup.sh melakukan provisioning:
- Warehouse —
TRANSFORM_WH(SMALL, untuk ELT) danANALYTICS_WH(MEDIUM, untuk BI), plus sebuah resource monitor (ANALYTICS_WH_MONITOR) yang dibatasi 50 kredit/bulan. - Database —
NYC_TAXI_DB, dengan tiga skema:RAW,STAGING,ANALYTICS. - Role —
TRANSFORMER_ROLE,ANALYST_ROLE,DBT_ROLE,LOADER_ROLE.
Bentuk Medallion. Data bergerak melalui tiga lapisan di dalam NYC_TAXI_DB:
- RAW —
TRIPS_RAW(50 juta baris perjalanan sintetis, termasuk kolomVARIANTTRIP_METADATAyang mensimulasikan telemetri aplikasi — inilah tantangan migrasi JSON) plus tabel dimensi (DIM_TAXI_ZONES,DIM_PAYMENT_TYPE,DIM_VENDOR). - STAGING — view dbt yang membersihkan tipe data dan memipihkan kolom
VARIANT. - ANALYTICS — tabel dbt dan model inkremental:
fact_trips(50 juta baris, strategiMERGE), empat tabel dimensi, danagg_hourly_zone_trips(sebuah agregat inkremental).
Dua objek Snowflake menjaga pipeline ini tetap bergerak sendiri, terlepas dari dbt:
TRIPS_CDC_STREAM— sebuah stream Change Data Capture padaTRIPS_RAW.CDC_CONSUME_TASK— membaca stream itu setiap 5 menit (berjalan diRAW, di-resume saat setup) — danHOURLY_AGG_TASK, yang menyegarkan agregat per jam setiap jam (berjalan diSTAGING, di-resume setelah dbt membangun).
Superset. Ketiga dashboard membaca dari skema ANALYTICS melalui ANALYTICS_WH —
tidak ada yang menyentuh RAW atau STAGING secara langsung. Jalur baca itulah yang akan
Anda reproduksi di sisi ClickHouse nanti dalam workshop ini.
Langkah 1 — Konfigurasikan kredensial
cd "$(git rev-parse --show-toplevel)/workshop_public/snowflake_migration_lab/01-setup-snowflake"
cp .env.example .env
# Edit .env with your Snowflake credentials
cp dbt/nyc_taxi_dbt/profiles.yml.example ~/.dbt/profiles.yml
# Edit ~/.dbt/profiles.yml with your account detailsBaik .env maupun ~/.dbt/profiles.yml masuk gitignore — keduanya menyimpan akun, user,
dan password Snowflake Anda. Jangan pernah commit salah satu pun dari file itu.
Langkah 2 — Jalankan setup
cd "$(git rev-parse --show-toplevel)/workshop_public/snowflake_migration_lab/01-setup-snowflake"
source .env && ./setup.shPerkirakan ini memakan 5-10 menit, sebagian besar untuk menghasilkan 50 juta baris data
perjalanan sintetis dengan TABLE(GENERATOR). setup.sh melakukan provisioning
infrastruktur Terraform, mengisi TRIPS_RAW, menjalankan build dbt, dan menaikkan Docker
Compose (producer perjalanan dan Superset) dalam satu jalan.
Langkah 3 — Jalankan producer dan Superset
setup.sh menaikkan Docker Compose dengan environment yang benar, mendaftarkan koneksi
Snowflake di Superset, dan mengimpor ketiga dashboard secara otomatis.
ZIP dashboard yang di-commit di superset/dashboards/ punya sqlalchemy_uri yang
disamarkan menjadi placeholder (LAB_USER, MYORG-MYACCOUNT). Impor otomatis mencetak
ulang URI itu dari .env Anda, jadi hal ini transparan ketika setup.sh berjalan. Jika
Anda malah mengimpor ZIP secara manual melalui UI Superset, koneksi yang dibuatnya akan
memakai placeholder tersebut dan tidak akan tersambung — sunting koneksinya sesudahnya agar
menunjuk ke akun Snowflake Anda yang sebenarnya.
Jika Anda perlu me-restart Superset secara manual:
cd "$(git rev-parse --show-toplevel)/workshop_public/snowflake_migration_lab/01-setup-snowflake/superset"
docker-compose --env-file ../.env up -dFlag --env-file ../.env memuat variabel environment dari direktori induk.
Ketiga dashboard tersebut adalah Operations Command Center, Executive Weekly Report, dan Driver & Quality Analytics (sengaja dibuat lambat — inilah target benchmark ClickHouse nanti dalam workshop). Untuk pembangunan dashboard lengkap — sumber data, chart, filter — lihat Superset di Snowflake.
Langkah 4 — Jaga dbt tetap mutakhir
Producer perjalanan terus-menerus menyisipkan sekitar 60 perjalanan/menit ke TRIPS_RAW.
Agar fact_trips dan agg_hourly_zone_trips tetap mutakhir sambil Anda bekerja, jalankan
loop refresh dbt di terminal terpisah:
cd "$(git rev-parse --show-toplevel)/workshop_public/snowflake_migration_lab/01-setup-snowflake"
# Default: refresh every 5 minutes (auto-sources .env)
./scripts/run_dbt.sh
# Custom interval
./scripts/run_dbt.sh --interval 15m
# Run once and exit
./scripts/run_dbt.sh --once
# Include dbt tests after each run
./scripts/run_dbt.sh --test| Flag | Efek |
|---|---|
--interval <n> | Jeda antar eksekusi: 30s, 5m, 1h, atau detik biasa (default: 5m) |
--once | Jalankan satu kali refresh lalu keluar |
--test | Jalankan dbt test setelah setiap dbt run |
Skrip ini selalu berjalan secara inkremental — ia tidak pernah melakukan
--full-refresh, sehingga baris yang disisipkan producer tetap terjaga. Tekan Ctrl-C kapan
saja untuk menghentikannya; biarkan ia berjalan di terminalnya sendiri selama sisa lab —
modul 03 masih mengandalkannya.
Langkah 5 — Jelajahi pustaka query
cd "$(git rev-parse --show-toplevel)/workshop_public/snowflake_migration_lab/01-setup-snowflake"Direktori query (workshop_public/snowflake_migration_lab/01-setup-snowflake/queries/)
berisi tujuh file SQL yang dianotasi. Masing-masing berjalan terhadap lingkungan Snowflake
yang baru Anda bangun, dan masing-masing membawa tantangan migrasi yang disengaja yang akan
diterjemahkan modul 02 ke ClickHouse:
| Query | Konstruksi | Tantangan migrasi |
|---|---|---|
| Q1 | DATE_TRUNC, DATEADD | Perbedaan sintaks kecil |
| Q2 | Window ROWS BETWEEN | Nyaris identik di ClickHouse |
| Q3 | QUALIFY | Native di ClickHouse sejak v24.5 — di sini tetap ditulis ulang sebagai subquery, demi portabilitas |
| Q4 | LATERAL FLATTEN | Tidak ada padanan — gunakan JSONExtract atau pipihkan lebih dulu |
| Q5 | Path titik dua VARIANT | Ganti dengan JSONExtractFloat/JSONExtractString |
| Q6 | MERGE INTO | Tidak ada padanan — gunakan ReplacingMergeTree |
| Q7 | Snowflake Streams | Dipensiunkan saat cutover — penulisan live langsung ke ClickHouse melalui producer |
Buka setiap file dan jalankan terhadap lingkungan Snowflake Anda sebelum melanjutkan. Blok komentar di setiap query sudah menyketsa padanan ClickHouse-nya — modul 02 adalah tempat Anda menulis dan menjalankan sisi itu untuk sungguhan.
Cara memverifikasi bahwa Anda sudah selesai
cd "$(git rev-parse --show-toplevel)/workshop_public/snowflake_migration_lab/01-setup-snowflake"
source .env && ./scripts/verify_environment.shIni memeriksa:
- Database & skema —
NYC_TAXI_DBada denganRAW,STAGING,ANALYTICS. - Tabel & data —
TRIPS_RAWpunya ~50 juta baris,FACT_TRIPSterisi, dimensi tersedia. - Stream CDC —
TRIPS_CDC_STREAMada padaTRIPS_RAW. - Task terjadwal —
CDC_CONSUME_TASKdanHOURLY_AGG_TASKberstatusstarted. - Aktivitas CDC — task-task tersebut baru saja tereksekusi.
- Aliran producer — producer perjalanan menyisipkan data secara terus-menerus.
- Superset — dashboard BI dapat dijangkau di
http://localhost:8088.
Jika Anda lebih suka memeriksa secara manual, SHOW TASKS LIKE '%TASK' IN DATABASE NYC_TAXI_DB;
dengan role ACCOUNTADMIN (task dimiliki role tersebut) memastikan kedua task berjalan.
Penutup
Anda akan kembali ke lingkungan ini berulang kali dalam beberapa modul berikutnya, dan satu
eksekusi ./setup.sh penuh memakan 5-10 menit yang tidak ingin Anda bayar setiap kali
menyentuh satu file Terraform atau satu model dbt. setup.sh menyediakan flag justru untuk
itu:
| Flag | Kapan dipakai |
|---|---|
| (tidak ada) | Eksekusi pertama. Melakukan provisioning semuanya dan menghasilkan 50 juta baris sintetis (~12 mnt total). |
--skip-seed | Infrastruktur sudah ada dan TRIPS_RAW sudah berisi data. Melewati pembuatan data sintetis (~8 mnt dihemat). |
--skip-dbt | Objek Snowflake sudah ada tetapi Anda tidak perlu menjalankan ulang transformasi dbt (misalnya menguji perubahan Terraform). |
--skip-superset | Docker tidak berjalan atau Anda belum memerlukan lapisan BI. |
--full-refresh | Paksa dbt membangun ulang semua model inkremental dari awal (misalnya setelah perubahan skema). |
Flag bisa dikombinasikan. Dua kombinasi yang umum:
# Re-run after a Terraform or SQL change — skip the ~10 min data load
./setup.sh --skip-seed
# Iterate on dbt models only — skip everything else
./setup.sh --skip-seed --skip-supersetCatatan biaya. Seeding data berjalan sekitar 12 menit untuk 2 kredit ($6), dan build
dbt penuh berjalan sekitar 8 menit untuk 1,5 kredit ($5). Sesi lab partner selama 8 jam
menambah kurang lebih 12 kredit lagi (~$36) — warehouse auto-suspend saat idle, jadi biaya
berhenti bertambah di antara sesi. Total per partner per hari kurang lebih 16 kredit,
sekitar $47.
Kondisi akhir
Snowflake sudah aktif: NYC_TAXI_DB terbangun penuh, stream CDC dan kedua task terjadwal
berjalan, producer perjalanan menulis sekitar 60 perjalanan/menit ke TRIPS_RAW, dan
ketiga dashboard Superset hidup di http://localhost:8088.
Biarkan producer tetap berjalan. Jangan hentikan stack Docker Compose dan jangan
jalankan ./teardown.sh — modul 02 hingga 05 bergantung pada lingkungan ini tetap hidup,
dan langkah cutover di modul 05 mengukur jeda persis yang diciptakan producer antara
Snowflake dan ClickHouse selama migrasi. Membongkarnya sekarang akan membuat sisa workshop
gagal dengan cara yang sulit dilacak kembali ke langkah ini. Teardown dibahas di akhir
modul 05, bukan di sini.
00 Setup
Pasang toolchain, buat dua akun trial cloud, kloning repo, dan bangun kedua virtualenv dbt — semua yang dibutuhkan migrasi sebelum Anda menyentuh data.
02 Rencana dan desain
Profilkan workload Snowflake, lalu ambil keputusan arsitektur yang akan dieksekusi migrasi — pemilihan engine, sort key, terjemahan skema, gelombang deployment, dan desain model dbt.