Snowflake MigrationClickHouse Workshops

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) dan ANALYTICS_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.

Lingkungan sumber Snowflake: generator sintetis satu kali dan producer perjalanan Docker yang berjalan terus menyisipkan data ke NYC_TAXI_DB, yang dibaca tiga dashboard Superset melalui analytics warehouse

Bentuk Medallion. Data bergerak melalui tiga lapisan di dalam NYC_TAXI_DB:

  • RAW — TRIPS_RAW (50 juta baris perjalanan sintetis, termasuk kolom VARIANT TRIP_METADATA yang 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, strategi MERGE), empat tabel dimensi, dan agg_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 pada TRIPS_RAW.
  • CDC_CONSUME_TASK — membaca stream itu setiap 5 menit (berjalan di RAW, di-resume saat setup) — dan HOURLY_AGG_TASK, yang menyegarkan agregat per jam setiap jam (berjalan di STAGING, di-resume setelah dbt membangun).

Di dalam NYC_TAXI_DB: TRIPS_RAW dengan kolom metadata VARIANT mengisi stream CDC dan task consume terjadwal, sementara dbt membangun view staging lalu tabel fact, dimensi, dan agregat per jam

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 details

Baik .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.sh

Perkirakan 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 -d

Flag --env-file ../.env memuat variabel environment dari direktori induk.

Sumber data dashboard Superset: tiga dashboard operasional membaca skema analytics melalui analytics warehouse

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
FlagEfek
--interval <n>Jeda antar eksekusi: 30s, 5m, 1h, atau detik biasa (default: 5m)
--onceJalankan satu kali refresh lalu keluar
--testJalankan 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:

QueryKonstruksiTantangan migrasi
Q1DATE_TRUNC, DATEADDPerbedaan sintaks kecil
Q2Window ROWS BETWEENNyaris identik di ClickHouse
Q3QUALIFYNative di ClickHouse sejak v24.5 — di sini tetap ditulis ulang sebagai subquery, demi portabilitas
Q4LATERAL FLATTENTidak ada padanan — gunakan JSONExtract atau pipihkan lebih dulu
Q5Path titik dua VARIANTGanti dengan JSONExtractFloat/JSONExtractString
Q6MERGE INTOTidak ada padanan — gunakan ReplacingMergeTree
Q7Snowflake StreamsDipensiunkan 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.sh

Ini memeriksa:

  1. Database & skema — NYC_TAXI_DB ada dengan RAW, STAGING, ANALYTICS.
  2. Tabel & data — TRIPS_RAW punya ~50 juta baris, FACT_TRIPS terisi, dimensi tersedia.
  3. Stream CDC — TRIPS_CDC_STREAM ada pada TRIPS_RAW.
  4. Task terjadwal — CDC_CONSUME_TASK dan HOURLY_AGG_TASK berstatus started.
  5. Aktivitas CDC — task-task tersebut baru saja tereksekusi.
  6. Aliran producer — producer perjalanan menyisipkan data secara terus-menerus.
  7. 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:

FlagKapan dipakai
(tidak ada)Eksekusi pertama. Melakukan provisioning semuanya dan menghasilkan 50 juta baris sintetis (~12 mnt total).
--skip-seedInfrastruktur sudah ada dan TRIPS_RAW sudah berisi data. Melewati pembuatan data sintetis (~8 mnt dihemat).
--skip-dbtObjek Snowflake sudah ada tetapi Anda tidak perlu menjalankan ulang transformasi dbt (misalnya menguji perubahan Terraform).
--skip-supersetDocker tidak berjalan atau Anda belum memerlukan lapisan BI.
--full-refreshPaksa 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-superset

Catatan 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.

Di halaman ini

Track your progress?

Optional. We email a link to confirm your address; progress records once you open it.

Please use your work email address, not a personal one.

Progress tracking also requires accepting the current Terms of Service in Privacy settings.

ID