Cara Menggunakan dbt dengan Snowflake: Panduan Komprehensif
Pelajari cara mengintegrasikan dbt dengan Snowflake untuk alur kerja data modern. Mencakup penyiapan, transformasi, keamanan, CI/CD, dan optimisasi kinerja.
Seiring tim data modern mengadopsi tumpukan analitik yang semakin kompleks, terjadi pergeseran menuju pembuatan praktik standar dalam alur kerja rekayasa data. Alat seperti dbt (Data Build Tool) adalah kerangka kerja open-source yang membawa praktik terbaik rekayasa perangkat lunak—seperti kontrol versi, pengujian, dan dokumentasi—ke dalam alur kerja analitik.
Kombinasi dbt dan Snowflake (gudang data cloud-native) telah muncul sebagai pilar utama alur kerja rekayasa analitik. Panduan ini membahas konsep dasar, penyiapan, dan strategi implementasi lanjutan untuk mengintegrasikan dbt dengan Snowflake, membantu tim data mencapai pipeline data yang lebih mudah dipelihara, aman, dan berkinerja tinggi.
Mari bahas bagaimana dbt dan Snowflake bekerja bersama. Bagian ini memperkenalkan kapabilitas dbt dan menyoroti kompatibilitasnya dengan Snowflake serta manfaat mengintegrasikannya.
Apa itu dbt (Data Build Tool)?
dbt (Data Build Tool) adalah kerangka kerja open-source yang memungkinkan tim data mentransformasi, menguji, dan mendokumentasikan data langsung di gudang data menggunakan SQL yang diperkaya dengan templating Jinja.
dbt bukan bahasa pemrograman itu sendiri; dbt bertindak sebagai compiler, mengambil model SQL modular dan mengonversinya menjadi kueri SQL yang dapat dieksekusi yang berjalan di gudang data (misalnya, Snowflake).
Dengan memasukkan kontrol versi, pengujian otomatis, dan dokumentasi, dbt membawa praktik rekayasa perangkat lunak yang terbukti ke rekayasa analitik, menjadikan pipeline transformasi lebih andal, mudah dipelihara, dan dapat diskalakan sebagai bagian dari alur kerja ELT.
Komponen intinya mencakup compiler dan runner. Berikut fungsinya:
Compiler: Pengguna dbt menulis kode dalam bahasa Jinja, yang dikompilasi menjadi SQL mentah.
Runner: Kita menjalankan kode yang telah dikompilasi terhadap gudang data kita, seperti Snowflake, untuk memperoleh hasil.
Agar dbt berfungsi, ada beberapa komponen dasar yang membantu semuanya berjalan lancar:
Models: Pernyataan inti select yang disimpan sebagai file .sql.
Seeds: File .csv yang dapat dimuat dbt ke gudang data Anda sebagai referensi untuk model Anda.
Sources: Data di gudang data Anda yang ingin Anda tarik.
Data Tests: File .sql yang menguji data Anda untuk memastikan kepatuhan terhadap aturan Anda.
Documentation: dbt mendukung situs dokumentasi yang dapat menampilkan pohon model Anda.
Untuk detail lebih lanjut tentang dbt, saya merekomendasikan pengantar dbt yang sangat baik ini.
Gambaran integrasi dbt dan Snowflake
Dengan templating berbasis Jinja dari dbt yang dipadukan dengan tipe data kuat Snowflake, seperti Streams, kita bisa sangat kreatif dengan alur kerja transformasi.
Misalnya, mungkin kita ingin mentransformasi hanya data yang baru dimuat atau melakukan transformasi berbeda di tabel staging dibandingkan tabel produksi agar dapat melakukan pemeriksaan kesehatan data.
Keduanya dengan cepat menjadi pasangan yang umum untuk membantu data engineer mendapatkan kontrol dan fleksibilitas lebih dari pipeline data mereka, seiring semakin banyak perusahaan yang mengadopsi dbt secara rutin.
Manfaat Menggunakan dbt
Ada banyak manfaat dbt: metodologi pengembangan perangkat lunak tradisional, pengujian otomatis, dan peningkatan produktivitas.
Pengembangan berbasis kode
Kita dapat memperlakukan data dan SQL lebih seperti kode tradisional. Ini memberi kita akses ke modularitas, kemampuan uji, dan kontrol versi. Dengan memanfaatkan template dan pernyataan flow-control ala Python, kita mendapatkan fungsionalitas yang kuat dari dbt.
Pengujian otomatis
Dengan memanfaatkan konfigurasi bawaan data_test di dbt, kita dapat menjalankan pengujian terhadap data secara berkala tanpa pipeline SQL yang rumit. Bahkan, dbt sudah menyertakan beberapa pengujian dasar yang kuat yang dapat kita terapkan dengan mudah di file konfigurasi.
Peningkatan produktivitas
Di dalam dbt terdapat generator dokumentasi dan visualizer pipeline. Anggota tim baru dapat onboarding lebih cepat dan anggota yang ada mendapatkan pemahaman lebih dalam tentang alur data. Ini membantu mengurangi waktu pemanasan dan meningkatkan pemahaman menyeluruh semua orang tentang alur kerja.
Manfaat menggunakan Snowflake
Ada banyak manfaat menggunakan platform berbasis cloud Snowflake. Arsitekturnya sangat baik, memisahkan sumber daya penyimpanan dan komputasi untuk meminimalkan konflik sumber daya dan meningkatkan biaya. Snowflake memanfaatkan zero-copy cloning, yang memungkinkan pengguna membuat klon basis data tanpa penyimpanan tambahan.
Selain itu, Snowflake mendukung beberapa tipe data tabel yang kompleks, seperti dynamic tables dan Streams, yang memungkinkan logika penyegaran inkremental. Untuk detail lebih lanjut tentang Snowflake sebagai platform, lihat artikel yang menjelaskan cara kerja Snowflake.
Yang terpenting, fitur-fitur ini sangat melengkapi dbt. Kita dapat memanfaatkan penyegaran inkremental untuk membantu dbt memicu transformasi berdasarkan data baru. Kita juga dapat memanfaatkan pemisahan komputasi dan penyimpanan Snowflake yang memungkinkan dbt melakukan transformasi yang lebih intensif komputasi tanpa memengaruhi kemampuan mengunggah dan menyimpan data.
Semua ini hadir dengan kemampuan Snowflake untuk melakukan penskalaan cepat dan model biaya pay-per-use. Seiring kompleksitas skrip dbt meningkat, kita dapat dengan mudah memperbesar warehouse komputasi Snowflake untuk memenuhi kebutuhan tersebut. Pada saat yang sama, kita dapat menggunakan pemantauan Snowflake untuk merampingkan warehouse dan menggunakan dbt untuk menyederhanakan kinerja kueri.
Sinergi utama antara dbt dan Snowflake
Jika digabungkan, Snowflake dan dbt saling melengkapi dengan sangat baik. Penyetelan berkelanjutan Snowflake membantu menjaga biaya berbasis cloud tetap rendah. dbt dapat memanfaatkan metode partisi tabel seperti clustering keys dan caching Snowflake untuk meningkatkan overhead data.
Snowflake tidak mudah dikelola dengan alat seperti Git. Karena dbt dibangun berdasarkan prinsip yang sama dengan bahasa pengkodean lainnya, kita dapat menggunakan alur kerja berbasis Git untuk membantu mengelola proses pengembangan dengan lebih mudah menggunakan pipeline CI/CD. Ini dapat membantu kontrol versi pipeline kita, yang akan menantang jika dilakukan sepenuhnya di Snowflake.
Untuk membantu pengembang berkolaborasi lebih mudah, dbt juga memiliki UI yang menampilkan semua job dbt Anda di satu tempat. Ini membantu tim melacak proses bersama dan memastikan proses berjalan semestinya. Selain itu, dbt baru-baru ini memperkenalkan Studio IDE yang memungkinkan integrasi Git dan basis data dengan mudah beserta alur kerja pengujian. Beberapa tim bahkan mungkin memilih menggunakan UI Snowflake untuk integrasi penuh.
Mari bahas beberapa dasar cara mengonfigurasi Snowflake dan dbt untuk integrasi yang tepat. Kita juga akan membahas dasar praktik terbaik desain struktur proyek.
Prasyarat dan penyiapan
Kita akan mulai dengan penyiapan basis data Snowflake lalu membahas penyiapan dbt.
Prasyarat Snowflake
Anda memerlukan basis data, skema, dan virtual warehouse khusus yang akan menyimpan data dbt Anda. Selain itu, Anda memerlukan peran pengguna dbt spesifik yang dapat diakses dbt. Saat menyiapkan dbt, Anda akan memberikan kredensial pengguna tersebut agar dbt dapat berkomunikasi dengan Snowflake. Di bagian ini, saya akan memberikan beberapa panduan dasar, namun untuk detail lebih lanjut tentang cara mengelola basis data dan peran pengguna Snowflake, silakan ikuti kursus Introduction to Snowflake ini.
Buat basis data, skema, dan virtual warehouse khusus
CREATEDATABASE analytics_db;CREATESCHEMA analytics_db.transformations;CREATE WAREHOUSE dbt_wh
WITH WAREHOUSE_SIZE ='XSMALL'
AUTO_SUSPEND =60
AUTO_RESUME =TRUE
INITIALLY_SUSPENDED =TRUE;Didukung oleh
Buat peran dan pengguna dbt khusus. Ini penting untuk memungkinkan dbt mengakses server Snowflake Anda
CREATE ROLE dbt_role;GRANTUSAGEON WAREHOUSE dbt_wh TO ROLE dbt_role;GRANTUSAGEONDATABASE analytics_db TO ROLE dbt_role;GRANTUSAGE,CREATESCHEMAONDATABASE analytics_db TO ROLE dbt_role;GRANTALLPRIVILEGESONSCHEMA analytics_db.transformations TO ROLE dbt_role;CREATEUSER dbt_user PASSWORD='StrongPassword123'
DEFAULT_ROLE = dbt_role
DEFAULT_WAREHOUSE = dbt_wh
DEFAULT_NAMESPACE = analytics_db.transformations;GRANT ROLE dbt_role TOUSER dbt_user;Didukung oleh
Terakhir, temukan nama akun untuk akun Snowflake Anda. Kita akan memerlukannya nanti saat menyiapkan dbt. Ini dapat ditemukan di pengaturan dan detail akun Anda di Snowflake. Silakan merujuk ke dokumentasi Snowflake untuk detail lebih lanjut.
Konfigurasi dbt
Untuk menjalankan dbt, kita perlu memasangnya menggunakan pip lalu mengonfigurasi file profiles.yml.
Pasang dbt di lingkungan Python Anda. Anda memerlukan paket dbt-core dan dbt-snowflake
Konfigurasikan file profiles.yml dan simpan ke ~/.dbt/profiles.yml
snowflake-db:
target:dev
outputs:dev:type: snowflake
account:[account_id from earlier]user:[dbt_user]password:[dbt_pw]role:[dbt_role]
warehouse:[dbt_warehouse]database:[dbt_database]schema:[dbt_schema]threads:4client_session_keep_alive:Falsequery_tag:[anything]Didukung oleh
Perintah ini akan memeriksa apakah pengaturan koneksi Anda valid dan akan menampilkan error jika tidak.
Hal yang perlu dipertimbangkan: alih-alih menaruh pengguna dan kata sandi langsung di file profiles.yml, cobalah menggunakan variabel lingkungan. Misalnya, dbt_password dapat disimpan ke variabel lingkungan SNOWFLAKE_PASSWORD. Lalu di profiles.yml Anda menulis password: “{{env_var(‘SNOWFLAKE_PASSWORD’)}}”. Ini membantu mencegah orang melihat kredensial di file konfigurasi dan menambah sedikit keamanan.
Pengaturan kontrol versi
Terhubung ke Git membantu memaksimalkan konfigurasi dbt Anda. Langkah tepatnya bisa bervariasi jika Anda melakukannya dalam lingkungan perusahaan. Namun prinsip umumnya sederhana. Buat repositori di GitHub atau GitLab. Lalu tautkan akun dbt Anda ke akun GitHub/GitLab tersebut. Setelah selesai, Anda dapat melakukan git clone ke repositori Anda! Untuk informasi lebih lanjut tentang menghubungkan Git ke dbt, lihat dokumentasi Git dbt untuk platform Anda.
Desain struktur proyek
Struktur proyek yang konsisten dan berbasis template membantu proyek baru berjalan lebih cepat dengan menyediakan tempat tetap untuk setiap komponen.
Mengorganisasi model
Strukturkan proyek Anda ke dalam folder staging, intermediate, dan marts. Di dalam masing-masingnya, Anda dapat menentukan departemen berbeda yang memiliki model dan SQL masing-masing.
Staging: Data mentah yang dibersihkan dan diubah nama.
Intermediate: Join atau transformasi dengan logika berat.
Marts: Tabel siap bisnis akhir.
Untuk setiap file konfigurasi model staging, intermediate, dan marts, Anda mungkin ingin mengatur konfigurasi +materialized untuk menentukan bagaimana output SQL dibuat di Snowflake. Kita dapat memilih view, table, atau dataset incremental.:
View: Default, ringan.
Table: Di-cache tetapi menggunakan lebih banyak penyimpanan.
Incremental: Untuk dataset besar dengan penambahan sering.
Itu mungkin terlihat seperti ini:
# The following dbt_project.yml configures a project that looks like this:# .# └── models# ├── csvs# │ ├── employees.sql# │ └── goals.sql# └── events# ├── stg_event_log.sql# └── stg_event_sessions.sqlname: my_project
version: 1.0.0
config-version:2models:my_project:events:# materialize all models in models/events as tables+materialized: table
csvs:# this is redundant, and does not need to be set+materialized: viewDidukung oleh
Optimisasi Lanjutan dan Macro
Salah satu keunggulan besar mengintegrasikan dbt dan Snowflake adalah kita mendapatkan optimisasi dari kedua platform. Untuk Snowflake, kita dapat menggunakan berbagai cara menangani kueri agar berjalan lebih cepat. Untuk dbt, kita dapat mengoptimalkan penulisan kode dengan macro dan teknik materialization.
Teknik penyetelan kinerja
Ada beberapa fitur unik Snowflake yang dapat kita manfaatkan untuk meningkatkan kinerja kueri.
Optimisasi kueri
Dua cara besar kita melakukan optimisasi di Snowflake adalah predicate pushdown dan clustering keys.
Predicate pushdown adalah gagasan mengubah kapan Snowflake melakukan penyaringan agar membaca lebih sedikit data. Misalnya, bayangkan kita mengkueri data dengan dua lapisan penyaringan: satu filter keamanan dan satu filter kategoris.
Filter keamanan menentukan siapa yang dapat melihat bagian tertentu dari tabel berdasarkan peran keamanan. Filter kategoris berada di pernyataan WHERE dalam kueri. Snowflake akan memilih filter yang dijalankan terlebih dahulu yang memerlukan pembacaan data paling sedikit.
Untuk membantu predicate pushdown ini, kita dapat mempertimbangkan clustering keys. Meskipun Snowflake cukup baik dalam melakukan clustering tabel, ketika data mencapai beberapa TB, menjadi menantang bagi Snowflake untuk mempertahankan partisi yang masuk akal.
Dengan mendefinisikan clustering keys, kita dapat membantu Snowflake melakukan partisi data dengan cara yang sesuai dengan pola kueri kita. Misalnya, mungkin kita menyeleksi dua kolom yang selalu dipakai bersama, seperti tanggal dan jenis properti. Setiap jenis properti mungkin memiliki jumlah tanggal yang cukup kecil sehingga repartisi menjadi masuk akal dan lokasi data menjadi efektif.
Menggabungkan clustering keys dengan optimisasi predicate pushdown Snowflake dapat membuat navigasi tabel besar jauh lebih efisien.
Penskalaan warehouse
Penggunaan sumber daya dalam sistem pay-per-use seperti Snowflake itu penting! Anda ingin berpegang pada beberapa prinsip sederhana:
Gunakan auto-suspend Snowflake untuk menangguhkan warehouse saat pipeline Anda offline dalam jangka waktu lama
Saat Anda mengakses warehouse setelah jeda waktu, auto-resume akan memungkinkan Anda memulai ulang warehouse sesuai kebutuhan
Pastikan menggunakan warehouse XS atau S untuk pengembangan dan skala naik sesuai kebutuhan untuk produksi
Penyesuaian warehouse sederhana ini akan membuat penggunaan Snowflake Anda lebih efisien dalam jangka panjang.
Dynamic Tables vs model incremental
Di sisi dbt, kita dapat memanfaatkan dynamic tables dan model incremental untuk menyederhanakan logika pembaruan.
Dynamic Tables adalah tipe tabel Snowflake yang otomatis menyegarkan berdasarkan waktu jeda yang ditentukan. dbt memiliki kemampuan mematerialisasi dynamic tables sebagai bagian dari konfigurasinya dan menyiapkannya serupa dengan di Snowflake.
models:<resource-path>:+materialized: dynamic_table
+on_configuration_change: apply | continue | fail
+target_lag: downstream | <time-delta>+snowflake_warehouse: <warehouse-name>+refresh_mode: AUTO | FULL | INCREMENTAL
+initialize: ON_CREATE | ON_SCHEDULEDidukung oleh
Ini praktis untuk pipeline transfer data sederhana yang tidak memerlukan SQL kompleks. Bagian terbaiknya, kita dapat terhubung ke dynamic tables ini dan mendapatkan data segar sesuai kebutuhan.
Cara fleksibel lainnya untuk membangun tabel adalah menggunakan model incremental. Saat menulis SQL, kita memfilter pada kolom yang memberi tahu data mana yang baru. Lalu, kita menggunakan macro is_incremental() untuk memberi tahu dbt agar hanya menggunakan filter tersebut saat kita mengonfigurasi tabel incremental yang termaterialisasi.
SQL contoh Anda mungkin terlihat seperti ini, dari dokumentasi dbt:
{{
config(
materialized='incremental')
}}
select*,
my_slow_function(my_column)from {{ ref('app_data_events') }}
{%if is_incremental()%}
-- this filter will only be applied on an incremental run-- (uses >= to include records whose timestamp occurred since the last run of this model)-- (If event_time is NULL or the table is truncated, the condition will always be true and load all records)where event_time >=(selectcoalesce(max(event_time),'1900-01-01')from {{ this }} )
{% endif %}Didukung oleh
Logika yang dapat digunakan ulang dengan macro
Anda baru saja melihat rujukan ke sesuatu yang disebut “macro”. Ini adalah potongan kode yang dapat digunakan ulang di dbt. Bisa berupa perhitungan yang didaur ulang atau transformasi yang sering terjadi.
Macro khusus Snowflake
Kita membuat macro menggunakan templating Jinja. Salah satu kasus penggunaan umum adalah mengklon basis data sebelum mengerjakannya.
{% macro clone_tables(table_to_clone)-%}
–- shows alltableswithin a schema
{%set all_tables_query %}
showtablesinschema {{ clone_tables }}
{% endset %}
-- take the set results and use the run_query macro
{%set results = run_query(all_tables_query)%}
{{ "create or replace schema "~ generate_schema_name(var("custom_tables_list"))~";" }}
--execute the cloning function
{%ifexecute%}
{%for result_row in results %}
{{ log("create table "~ generate_schema_name(var("custom_tables_list"))~"."~ result_row[1]~" clone "~ clone_tables~"."~ result_row[1]~";") }}
{{ "create table "~ generate_schema_name(var("custom_tables_list"))~"."~ result_row[1]~" clone "~ clone_tables~"."~ result_row[1]~";" }}
{% endfor %}
{% endif %}
{%- endmacro %}Didukung oleh
Template ini mengambil skema yang diberikan, menghasilkan daftar tabel, lalu mengklonnya ke warehouse/skema yang disediakan dalam konfigurasi dbt Anda. Anda kemudian dapat menggunakan macro ini dalam kode dbt atau saat memulai dbt.
Untuk berlatih lebih banyak dengan Jinja di dbt, saya sangat merekomendasikan studi kasus membangun model data e-commerce dengan dbt ini. Ia membahas templating Jinja yang kompleks dengan dbt dan memberi Anda pengalaman praktis tingkat lanjut!
Masking PII dengan dbt:
Saat bekerja dengan informasi pelanggan, ada kemungkinan kita berhadapan dengan informasi yang dapat mengidentifikasi pribadi (PII) dan perlu menyembunyikannya di basis data. Ini mudah dilakukan dengan Snowflake! Kita dapat menggunakan CREATE MASKING POLICY untuk memberi tahu Snowflake kolom dan tipe data apa yang perlu dimasking saat kueri dijalankan. Kebijakan ini memastikan tidak ada PII yang bocor saat mengkueri informasi sensitif.
Kita kemudian dapat menggunakan tests dbt dengan SQL kustom yang memeriksa apakah tabel melakukan masking dengan benar. Misalnya, jika kita mendefinisikan kebijakan masking yang hanya mengizinkan peran ANALYST untuk melihat PII, seperti ini:
CREATEORREPLACE MASKING POLICY email_mask AS(val string)returns string ->CASEWHEN current_role()IN('ANALYST')THEN VAL
ELSE'*********'END;Didukung oleh
Maka, menggunakan peran pengguna dbt_account untuk mengkueri data harus mengembalikan string '*********'.
Jika pengujian kita melakukan sesuatu yang sederhana seperti:
SELECT*FROMschema.tableWHERE email <>'*********'Didukung oleh
Jika pengujian ini mengembalikan hasil, maka harus dianggap gagal. Tidak boleh ada email yang kembali selain string yang dimasking. Kita lalu harus memeriksa kebijakan masking di Snowflake dan terus menguji hingga berfungsi dengan benar.
Keamanan dan Tata Kelola
Seperti biasa, keamanan adalah pilar utama akses cloud. Kita akan membahas beberapa dasar keamanan dan perlindungan data di bagian ini.
Kerangka kontrol akses
Kerangka keamanan utama Snowflake adalah role-based access control (RBAC) dan penggunaan service account.
Role-Based Access Control (RBAC)
Mendefinisikan hak istimewa RBAC memungkinkan kita menerapkan pengaturan keamanan ke sekelompok pengguna tanpa harus menugaskannya secara manual satu per satu. Ini memudahkan pemeliharaan.
Seperti disebutkan di atas, kita membuat peran menggunakan pernyataan CREATE ROLE. Untuk memberikan izin kita menggunakan GRANT <privilege> … TO ROLE dan sebaliknya menghapusnya melalui REVOKE <privilege> … FROM ROLE.
Berikut beberapa praktik terbaik:
Gunakan peran berbasis hak istimewa minimum. Misalnya, berikan akses baca saja ke peran seperti dbt_reader, akses pembuatan tabel ke dbt_writer, dan akses hapus hanya ke akun admin seperti dbt_admin.
Pertimbangkan membuat peran yang hanya memiliki akses ke lingkungan tertentu seperti dev, staging, dan prod.
Service account
Service account adalah akun berbasis mesin khusus yang berinteraksi tanpa keterlibatan manusia. Akun-akun ini tidak memiliki username dan password. Sebagai gantinya, mereka menggunakan public key dan pembatasan jaringan untuk meminimalkan risiko.
Membuat service account mungkin terlihat seperti ini:
CREATEUSER dbt_service
RSA_PUBLIC_KEY =<keysring>Didukung oleh
Dengan cara ini, Anda memiliki satu akun yang dikelola admin, dan Anda tidak perlu lagi mengkhawatirkan pengguna individual. Disarankan untuk merotasi key secara berkala agar tidak bocor. Juga, pastikan memantau aktivitas jaringan dengan cermat menggunakan LOGIN_HISTORY Snowflake.
Perlindungan data
Lindungi data dan login Anda. Meskipun kita mungkin meng-hardcode kredensial sebagai contoh, sebenarnya itu praktik yang buruk. Gunakan secret manager seperti AWS Secrets Manager atau GitHub Secrets untuk menyimpan kredensial penting.
Ini memungkinkan Anda menyimpan kredensial secara online yang hanya dapat diakses pengguna dengan RSA/key keamanan yang sesuai. Tidak ada yang dapat melihat nilai sebenarnya dan rotasi kata sandi/key menjadi mudah dengan manajemen otomatis mereka.
Pastikan koneksi apa pun diamankan dengan benar dan pengguna berada di jaringan enterprise yang sesuai untuk mengakses data. Ini sering ditetapkan dengan menggunakan VPN seperti GlobalProtect. Karena kita terhubung ke Snowflake, banyak enkripsi end-to-end ditangani oleh cloud. Ini salah satu manfaat lain menggunakan Snowflake!
Terakhir, kita ingin mengaudit aktivitas kita. Snowflake memiliki logging kueri melalui tabel seperti QUERY_HISTORY dan QUERY_HISTORY_BY_USER. Kita dapat memantau penggunaan, error, dan penyalahgunaan keamanan di log ini. Melalui dbt, kita dapat melacak run baru, perubahan, atau suntingan proyek dengan menggunakan pipeline kontrol versi.
Kontrol versi dan template pengkodean membantu menjaga pelacakan perubahan dan kepatuhan. Masalah apa pun yang diperkenalkan oleh perubahan dapat dengan mudah dicatat selama pull request wajib dan ditangani sebelum menjadi masalah.
Pemantauan dan Manajemen Biaya
Mari bahas cara menghemat uang! Tentu saja, dengan dbt. Memantau performa model kita sangat penting. Model yang dulunya berjalan lancar bisa menjadi lebih lambat dan kurang bertenaga seiring ukuran tabel meningkat.
Pemantauan kinerja
Dengan dbt, cara terbaik memantau kinerja adalah menggunakan paket bawaan seperti dbt-snowflake-monitoring atau alat eksternal seperti Looker dan Datafold untuk membantu visualisasi dan perbandingan data.
Penggunaan dbt-snowfake-monitoring
Memulai dbt-snowflake-monitoring cukup mudah! Di packages.yml dbt Anda tambahkan berikut ini:
packages:-package: get-select/dbt_snowflake_monitoring
version:[">=5.0.0","<6.0.0"]# We'll never make a breaking change without creating a new major version.Didukung oleh
Lalu, di setiap file YAML proyek, tambahkan berikut ini:
Sekarang Anda siap menggunakan paket ini untuk memantau hal-hal seperti penggunaan warehouse, durasi kueri, dan model yang gagal! Paket ini menggunakan akses pengguna dbt Anda yang ada untuk menulis tabel ke Snowflake yang berisi informasi berguna. Misalnya, jika saya ingin melihat pengeluaran warehouse bulanan, saya dapat menggunakan SQL berikut:
select
date_trunc(month,date)::dateasmonth,
warehouse_name,sum(spend_net_cloud_services)as spend
from daily_spend
where service in('Compute','Cloud Services')groupby1,2Didukung oleh
Peralatan eksternal
Alat eksternal seperti Looker atau Tableau dapat diintegrasikan langsung dengan dbt untuk visualisasi data dan performa yang mudah. Untuk peringatan, dbt dapat mengirim email atau notifikasi Slack.
Untuk perbandingan yang lebih mendalam, tumpukan eksternal seperti Datafold memberikan wawasan lebih dalam tentang bagaimana kualitas data terpengaruh oleh perubahan. Datafold mengotomatisasi data diff pada setiap perubahan kode yang Anda buat. Ini memungkinkan anggota tim lain dengan mudah meninjau kode Anda dan dampaknya terhadap data. Pengujian regresi otomatis semacam ini memungkinkan kita mempertahankan kualitas data tanpa harus terus-menerus membangun pemeriksaan dan alat baru.
Teknik optimisasi biaya
Kita tidak dapat menghindari menjalankan proses ETL, tetapi kita pasti dapat merencanakan sebelumnya untuk meminimalkan dampak biaya komputasi dan penyimpanan. Berkat desain terpisah Snowflake, kita dapat mengoptimalkan warehouse dan penyimpanan secara terpisah untuk menghadirkan lingkungan yang lebih fleksibel dan hemat biaya.
Untuk warehouse, cara terbaik adalah meminimalkan waktu idle. Sebarkan pipeline otomatis Anda sedemikian rupa untuk mengurangi waktu idle, lonjakan kebutuhan komputasi, dan kompetisi sumber daya.
Pantau secara berkala menggunakan tabel WAREHOUSE_LOAD_HISTORY dan QUERY_HISTORY untuk memahami bagaimana sumber daya digunakan. Praktik terbaiknya adalah mulai dengan XS. Jika kueri berjalan terlalu lambat, saatnya memperbesar ukuran sesuai SLA tim Anda.
Untuk penyimpanan, praktik terbaik adalah menyingkirkan tabel yang tidak diperlukan. Meskipun Snowflake sendiri tidak memiliki cold-tier seperti AWS dan Google, Anda dapat memilih memindahkan data dari Snowflake ke AWS/Google untuk cold-tier ini dan mengurangi biaya penyimpanan.
Kebijakan retensi data dapat dengan jelas menguraikan linimasa untuk tabel yang jarang digunakan dan kapan akan dipindahkan ke penyimpanan dingin.
Untuk tabel besar yang sering tumbuh, pantau dengan saksama. Saat semakin besar, kemampuan Snowflake untuk secara otomatis dan efisien melakukan partisi akan menurun. Manfaatkan automatic clustering yang disebutkan di atas untuk membantu Snowflake mempartisi data Anda dengan lebih baik. Partisi yang lebih baik menghasilkan waktu baca penyimpanan yang lebih sedikit dan dengan demikian menghemat biaya.
CI/CD dan Otomasi
Berkat integrasi native dbt dengan kontrol versi, CI/CD dan pipeline otomatis menjadi mudah. Kita akan membahas beberapa opsi orkestrasi otomatis dan praktik terbaik pengujian.
Orkestrasi pipeline
Dengan dbt Cloud, kita dapat menggunakan Snowflake Tasks untuk memicu run terjadwal proyek dbt kita. Caranya adalah kita terlebih dahulu membuat proyek dbt di Snowflake menggunakan repositori Git kita, lalu kita membuat task yang mengeksekusi proyek dbt tersebut.
Misalnya, kita dapat melakukan hal berikut untuk membuat proyek dbt:
CREATE DBT PROJECT sales_db.dbt_projects_schema.sales_model
FROM'@sales_db.integrations_schema.sales_dbt_git_stage/branches/main'COMMENT='generates sales data models';Didukung oleh
Lalu kita menggunakan kode berikut untuk menjalankan proyek tersebut:
Bahkan, ini begitu komprehensif sehingga kita dapat menjalankan pengujian setelahnya untuk memastikan proyek berjalan dengan benar:
CREATEORALTER TASK sales_db.dbt_projects_schema.test_dbt_project
WAREHOUSE = sales_warehouse
AFTER run_dbt_project
ASEXECUTE DBT PROJECT sales_db.dbt_projects_schema.test_dbt_project args='test --target prod';Didukung oleh
Untuk penjadwalan, kita dapat memilih menetapkan waktu tetap seperti 60 MINUTES dan 12 HOURS atau menggunakan cron seperti USING CRON 0 9 * * * UTC..
Namun, model kita jarang statis, dan kita sering harus melakukan iterasi. Bisa memakan waktu untuk membangun setiap bagian pipeline secara manual. Di sinilah GitHub Actions masuk. Kita sering menggunakan GitHub Actions dalam pipeline CI/CD untuk mengotomatisasi pengujian dan pembangunan kode.
GitHub Actions dirancang menggunakan file YAML di dalam folder .github/workflows di dalam repositori. Kita dapat membuatnya dipicu setiap kali kita membuat pull request, sehingga kita menjalankan beberapa pengujian dbt.
name: dbt pull test
# CRON job to run dbt at midnight UTC(!) everydayon:pull_request:types:
openedreopened
# Setting some Env variables to work with profiles.yml# This should be your snowflake secretsenv:DBT_PROFILE_TARGET: prod
DBT_PROFILE_USER: ${{ secrets.DBT_PROFILE_USER }}DBT_PROFILE_PASSWORD: ${{ secrets.DBT_PROFILE_PASSWORD }}jobs:dbt_run:name: dbt testing on pull request
runs-on: ubuntu-latest
timeout-minutes:90# Steps of the workflow:steps:-name: Setup Python environment
uses: actions/setup-python@v4
with:python-version:"3.11"-name: Install dependencies
run:|
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
-name: Install dbt packages
run: dbt deps
# optionally use this parameter# to set a main directory of dbt project:# working-directory: ./my_dbt_project-name: Run tests
run: dbt test
# working-directory: ./my_dbt_projectDidukung oleh
Menyiapkan automasi Anda dengan benar dapat memudahkan pekerjaan dan membantu pengembang lain melihat model yang telah diuji. Ini merampingkan proses pengembangan dengan mengurangi kebutuhan pengujian manual.
Kerangka pengujian
dbt hadir dengan suite pengujian yang kuat. dbt menyediakan beberapa pengujian data generik bawaan yang dapat ditetapkan langsung pada model Anda dan memungkinkan logika SQL kustom. Pengujian generik ditetapkan pada kolom tertentu di model Anda dan memeriksa apakah kolom tersebut lulus pengujian. Pengujian bawaan adalah sebagai berikut:
unique: setiap nilai di kolom ini harus unik
not_null: tidak boleh ada nilai null di kolom
accepted_values: memeriksa apakah nilai berada dalam daftar nilai yang diterima
relationships: memeriksa apakah nilai di kolom ini ada di tabel terkait lainnya
version:2models:-name: orders
columns:-name: order_id
data_tests:# makes sure this column is unique and has no nulls- unique
- not_null
-name: status
data_tests:#makes sure this column only has the below values-accepted_values:values:['placed','shipped','completed','returned']-name: customer_id
data_tests:# makes sure that the customer ids in this column are ids in the customers table-relationships:to: ref('customers')
field: idDidukung oleh
Kita dapat menggunakan SQL kustom untuk membuat pengujian yang lebih spesifik dan generik. Tujuannya adalah pengujian mengembalikan baris gagal. Jadi jika ada hasil, pengujian dianggap gagal. File SQL kustom ini berada di direktori tests kita.
Sebagai contoh, jika kita ingin mengetahui apakah ada penjualan yang bernilai negatif, kita dapat menggunakan berikut ini:
select
order_id,sum(amount)as total_amount
from {{ ref('sales') }}
groupby1having total_amount <0Didukung oleh
Kita kemudian akan mereferensikan pengujian tersebut di file schema.yml di dalam folder test kita:
version:2data_tests:-name: assert_sales_amount_is_positive
description:>
Sales should always be positive and are not inclusive of refundsDidukung oleh
Jika kita ingin menggunakan jenis pemeriksaan ini pada lebih banyak tabel dan kolom, kita mungkin ingin mengubahnya menjadi pengujian generik. Bentuknya mungkin seperti ini:
{% test negative_values(model,group,sum_column)%}
select {{group}},sum({{sum_column}})as total_amt
from {{ model }}
groupby1having total_amt <0
{% endtest %}Didukung oleh
Kita sekarang dapat menggunakan pengujian ini di file yaml model kita seperti pengujian generik lainnya yang disertakan dbt! Anda dapat memeriksa penumpang negatif pada perjalanan atau laba negatif, dan seterusnya! Kemungkinannya tak terbatas.
Untuk membuat pengujian ini lebih mulus dan sederhana, kita dapat memanfaatkan zero-copy cloning Snowflake. CREATE TABLE <object> CLONE <source_object> Snowflake dapat membuat klon tanpa salin di lingkungan dev/test Anda.
Kemudian, semua pengujian dan CI Anda dapat dilakukan terhadap objek yang diklon. Keuntungannya adalah kita tidak memerlukan ruang penyimpanan tambahan untuk memiliki lingkungan pengujian yang aman. Selain itu, kapan pun kita membutuhkan lebih banyak ruang pengujian, kita dapat membuat lebih banyak lingkungan pengujian dengan kloning instan ini.
Tren yang Muncul dan Prospek Masa Depan
Mari lihat peningkatan dan tren masa depan dari dbt dan Snowflake.
Pengembangan integrasi native
dbt terus meningkatkan integrasinya baik dengan produk intinya maupun dengan AI. Di Snowflake, kita dapat menggunakan Snowsight sebagai antarmuka UI untuk membantu mengelola workspace dbt kita. Dengan berintegrasi lebih mulus ke lingkungan Snowflake, kita meminimalkan kebutuhan untuk mengerjakan model dbt secara eksternal. Sebaliknya, kita dapat memusatkan alur kerja dengan memungkinkan tim mengedit dan berkolaborasi melalui UI Snowflake.
Untuk mempercepat pengembangan, dbt menawarkan asisten bertenaga AI bernama dbt Copilot. Asisten ini dapat diakses melalui dbt Studio IDE, Canvas, atau Insights dan menggunakan pemrosesan bahasa alami untuk mempercepat bagian pengembangan model yang memakan waktu, seperti menulis dokumentasi dan membuat pengujian.
dbt Copilot bahkan dapat digunakan untuk membantu onboarding analis baru dengan memberikan ringkasan singkat proyek dan model.
Gunakan kedua alat ini untuk mempercepat waktu ke produksi dan mempersingkat waktu pengembangan sehingga tim Anda dapat menangani masalah data yang lebih sulit dan menantang di organisasi Anda.
Integrasi Machine Learning
Pipeline machine learning memerlukan data yang selalu bersih dan dirancang dengan baik. dbt adalah alat yang tepat untuk pipeline transformasi data yang memberi makan model machine learning. Kita dapat memanfaatkan fleksibilitas dan kekuatan dbt untuk mengotomatisasi transformasi data yang terintegrasi mulus ke dalam pipeline machine learning kita.
Misalnya, kita dapat mentransformasi data langsung ke dalam warehouse machine learning. Data ini kemudian dapat digunakan dengan Cortex AI Snowflake untuk mendapatkan wawasan yang lebih dalam. Jika kita memiliki banyak model yang memerlukan transformasi serupa, templating dbt dapat menyederhanakan cara kita membersihkan data dan memberikan konsistensi lebih serta tata kelola data yang lebih mudah. Untuk memahami alat AI Snowflake, baca panduan tentang Snowflake Arctic, yaitu LLM milik Snowflake.
Eksekusi terkontainerisasi
Berkat dukungan Python native Snowflake dan Snowpark API untuk Python, kita dapat menjalankan kode secara lokal tanpa harus memindahkan data keluar dari Snowflake. Level berikutnya adalah menggunakan Snowpark Containers, yang saat ini (saat penulisan) hanya tersedia untuk wilayah AWS dan Azure, untuk menjalankan eksekusi kode dbt kita secara terisolasi sepenuhnya.
Untuk melakukannya, kita mengemas model dbt dan lingkungan ke dalam kontainer, yang kemudian disimpan di repositori image Snowflake.
Kita kemudian dapat menggunakan proyek dbt terkontainerisasi ini dengan mudah di dalam Snowpark. Manfaat utamanya? Kemampuan untuk lebih mudah memanfaatkan sumber daya Snowflake untuk transformasi data berbasis Python yang kompleks dan integrasi transformasi dbt dalam lingkungan Snowflake yang lebih luas.
Mengintegrasikan dbt dengan Snowflake memberdayakan tim data untuk membangun pipeline transformasi yang modular, tertata kelola, dan dapat diskalakan. Dengan fitur seperti pengujian otomatis, alur kerja CI/CD berbasis Git, dan skalabilitas yang mulus, tumpukan ini ideal untuk operasi data modern.
Untuk tetap kompetitif, tim data harus memprioritaskan:
Tata kelola data yang lebih baik untuk mempertahankan siklus hidup data
Visibilitas biaya yang ditingkatkan dan pemantauan kinerja berkelanjutan untuk menyetel ukuran warehouse dengan tepat
Kontainerisasi untuk reprodusibilitas dan penyatuan alur kerja analitik dan ML
Seiring kedua alat terus berkembang, integrasi dbt + Snowflake akan menjadi semakin kuat bagi tim rekayasa data. Jika Anda tertarik mempelajari lebih lanjut tentang dbt atau Snowflake, lihat sumber daya berikut:
Apa itu materialization di dbt, dan bagaimana pengaruhnya terhadap Snowflake?⌄
Materialization mendefinisikan bagaimana dbt membangun model: sebagai view, table, atau incremental table.
Apa perbedaan dynamic tables di Snowflake dengan model incremental dbt?⌄
Model incremental dbt dikelola dan dipicu secara manual, sedangkan dynamic tables Snowflake disegarkan otomatis berdasarkan perubahan dependensi. Gunakan dbt untuk fleksibilitas dan kontrol orkestrasi; gunakan dynamic tables untuk kesegaran data mendekati real-time.
Apa pilihan CI/CD untuk dbt dan Snowflake?⌄
dbt mendukung CI/CD menggunakan GitHub Actions, GitLab CI, atau Bitbucket Pipelines. Gabungkan kontrol versi dengan pengujian otomatis dan dbt run saat merge atau pull request untuk alur kerja yang andal.
Tren masa depan apa yang perlu saya perhatikan dalam ekosistem dbt + Snowflake?⌄
Perkembangan kunci meliputi:
Pengeditan dbt native di Snowsight,
Asisten bertenaga AI (misalnya, Ask dbt),
Integrasi Snowpark dan ML yang lebih dalam,
Dukungan data mesh melalui proyek modular,
Dynamic tables untuk operasi data mendekati real-time.
Saya seorang data scientist dengan pengalaman dalam analisis spasial, machine learning, dan pipeline data. Saya pernah bekerja dengan GCP, Hadoop, Hive, Snowflake, Airflow, dan proses data science/engineering lainnya.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Coba langsung Snowflake! Pelajari cara mengakses, memodelkan, dan mengelola data dalam pengenalan interaktif ini untuk insinyur data, analis, dan profesional BI.
Bangun pipa data yang andal dan skalabel dengan dbt Fundamentals, sebuah program praktis yang dirancang untuk analis data, insinyur data, dan insinyur analitik.
Seiring tim data modern mengadopsi tumpukan analitik yang semakin kompleks, terjadi pergeseran menuju pembuatan praktik standar dalam alur kerja rekayasa data. Alat seperti dbt (Data Build Tool) adalah kerangka kerja open-source yang membawa praktik terbaik rekayasa perangkat lunak—seperti kontrol versi, pengujian, dan dokumentasi—ke dalam alur kerja analitik.
Kombinasi dbt dan Snowflake (gudang data cloud-native) telah muncul sebagai pilar utama alur kerja rekayasa analitik. Panduan ini membahas konsep dasar, penyiapan, dan strategi implementasi lanjutan untuk mengintegrasikan dbt dengan Snowflake, membantu tim data mencapai pipeline data yang lebih mudah dipelihara, aman, dan berkinerja tinggi.
Jika Anda baru memulai dengan alat ini, saya merekomendasikan jalur keterampilan Snowflake Foundations dan kursus Introduction to dbt.
dbt-Snowflake: Konsep Dasar dan Manfaat
Mari bahas bagaimana dbt dan Snowflake bekerja bersama. Bagian ini memperkenalkan kapabilitas dbt dan menyoroti kompatibilitasnya dengan Snowflake serta manfaat mengintegrasikannya.
Apa itu dbt (Data Build Tool)?
dbt (Data Build Tool) adalah kerangka kerja open-source yang memungkinkan tim data mentransformasi, menguji, dan mendokumentasikan data langsung di gudang data menggunakan SQL yang diperkaya dengan templating Jinja.
dbt bukan bahasa pemrograman itu sendiri; dbt bertindak sebagai compiler, mengambil model SQL modular dan mengonversinya menjadi kueri SQL yang dapat dieksekusi yang berjalan di gudang data (misalnya, Snowflake).
Dengan memasukkan kontrol versi, pengujian otomatis, dan dokumentasi, dbt membawa praktik rekayasa perangkat lunak yang terbukti ke rekayasa analitik, menjadikan pipeline transformasi lebih andal, mudah dipelihara, dan dapat diskalakan sebagai bagian dari alur kerja ELT.
Komponen intinya mencakup compiler dan runner. Berikut fungsinya:
Agar dbt berfungsi, ada beberapa komponen dasar yang membantu semuanya berjalan lancar:
selectyang disimpan sebagai file .sql.Untuk detail lebih lanjut tentang dbt, saya merekomendasikan pengantar dbt yang sangat baik ini.
Gambaran integrasi dbt dan Snowflake
Dengan templating berbasis Jinja dari dbt yang dipadukan dengan tipe data kuat Snowflake, seperti Streams, kita bisa sangat kreatif dengan alur kerja transformasi.
Misalnya, mungkin kita ingin mentransformasi hanya data yang baru dimuat atau melakukan transformasi berbeda di tabel staging dibandingkan tabel produksi agar dapat melakukan pemeriksaan kesehatan data.
Keduanya dengan cepat menjadi pasangan yang umum untuk membantu data engineer mendapatkan kontrol dan fleksibilitas lebih dari pipeline data mereka, seiring semakin banyak perusahaan yang mengadopsi dbt secara rutin.
Manfaat Menggunakan dbt
Ada banyak manfaat dbt: metodologi pengembangan perangkat lunak tradisional, pengujian otomatis, dan peningkatan produktivitas.
Pengembangan berbasis kode
Kita dapat memperlakukan data dan SQL lebih seperti kode tradisional. Ini memberi kita akses ke modularitas, kemampuan uji, dan kontrol versi. Dengan memanfaatkan template dan pernyataan flow-control ala Python, kita mendapatkan fungsionalitas yang kuat dari dbt.
Pengujian otomatis
Dengan memanfaatkan konfigurasi bawaan
data_testdi dbt, kita dapat menjalankan pengujian terhadap data secara berkala tanpa pipeline SQL yang rumit. Bahkan, dbt sudah menyertakan beberapa pengujian dasar yang kuat yang dapat kita terapkan dengan mudah di file konfigurasi.Peningkatan produktivitas
Di dalam dbt terdapat generator dokumentasi dan visualizer pipeline. Anggota tim baru dapat onboarding lebih cepat dan anggota yang ada mendapatkan pemahaman lebih dalam tentang alur data. Ini membantu mengurangi waktu pemanasan dan meningkatkan pemahaman menyeluruh semua orang tentang alur kerja.
Manfaat menggunakan Snowflake
Ada banyak manfaat menggunakan platform berbasis cloud Snowflake. Arsitekturnya sangat baik, memisahkan sumber daya penyimpanan dan komputasi untuk meminimalkan konflik sumber daya dan meningkatkan biaya. Snowflake memanfaatkan zero-copy cloning, yang memungkinkan pengguna membuat klon basis data tanpa penyimpanan tambahan.
Selain itu, Snowflake mendukung beberapa tipe data tabel yang kompleks, seperti dynamic tables dan Streams, yang memungkinkan logika penyegaran inkremental. Untuk detail lebih lanjut tentang Snowflake sebagai platform, lihat artikel yang menjelaskan cara kerja Snowflake.
Yang terpenting, fitur-fitur ini sangat melengkapi dbt. Kita dapat memanfaatkan penyegaran inkremental untuk membantu dbt memicu transformasi berdasarkan data baru. Kita juga dapat memanfaatkan pemisahan komputasi dan penyimpanan Snowflake yang memungkinkan dbt melakukan transformasi yang lebih intensif komputasi tanpa memengaruhi kemampuan mengunggah dan menyimpan data.
Semua ini hadir dengan kemampuan Snowflake untuk melakukan penskalaan cepat dan model biaya pay-per-use. Seiring kompleksitas skrip dbt meningkat, kita dapat dengan mudah memperbesar warehouse komputasi Snowflake untuk memenuhi kebutuhan tersebut. Pada saat yang sama, kita dapat menggunakan pemantauan Snowflake untuk merampingkan warehouse dan menggunakan dbt untuk menyederhanakan kinerja kueri.
Sinergi utama antara dbt dan Snowflake
Jika digabungkan, Snowflake dan dbt saling melengkapi dengan sangat baik. Penyetelan berkelanjutan Snowflake membantu menjaga biaya berbasis cloud tetap rendah. dbt dapat memanfaatkan metode partisi tabel seperti clustering keys dan caching Snowflake untuk meningkatkan overhead data.
Snowflake tidak mudah dikelola dengan alat seperti Git. Karena dbt dibangun berdasarkan prinsip yang sama dengan bahasa pengkodean lainnya, kita dapat menggunakan alur kerja berbasis Git untuk membantu mengelola proses pengembangan dengan lebih mudah menggunakan pipeline CI/CD. Ini dapat membantu kontrol versi pipeline kita, yang akan menantang jika dilakukan sepenuhnya di Snowflake.
Untuk membantu pengembang berkolaborasi lebih mudah, dbt juga memiliki UI yang menampilkan semua job dbt Anda di satu tempat. Ini membantu tim melacak proses bersama dan memastikan proses berjalan semestinya. Selain itu, dbt baru-baru ini memperkenalkan Studio IDE yang memungkinkan integrasi Git dan basis data dengan mudah beserta alur kerja pengujian. Beberapa tim bahkan mungkin memilih menggunakan UI Snowflake untuk integrasi penuh.
Banyak tim data telah mulai memanfaatkan dbt dan Snowflake bersama-sama untuk mendapatkan hasil maksimal dari basis data mereka. Terus pelajari lebih lanjut tentang dbt dalam pengantar dbt untuk data engineer ini dan pahami cara pemodelan data Snowflake bekerja melalui kursus ini.
Dari Snowflake Quickstarts: Mempercepat dengan dbt Core & Snowflake
Implementasi dan Konfigurasi dbt Snowflake
Mari bahas beberapa dasar cara mengonfigurasi Snowflake dan dbt untuk integrasi yang tepat. Kita juga akan membahas dasar praktik terbaik desain struktur proyek.
Prasyarat dan penyiapan
Kita akan mulai dengan penyiapan basis data Snowflake lalu membahas penyiapan dbt.
Prasyarat Snowflake
Anda memerlukan basis data, skema, dan virtual warehouse khusus yang akan menyimpan data dbt Anda. Selain itu, Anda memerlukan peran pengguna dbt spesifik yang dapat diakses dbt. Saat menyiapkan dbt, Anda akan memberikan kredensial pengguna tersebut agar dbt dapat berkomunikasi dengan Snowflake. Di bagian ini, saya akan memberikan beberapa panduan dasar, namun untuk detail lebih lanjut tentang cara mengelola basis data dan peran pengguna Snowflake, silakan ikuti kursus Introduction to Snowflake ini.
Konfigurasi dbt
Untuk menjalankan dbt, kita perlu memasangnya menggunakan
piplalu mengonfigurasi fileprofiles.yml.dbt-coredandbt-snowflakeprofiles.ymldan simpan ke~/.dbt/profiles.ymlIni akan menjalankan inisialisasi langkah demi langkah yang menghasilkan file
profiles.ymljika diperlukan!debug:Perintah ini akan memeriksa apakah pengaturan koneksi Anda valid dan akan menampilkan error jika tidak.
Hal yang perlu dipertimbangkan: alih-alih menaruh pengguna dan kata sandi langsung di file
profiles.yml, cobalah menggunakan variabel lingkungan. Misalnya,dbt_passworddapat disimpan ke variabel lingkunganSNOWFLAKE_PASSWORD. Lalu diprofiles.ymlAnda menulispassword: “{{env_var(‘SNOWFLAKE_PASSWORD’)}}”. Ini membantu mencegah orang melihat kredensial di file konfigurasi dan menambah sedikit keamanan.Pengaturan kontrol versi
Terhubung ke
Gitmembantu memaksimalkan konfigurasi dbt Anda. Langkah tepatnya bisa bervariasi jika Anda melakukannya dalam lingkungan perusahaan. Namun prinsip umumnya sederhana. Buat repositori di GitHub atau GitLab. Lalu tautkan akun dbt Anda ke akun GitHub/GitLab tersebut. Setelah selesai, Anda dapat melakukangit cloneke repositori Anda! Untuk informasi lebih lanjut tentang menghubungkan Git ke dbt, lihat dokumentasi Git dbt untuk platform Anda.Desain struktur proyek
Struktur proyek yang konsisten dan berbasis template membantu proyek baru berjalan lebih cepat dengan menyediakan tempat tetap untuk setiap komponen.
Mengorganisasi model
Strukturkan proyek Anda ke dalam folder staging, intermediate, dan marts. Di dalam masing-masingnya, Anda dapat menentukan departemen berbeda yang memiliki model dan SQL masing-masing.
Setiap folder dalam models memiliki tujuan:
Untuk setiap file konfigurasi model staging, intermediate, dan marts, Anda mungkin ingin mengatur konfigurasi
+materializeduntuk menentukan bagaimana output SQL dibuat di Snowflake. Kita dapat memilih view, table, atau dataset incremental.:Itu mungkin terlihat seperti ini:
Optimisasi Lanjutan dan Macro
Salah satu keunggulan besar mengintegrasikan dbt dan Snowflake adalah kita mendapatkan optimisasi dari kedua platform. Untuk Snowflake, kita dapat menggunakan berbagai cara menangani kueri agar berjalan lebih cepat. Untuk dbt, kita dapat mengoptimalkan penulisan kode dengan macro dan teknik materialization.
Teknik penyetelan kinerja
Ada beberapa fitur unik Snowflake yang dapat kita manfaatkan untuk meningkatkan kinerja kueri.
Optimisasi kueri
Dua cara besar kita melakukan optimisasi di Snowflake adalah predicate pushdown dan clustering keys.
Predicate pushdown adalah gagasan mengubah kapan Snowflake melakukan penyaringan agar membaca lebih sedikit data. Misalnya, bayangkan kita mengkueri data dengan dua lapisan penyaringan: satu filter keamanan dan satu filter kategoris.
Filter keamanan menentukan siapa yang dapat melihat bagian tertentu dari tabel berdasarkan peran keamanan. Filter kategoris berada di pernyataan
WHEREdalam kueri. Snowflake akan memilih filter yang dijalankan terlebih dahulu yang memerlukan pembacaan data paling sedikit.Untuk membantu predicate pushdown ini, kita dapat mempertimbangkan clustering keys. Meskipun Snowflake cukup baik dalam melakukan clustering tabel, ketika data mencapai beberapa TB, menjadi menantang bagi Snowflake untuk mempertahankan partisi yang masuk akal.
Dengan mendefinisikan clustering keys, kita dapat membantu Snowflake melakukan partisi data dengan cara yang sesuai dengan pola kueri kita. Misalnya, mungkin kita menyeleksi dua kolom yang selalu dipakai bersama, seperti tanggal dan jenis properti. Setiap jenis properti mungkin memiliki jumlah tanggal yang cukup kecil sehingga repartisi menjadi masuk akal dan lokasi data menjadi efektif.
Menggabungkan clustering keys dengan optimisasi predicate pushdown Snowflake dapat membuat navigasi tabel besar jauh lebih efisien.
Penskalaan warehouse
Penggunaan sumber daya dalam sistem pay-per-use seperti Snowflake itu penting! Anda ingin berpegang pada beberapa prinsip sederhana:
auto-suspendSnowflake untuk menangguhkan warehouse saat pipeline Anda offline dalam jangka waktu lamaauto-resumeakan memungkinkan Anda memulai ulang warehouse sesuai kebutuhanPenyesuaian warehouse sederhana ini akan membuat penggunaan Snowflake Anda lebih efisien dalam jangka panjang.
Dynamic Tables vs model incremental
Di sisi dbt, kita dapat memanfaatkan dynamic tables dan model incremental untuk menyederhanakan logika pembaruan.
Dynamic Tables adalah tipe tabel Snowflake yang otomatis menyegarkan berdasarkan waktu jeda yang ditentukan. dbt memiliki kemampuan mematerialisasi dynamic tables sebagai bagian dari konfigurasinya dan menyiapkannya serupa dengan di Snowflake.
Ini praktis untuk pipeline transfer data sederhana yang tidak memerlukan SQL kompleks. Bagian terbaiknya, kita dapat terhubung ke dynamic tables ini dan mendapatkan data segar sesuai kebutuhan.
Cara fleksibel lainnya untuk membangun tabel adalah menggunakan model incremental. Saat menulis SQL, kita memfilter pada kolom yang memberi tahu data mana yang baru. Lalu, kita menggunakan macro
is_incremental()untuk memberi tahu dbt agar hanya menggunakan filter tersebut saat kita mengonfigurasi tabel incremental yang termaterialisasi.SQL contoh Anda mungkin terlihat seperti ini, dari dokumentasi dbt:
Logika yang dapat digunakan ulang dengan macro
Anda baru saja melihat rujukan ke sesuatu yang disebut “macro”. Ini adalah potongan kode yang dapat digunakan ulang di dbt. Bisa berupa perhitungan yang didaur ulang atau transformasi yang sering terjadi.
Macro khusus Snowflake
Kita membuat macro menggunakan templating Jinja. Salah satu kasus penggunaan umum adalah mengklon basis data sebelum mengerjakannya.
Template ini mengambil skema yang diberikan, menghasilkan daftar tabel, lalu mengklonnya ke warehouse/skema yang disediakan dalam konfigurasi dbt Anda. Anda kemudian dapat menggunakan macro ini dalam kode dbt atau saat memulai dbt.
Untuk berlatih lebih banyak dengan Jinja di dbt, saya sangat merekomendasikan studi kasus membangun model data e-commerce dengan dbt ini. Ia membahas templating Jinja yang kompleks dengan dbt dan memberi Anda pengalaman praktis tingkat lanjut!
Masking PII dengan dbt:
Saat bekerja dengan informasi pelanggan, ada kemungkinan kita berhadapan dengan informasi yang dapat mengidentifikasi pribadi (PII) dan perlu menyembunyikannya di basis data. Ini mudah dilakukan dengan Snowflake! Kita dapat menggunakan
CREATE MASKING POLICYuntuk memberi tahu Snowflake kolom dan tipe data apa yang perlu dimasking saat kueri dijalankan. Kebijakan ini memastikan tidak ada PII yang bocor saat mengkueri informasi sensitif.Kita kemudian dapat menggunakan
testsdbt dengan SQL kustom yang memeriksa apakah tabel melakukan masking dengan benar. Misalnya, jika kita mendefinisikan kebijakan masking yang hanya mengizinkan peranANALYSTuntuk melihat PII, seperti ini:Maka, menggunakan peran pengguna
dbt_accountuntuk mengkueri data harus mengembalikan string'*********'.Jika pengujian kita melakukan sesuatu yang sederhana seperti:
Jika pengujian ini mengembalikan hasil, maka harus dianggap gagal. Tidak boleh ada email yang kembali selain string yang dimasking. Kita lalu harus memeriksa kebijakan masking di Snowflake dan terus menguji hingga berfungsi dengan benar.
Keamanan dan Tata Kelola
Seperti biasa, keamanan adalah pilar utama akses cloud. Kita akan membahas beberapa dasar keamanan dan perlindungan data di bagian ini.
Kerangka kontrol akses
Kerangka keamanan utama Snowflake adalah role-based access control (RBAC) dan penggunaan service account.
Role-Based Access Control (RBAC)
Mendefinisikan hak istimewa RBAC memungkinkan kita menerapkan pengaturan keamanan ke sekelompok pengguna tanpa harus menugaskannya secara manual satu per satu. Ini memudahkan pemeliharaan.
Seperti disebutkan di atas, kita membuat peran menggunakan pernyataan
CREATE ROLE. Untuk memberikan izin kita menggunakanGRANT <privilege> … TO ROLEdan sebaliknya menghapusnya melaluiREVOKE <privilege> … FROM ROLE.Berikut beberapa praktik terbaik:
dbt_reader, akses pembuatan tabel kedbt_writer, dan akses hapus hanya ke akun admin sepertidbt_admin.Service account
Service account adalah akun berbasis mesin khusus yang berinteraksi tanpa keterlibatan manusia. Akun-akun ini tidak memiliki username dan password. Sebagai gantinya, mereka menggunakan public key dan pembatasan jaringan untuk meminimalkan risiko.
Membuat service account mungkin terlihat seperti ini:
Dengan cara ini, Anda memiliki satu akun yang dikelola admin, dan Anda tidak perlu lagi mengkhawatirkan pengguna individual. Disarankan untuk merotasi key secara berkala agar tidak bocor. Juga, pastikan memantau aktivitas jaringan dengan cermat menggunakan
LOGIN_HISTORYSnowflake.Perlindungan data
Lindungi data dan login Anda. Meskipun kita mungkin meng-hardcode kredensial sebagai contoh, sebenarnya itu praktik yang buruk. Gunakan secret manager seperti AWS Secrets Manager atau GitHub Secrets untuk menyimpan kredensial penting.
Ini memungkinkan Anda menyimpan kredensial secara online yang hanya dapat diakses pengguna dengan RSA/key keamanan yang sesuai. Tidak ada yang dapat melihat nilai sebenarnya dan rotasi kata sandi/key menjadi mudah dengan manajemen otomatis mereka.
Pastikan koneksi apa pun diamankan dengan benar dan pengguna berada di jaringan enterprise yang sesuai untuk mengakses data. Ini sering ditetapkan dengan menggunakan VPN seperti GlobalProtect. Karena kita terhubung ke Snowflake, banyak enkripsi end-to-end ditangani oleh cloud. Ini salah satu manfaat lain menggunakan Snowflake!
Terakhir, kita ingin mengaudit aktivitas kita. Snowflake memiliki logging kueri melalui tabel seperti
QUERY_HISTORYdanQUERY_HISTORY_BY_USER. Kita dapat memantau penggunaan, error, dan penyalahgunaan keamanan di log ini. Melalui dbt, kita dapat melacak run baru, perubahan, atau suntingan proyek dengan menggunakan pipeline kontrol versi.Kontrol versi dan template pengkodean membantu menjaga pelacakan perubahan dan kepatuhan. Masalah apa pun yang diperkenalkan oleh perubahan dapat dengan mudah dicatat selama pull request wajib dan ditangani sebelum menjadi masalah.
Pemantauan dan Manajemen Biaya
Mari bahas cara menghemat uang! Tentu saja, dengan dbt. Memantau performa model kita sangat penting. Model yang dulunya berjalan lancar bisa menjadi lebih lambat dan kurang bertenaga seiring ukuran tabel meningkat.
Pemantauan kinerja
Dengan dbt, cara terbaik memantau kinerja adalah menggunakan paket bawaan seperti
dbt-snowflake-monitoringatau alat eksternal seperti Looker dan Datafold untuk membantu visualisasi dan perbandingan data.Penggunaan dbt-snowfake-monitoring
Memulai
dbt-snowflake-monitoringcukup mudah! Dipackages.ymldbt Anda tambahkan berikut ini:Lalu, di setiap file YAML proyek, tambahkan berikut ini:
Sekarang Anda siap menggunakan paket ini untuk memantau hal-hal seperti penggunaan warehouse, durasi kueri, dan model yang gagal! Paket ini menggunakan akses pengguna dbt Anda yang ada untuk menulis tabel ke Snowflake yang berisi informasi berguna. Misalnya, jika saya ingin melihat pengeluaran warehouse bulanan, saya dapat menggunakan SQL berikut:
Peralatan eksternal
Alat eksternal seperti Looker atau Tableau dapat diintegrasikan langsung dengan dbt untuk visualisasi data dan performa yang mudah. Untuk peringatan, dbt dapat mengirim email atau notifikasi Slack.
Untuk perbandingan yang lebih mendalam, tumpukan eksternal seperti Datafold memberikan wawasan lebih dalam tentang bagaimana kualitas data terpengaruh oleh perubahan. Datafold mengotomatisasi data diff pada setiap perubahan kode yang Anda buat. Ini memungkinkan anggota tim lain dengan mudah meninjau kode Anda dan dampaknya terhadap data. Pengujian regresi otomatis semacam ini memungkinkan kita mempertahankan kualitas data tanpa harus terus-menerus membangun pemeriksaan dan alat baru.
Teknik optimisasi biaya
Kita tidak dapat menghindari menjalankan proses ETL, tetapi kita pasti dapat merencanakan sebelumnya untuk meminimalkan dampak biaya komputasi dan penyimpanan. Berkat desain terpisah Snowflake, kita dapat mengoptimalkan warehouse dan penyimpanan secara terpisah untuk menghadirkan lingkungan yang lebih fleksibel dan hemat biaya.
Untuk warehouse, cara terbaik adalah meminimalkan waktu idle. Sebarkan pipeline otomatis Anda sedemikian rupa untuk mengurangi waktu idle, lonjakan kebutuhan komputasi, dan kompetisi sumber daya.
Pantau secara berkala menggunakan tabel
WAREHOUSE_LOAD_HISTORYdanQUERY_HISTORYuntuk memahami bagaimana sumber daya digunakan. Praktik terbaiknya adalah mulai dengan XS. Jika kueri berjalan terlalu lambat, saatnya memperbesar ukuran sesuai SLA tim Anda.Untuk penyimpanan, praktik terbaik adalah menyingkirkan tabel yang tidak diperlukan. Meskipun Snowflake sendiri tidak memiliki cold-tier seperti AWS dan Google, Anda dapat memilih memindahkan data dari Snowflake ke AWS/Google untuk cold-tier ini dan mengurangi biaya penyimpanan.
Kebijakan retensi data dapat dengan jelas menguraikan linimasa untuk tabel yang jarang digunakan dan kapan akan dipindahkan ke penyimpanan dingin.
Untuk tabel besar yang sering tumbuh, pantau dengan saksama. Saat semakin besar, kemampuan Snowflake untuk secara otomatis dan efisien melakukan partisi akan menurun. Manfaatkan automatic clustering yang disebutkan di atas untuk membantu Snowflake mempartisi data Anda dengan lebih baik. Partisi yang lebih baik menghasilkan waktu baca penyimpanan yang lebih sedikit dan dengan demikian menghemat biaya.
CI/CD dan Otomasi
Berkat integrasi native dbt dengan kontrol versi, CI/CD dan pipeline otomatis menjadi mudah. Kita akan membahas beberapa opsi orkestrasi otomatis dan praktik terbaik pengujian.
Orkestrasi pipeline
Dengan dbt Cloud, kita dapat menggunakan Snowflake Tasks untuk memicu run terjadwal proyek dbt kita. Caranya adalah kita terlebih dahulu membuat proyek dbt di Snowflake menggunakan repositori Git kita, lalu kita membuat task yang mengeksekusi proyek dbt tersebut.
Misalnya, kita dapat melakukan hal berikut untuk membuat proyek dbt:
Lalu kita menggunakan kode berikut untuk menjalankan proyek tersebut:
Bahkan, ini begitu komprehensif sehingga kita dapat menjalankan pengujian setelahnya untuk memastikan proyek berjalan dengan benar:
Untuk penjadwalan, kita dapat memilih menetapkan waktu tetap seperti
60 MINUTESdan12 HOURSatau menggunakan cron sepertiUSING CRON 0 9 * * * UTC..Namun, model kita jarang statis, dan kita sering harus melakukan iterasi. Bisa memakan waktu untuk membangun setiap bagian pipeline secara manual. Di sinilah GitHub Actions masuk. Kita sering menggunakan GitHub Actions dalam pipeline CI/CD untuk mengotomatisasi pengujian dan pembangunan kode.
GitHub Actions dirancang menggunakan file YAML di dalam folder
.github/workflowsdi dalam repositori. Kita dapat membuatnya dipicu setiap kali kita membuat pull request, sehingga kita menjalankan beberapa pengujian dbt.Menyiapkan automasi Anda dengan benar dapat memudahkan pekerjaan dan membantu pengembang lain melihat model yang telah diuji. Ini merampingkan proses pengembangan dengan mengurangi kebutuhan pengujian manual.
Kerangka pengujian
dbt hadir dengan suite pengujian yang kuat. dbt menyediakan beberapa pengujian data generik bawaan yang dapat ditetapkan langsung pada model Anda dan memungkinkan logika SQL kustom. Pengujian generik ditetapkan pada kolom tertentu di model Anda dan memeriksa apakah kolom tersebut lulus pengujian. Pengujian bawaan adalah sebagai berikut:
unique: setiap nilai di kolom ini harus uniknot_null: tidak boleh ada nilai null di kolomaccepted_values: memeriksa apakah nilai berada dalam daftar nilai yang diterimarelationships: memeriksa apakah nilai di kolom ini ada di tabel terkait lainnyaBerikut contoh penggunaan relationships ini (dari dokumentasi dbt tentang pengujian):
Kita dapat menggunakan SQL kustom untuk membuat pengujian yang lebih spesifik dan generik. Tujuannya adalah pengujian mengembalikan baris gagal. Jadi jika ada hasil, pengujian dianggap gagal. File SQL kustom ini berada di direktori
testskita.Sebagai contoh, jika kita ingin mengetahui apakah ada penjualan yang bernilai negatif, kita dapat menggunakan berikut ini:
Kita kemudian akan mereferensikan pengujian tersebut di file
schema.ymldi dalam folder test kita:Jika kita ingin menggunakan jenis pemeriksaan ini pada lebih banyak tabel dan kolom, kita mungkin ingin mengubahnya menjadi pengujian generik. Bentuknya mungkin seperti ini:
Kita sekarang dapat menggunakan pengujian ini di file yaml model kita seperti pengujian generik lainnya yang disertakan dbt! Anda dapat memeriksa penumpang negatif pada perjalanan atau laba negatif, dan seterusnya! Kemungkinannya tak terbatas.
Untuk membuat pengujian ini lebih mulus dan sederhana, kita dapat memanfaatkan zero-copy cloning Snowflake.
CREATE TABLE <object> CLONE <source_object>Snowflake dapat membuat klon tanpa salin di lingkungan dev/test Anda.Kemudian, semua pengujian dan CI Anda dapat dilakukan terhadap objek yang diklon. Keuntungannya adalah kita tidak memerlukan ruang penyimpanan tambahan untuk memiliki lingkungan pengujian yang aman. Selain itu, kapan pun kita membutuhkan lebih banyak ruang pengujian, kita dapat membuat lebih banyak lingkungan pengujian dengan kloning instan ini.
Tren yang Muncul dan Prospek Masa Depan
Mari lihat peningkatan dan tren masa depan dari dbt dan Snowflake.
Pengembangan integrasi native
dbt terus meningkatkan integrasinya baik dengan produk intinya maupun dengan AI. Di Snowflake, kita dapat menggunakan Snowsight sebagai antarmuka UI untuk membantu mengelola workspace dbt kita. Dengan berintegrasi lebih mulus ke lingkungan Snowflake, kita meminimalkan kebutuhan untuk mengerjakan model dbt secara eksternal. Sebaliknya, kita dapat memusatkan alur kerja dengan memungkinkan tim mengedit dan berkolaborasi melalui UI Snowflake.
Untuk mempercepat pengembangan, dbt menawarkan asisten bertenaga AI bernama dbt Copilot. Asisten ini dapat diakses melalui dbt Studio IDE, Canvas, atau Insights dan menggunakan pemrosesan bahasa alami untuk mempercepat bagian pengembangan model yang memakan waktu, seperti menulis dokumentasi dan membuat pengujian.
dbt Copilot bahkan dapat digunakan untuk membantu onboarding analis baru dengan memberikan ringkasan singkat proyek dan model.
Gunakan kedua alat ini untuk mempercepat waktu ke produksi dan mempersingkat waktu pengembangan sehingga tim Anda dapat menangani masalah data yang lebih sulit dan menantang di organisasi Anda.
Integrasi Machine Learning
Pipeline machine learning memerlukan data yang selalu bersih dan dirancang dengan baik. dbt adalah alat yang tepat untuk pipeline transformasi data yang memberi makan model machine learning. Kita dapat memanfaatkan fleksibilitas dan kekuatan dbt untuk mengotomatisasi transformasi data yang terintegrasi mulus ke dalam pipeline machine learning kita.
Misalnya, kita dapat mentransformasi data langsung ke dalam warehouse machine learning. Data ini kemudian dapat digunakan dengan Cortex AI Snowflake untuk mendapatkan wawasan yang lebih dalam. Jika kita memiliki banyak model yang memerlukan transformasi serupa, templating dbt dapat menyederhanakan cara kita membersihkan data dan memberikan konsistensi lebih serta tata kelola data yang lebih mudah. Untuk memahami alat AI Snowflake, baca panduan tentang Snowflake Arctic, yaitu LLM milik Snowflake.
Eksekusi terkontainerisasi
Berkat dukungan Python native Snowflake dan Snowpark API untuk Python, kita dapat menjalankan kode secara lokal tanpa harus memindahkan data keluar dari Snowflake. Level berikutnya adalah menggunakan Snowpark Containers, yang saat ini (saat penulisan) hanya tersedia untuk wilayah AWS dan Azure, untuk menjalankan eksekusi kode dbt kita secara terisolasi sepenuhnya.
Untuk melakukannya, kita mengemas model dbt dan lingkungan ke dalam kontainer, yang kemudian disimpan di repositori image Snowflake.
Kita kemudian dapat menggunakan proyek dbt terkontainerisasi ini dengan mudah di dalam Snowpark. Manfaat utamanya? Kemampuan untuk lebih mudah memanfaatkan sumber daya Snowflake untuk transformasi data berbasis Python yang kompleks dan integrasi transformasi dbt dalam lingkungan Snowflake yang lebih luas.
Jika Anda ingin mempelajari lebih lanjut tentang Snowpark, lihat informasi yang menjelaskan Snowflake Snowpark secara detail.
Kesimpulan
Mengintegrasikan dbt dengan Snowflake memberdayakan tim data untuk membangun pipeline transformasi yang modular, tertata kelola, dan dapat diskalakan. Dengan fitur seperti pengujian otomatis, alur kerja CI/CD berbasis Git, dan skalabilitas yang mulus, tumpukan ini ideal untuk operasi data modern.
Untuk tetap kompetitif, tim data harus memprioritaskan:
Seiring kedua alat terus berkembang, integrasi dbt + Snowflake akan menjadi semakin kuat bagi tim rekayasa data. Jika Anda tertarik mempelajari lebih lanjut tentang dbt atau Snowflake, lihat sumber daya berikut: