Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie
Dina prinsip naon anu idéal Data Warehouse diwangun?

Fokus kana nilai bisnis sareng analitik dina henteuna kode boilerplate. Ngatur DWH salaku codebase a: versioning, review, nguji otomatis tur CI. Modular, extensible, open source sareng komunitas. Dokuméntasi anu ramah-pamaké sareng visualisasi kagumantungan (Data Lineage).

Langkung seueur ngeunaan sadayana ieu sareng ngeunaan peran DBT dina ékosistem Big Data & Analytics - wilujeng sumping ka ucing.

Sampurasun sadayana

Artemy Kozyr ngahubungi. Pikeun leuwih ti 5 taun kuring geus gawé bareng gudang data, ngawangun ETL / ELT, kitu ogé analytics data jeung visualisasi. Abdi ayeuna damel di kabayang, Kuring ngajar di OTUS dina kursus Insinyur Data, sarta dinten abdi hoyong babagi sareng anjeun hiji artikel nu kuring wrote di antisipasi mimiti enrollment anyar pikeun kursus.

Ulasan pondok

Kerangka DBT sadayana ngeunaan T dina akronim ELT (Extract - Transform - Load).

Kalayan munculna basis data analitik anu produktif sareng skalabel sapertos BigQuery, Redshift, Snowflake, teu aya gunana pikeun ngalakukeun transformasi di luar Gudang Data. 

DBT teu ngundeur data tina sumber, tapi nyadiakeun kasempetan gede pikeun gawé bareng data nu geus dimuat kana Panyimpenan (dina Panyimpenan internal atanapi éksternal).

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie
Tujuan utama DBT nyaéta nyandak kode, nyusun kana SQL, ngalaksanakeun paréntah dina urutan anu leres dina Repository.

Struktur Proyék DBT

Proyék diwangun ku diréktori sareng file ngan ukur 2 jinis:

  • Modél (.sql) - unit transformasi dinyatakeun ku query SELECT
  • file konfigurasi (.yml) - parameter, setélan, tés, dokuméntasi

Dina tingkat dasar, karya disusun saperti kieu:

  • Pamaké prepares kode modél dina sagala IDE merenah
  • Ngagunakeun CLI, model dibuka, DBT compiles kodeu modél kana SQL
  • Kodeu SQL anu disusun dieksekusi dina Panyimpenan dina sekuen anu dipasihkeun (grafik)

Ieu naon anu ngajalankeun tina CLI sigana sapertos:

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie

Sagalana geus PILIH

Ieu mangrupikeun fitur pembunuh kerangka Data Build Tool. Dina basa sejen, DBT abstrak sakabeh kode pakait sareng materializing queries anjeun ka Toko (variasi tina paréntah CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, ...).

Sakur modél ngalibatkeun nulis hiji pamundut PILIH anu nangtukeun set data anu dihasilkeun.

Dina hal ieu, logika transformasi tiasa multi-level sareng ngahijikeun data tina sababaraha model anu sanés. Conto modél anu bakal ngawangun showcase pesenan (f_orders):

{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
 
with orders as (
 
   select * from {{ ref('stg_orders') }}
 
),
 
order_payments as (
 
   select * from {{ ref('order_payments') }}
 
),
 
final as (
 
   select
       orders.order_id,
       orders.customer_id,
       orders.order_date,
       orders.status,
       {% for payment_method in payment_methods -%}
       order_payments.{{payment_method}}_amount,
       {% endfor -%}
       order_payments.total_amount as amount
   from orders
       left join order_payments using (order_id)
 
)
 
select * from final

Naon hal metot bisa urang tingali di dieu?

Kahiji: CTE (Ekspresi Méja Umum) - pikeun ngatur sareng ngartos kode anu ngandung seueur transformasi sareng logika bisnis

Kadua: Kode modél mangrupikeun campuran SQL sareng basa Jinja (basa citakan).

Contona ngagunakeun loop a keur pikeun ngahasilkeun jumlah pikeun tiap padika pembayaran dieusian dina ekspresi ngatur. Fungsina ogé dianggo ref - kamampuan pikeun ngarujuk modél sanés dina kode:

  • Salila kompilasi ref bakal dirobah jadi target pointer kana tabel atawa view dina Panyimpenan
  • ref ngidinan Anjeun pikeun ngawangun grafik kagumantungan model

nyaéta Jinja nambihan kamungkinan ampir taya ka DBT. Anu paling sering dianggo nyaéta:

  • Lamun / sejenna pernyataan - pernyataan cabang
  • Pikeun loop
  • Variabel
  • Makro - nyiptakeun makro

Materialization: Méja, Témbongkeun, Incremental

Strategi materialisasi mangrupikeun pendekatan anu dumasar kana set data modél anu hasilna bakal disimpen dina Panyimpenan.

Dina istilah dasar nyaéta:

  • Méja - tabel fisik dina Panyimpenan
  • Témbongkeun - view, tabel maya di Panyimpenan

Aya ogé strategi materialisasi anu langkung kompleks:

  • Incremental - incremental loading (tina tabel kanyataan badag); garis anyar ditambahkeun, garis robah diropéa, garis dihapus diberesihan 
  • Ephemeral - model teu materialize langsung, tapi ilubiung salaku CTE dina model sejen
  • Sakur strategi séjén anjeun tiasa nambihan diri

Salian strategi materialisasi, aya kasempetan pikeun optimasi pikeun Panyimpenan khusus, contona:

  • Snowflake: Méja transient, Ngagabung kabiasaan, Klaster tabel, Nyalin hibah, pintonan aman
  • Redshift: Distkey, Sortkey (interleaved, sanyawa), Telat beungkeutan Views
  • bigquery: Méja partisi & clustering, Ngagabung kabiasaan, KMS Énkripsi, Label & Tag
  • silalatu: Format file (parquet, csv, json, orc, delta), partition_by, clustered_by, ember, incremental_strategy

Panyimpenan di handap ieu ayeuna dirojong:

  • postgres
  • Redshift
  • bigquery
  • Snowflake
  • Presto (sawaréh)
  • Spark (sabagian)
  • Microsoft SQL Server (adaptor komunitas)

Hayu urang ningkatkeun model urang:

  • Hayu urang jieun eusina incremental (Incremental)
  • Hayu urang tambahkeun segmentasi sareng asihan konci pikeun Redshift

-- Конфигурация модели: 
-- Инкрементальное наполнение, уникальный ключ для обновления записей (unique_key)
-- Ключ сегментации (dist), ключ сортировки (sort)
{{
  config(
       materialized='incremental',
       unique_key='order_id',
       dist="customer_id",
       sort="order_date"
   )
}}
 
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
 
with orders as (
 
   select * from {{ ref('stg_orders') }}
   where 1=1
   {% if is_incremental() -%}
       -- Этот фильтр будет применен только для инкрементального запуска
       and order_date >= (select max(order_date) from {{ this }})
   {%- endif %} 
 
),
 
order_payments as (
 
   select * from {{ ref('order_payments') }}
 
),
 
final as (
 
   select
       orders.order_id,
       orders.customer_id,
       orders.order_date,
       orders.status,
       {% for payment_method in payment_methods -%}
       order_payments.{{payment_method}}_amount,
       {% endfor -%}
       order_payments.total_amount as amount
   from orders
       left join order_payments using (order_id)
 
)
 
select * from final

Grafik kagumantungan modél

Éta ogé tangkal kagumantungan. Éta ogé katelah DAG (Directed Acyclic Graph).

DBT ngawangun grafik dumasar kana konfigurasi sadaya model proyék, atawa rada, ref () Tumbu dina model ka model sejen. Gaduh grafik ngamungkinkeun anjeun pikeun ngalakukeun hal-hal ieu:

  • Ngajalankeun model dina runtuyan bener
  • Parallelization formasi storefront
  • Ngajalankeun subgraph wenang 

Conto visualisasi grafik:

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie
Unggal titik tina grafik mangrupa modél; edges of grafik dieusian ku ref ekspresi.

Kualitas Data sareng Dokuméntasi

Salian ngahasilkeun modél sorangan, DBT ngamungkinkeun anjeun pikeun nguji sababaraha asumsi ngeunaan set data anu dihasilkeun, sapertos:

  • Henteu Null
  • Unik
  • Integritas Rujukan - integritas rujukan (contona, customer_id dina tabel pesenan pakait sareng id dina tabel konsumén)
  • Cocog jeung daptar nilai ditarima

Kasebut nyaéta dimungkinkeun pikeun nambahkeun tés sorangan (tés data custom), kayaning, contona, % simpangan panghasilan jeung indikator ti sapoé, saminggu, sabulan katukang. Sakur asumsi anu dirumuskeun salaku pamundut SQL tiasa janten tés.

Ku cara kieu, anjeun tiasa nyekel panyimpangan sareng kasalahan anu teu dihoyongkeun dina data dina jandela Gudang.

Dina hal dokuméntasi, DBT nyadiakeun mékanisme pikeun nambahkeun, versioning, sarta ngadistribusikaeun metadata sarta komentar di model na malah tingkat atribut. 

Ieu kumaha nambihan tés sareng dokuméntasi sapertos dina tingkat file konfigurasi:

 - name: fct_orders
   description: This table has basic information about orders, as well as some derived facts based on payments
   columns:
     - name: order_id
       tests:
         - unique # проверка на уникальность значений
         - not_null # проверка на наличие null
       description: This is a unique identifier for an order
     - name: customer_id
       description: Foreign key to the customers table
       tests:
         - not_null
         - relationships: # проверка ссылочной целостности
             to: ref('dim_customers')
             field: customer_id
     - name: order_date
       description: Date (UTC) that the order was placed
     - name: status
       description: '{{ doc("orders_status") }}'
       tests:
         - accepted_values: # проверка на допустимые значения
             values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']

Sareng ieu mangrupikeun dokuméntasi ieu dina halaman wéb anu dihasilkeun:

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie

Macro jeung modul

Tujuan DBT teu jadi loba pikeun jadi susunan Aksara SQL, tapi nyadiakeun pamaké kalawan hartosna kuat sarta fitur-euyeub pikeun ngawangun transformasi sorangan jeung ngadistribusikaeun modul ieu.

Macros mangrupikeun set konstruk sareng ekspresi anu tiasa disebat salaku fungsi dina modél. Macros ngamungkinkeun anjeun ngagunakeun deui SQL antara modél sareng proyék saluyu sareng prinsip rékayasa DRY (Ulah Ulang Diri).

conto makro:

{% macro rename_category(column_name) %}
case
 when {{ column_name }} ilike  '%osx%' then 'osx'
 when {{ column_name }} ilike  '%android%' then 'android'
 when {{ column_name }} ilike  '%ios%' then 'ios'
 else 'other'
end as renamed_product
{% endmacro %}

Jeung pamakéanana:

{% set column_name = 'product' %}
select
 product,
 {{ rename_category(column_name) }} -- вызов макроса
from my_table

DBT hadir sareng manajer pakét anu ngamungkinkeun para pangguna nyebarkeun sareng nganggo deui modul sareng makro individu.

Ieu hartosna tiasa ngamuat sareng nganggo perpustakaan sapertos:

  • dbt_utils: damel sareng Tanggal / Waktos, Kunci Ganti, tés Skéma, Pivot / Unpivot sareng anu sanésna
  • Témplat showcase anu siap pikeun jasa sapertos Salju salju и belang 
  • Perpustakaan pikeun Toko Data husus, f.eks. Redshift 
  • logging - Modul pikeun logging operasi DBT

Daptar lengkep bungkusan tiasa dipendakan di dbt hub.

Malah leuwih fitur

Di dieu kuring bakal ngajelaskeun sababaraha fitur anu pikaresepeun sareng palaksanaan anu kuring sareng tim dianggo pikeun ngawangun Gudang Data kabayang.

Pamisahan lingkungan runtime DEV - TEST - PROD

Malah dina klaster DWH sarua (dina schemes béda). Contona, ngagunakeun éksprési handap:

with source as (
 
   select * from {{ source('salesforce', 'users') }}
   where 1=1
   {%- if target.name in ['dev', 'test', 'ci'] -%}           
       where timestamp >= dateadd(day, -3, current_date)   
   {%- endif -%}
 
)

Kode ieu sacara harfiah nyebutkeun: pikeun lingkungan dev, uji, ci nyandak data ngan pikeun 3 poé panungtungan sarta euweuh deui. Hartina, ngajalankeun di lingkungan ieu bakal leuwih gancang sarta merlukeun leuwih saeutik sumberdaya. Nalika ngajalankeun on lingkungan produksi kaayaan filter bakal dipaliré.

Materialization kalawan encoding kolom alternatif

Redshift mangrupakeun DBMS columnar nu ngidinan Anjeun pikeun nyetel algoritma komprési data pikeun tiap kolom individu. Milih algoritma optimal bisa ngurangan spasi disk ku 20-50%.

Makro redshift.compress_table bakal ngaéksekusi paréntah ANALYZE COMPRESSION, jieun tabel anyar sareng algoritma panyandian kolom anu disarankeun, konci segmentasi anu ditangtukeun (dist_key) sareng konci asihan (sort_key), mindahkeun data ka dinya, sareng, upami perlu, ngahapus salinan anu lami.

Tanda tangan makro:

{{ compress_table(schema, table,
                 drop_backup=False,
                 comprows=none|Integer,
                 sort_style=none|compound|interleaved,
                 sort_keys=none|List<String>,
                 dist_style=none|all|even,
                 dist_key=none|String) }}

Model logging jalan

Anjeun tiasa ngagantelkeun kait ka unggal palaksanaan modél, anu bakal dieksekusi sateuacan diluncurkeun atanapi langsung saatos nyiptakeun modél réngsé:

   pre-hook: "{{ logging.log_model_start_event() }}"
   post-hook: "{{ logging.log_model_end_event() }}"

Modul logging bakal ngidinan Anjeun pikeun ngarekam sakabeh metadata diperlukeun dina tabel misah, nu salajengna bisa dipaké pikeun Inok jeung nganalisis bottlenecks.

Ieu mangrupikeun dasbor dumasar kana data logging di Looker:

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie

Automation of Pangropéa Panyimpenan

Upami anjeun nganggo sababaraha ekstensi tina fungsionalitas Repository anu dianggo, sapertos UDF (Fungsi Ditetepkeun Pamaké), maka vérsi pungsi ieu, kontrol aksés, sareng gulung otomatis kaluar tina sékrési énggal pisan gampang dilakukeun dina DBT.

Kami nganggo UDF dina Python pikeun ngitung hashes, domain email, sareng decoding bitmask.

Conto makro anu nyiptakeun UDF dina lingkungan palaksanaan naon waé (dev, test, prod):

{% macro create_udf() -%}
 
 {% set sql %}
       CREATE OR REPLACE FUNCTION {{ target.schema }}.f_sha256(mes "varchar")
           RETURNS varchar
           LANGUAGE plpythonu
           STABLE
       AS $$  
           import hashlib
           return hashlib.sha256(mes).hexdigest()
       $$
       ;
 {% endset %}
  
 {% set table = run_query(sql) %}
 
{%- endmacro %}

Di Wheely kami nganggo Amazon Redshift, anu dumasar kana PostgreSQL. Pikeun Redshift, penting pikeun rutin ngumpulkeun statistik dina tabel sareng ngosongkeun rohangan disk - masing-masing paréntah ANALYZE sareng VACUUM.

Jang ngalampahkeun ieu, paréntah ti makro redshift_maintenance dieksekusi unggal wengi:

{% macro redshift_maintenance() %}
 
   {% set vacuumable_tables=run_query(vacuumable_tables_sql) %}
 
   {% for row in vacuumable_tables %}
       {% set message_prefix=loop.index ~ " of " ~ loop.length %}
 
       {%- set relation_to_vacuum = adapter.get_relation(
                                               database=row['table_database'],
                                               schema=row['table_schema'],
                                               identifier=row['table_name']
                                   ) -%}
       {% do run_query("commit") %}
 
       {% if relation_to_vacuum %}
           {% set start=modules.datetime.datetime.now() %}
           {{ dbt_utils.log_info(message_prefix ~ " Vacuuming " ~ relation_to_vacuum) }}
           {% do run_query("VACUUM " ~ relation_to_vacuum ~ " BOOST") %}
           {{ dbt_utils.log_info(message_prefix ~ " Analyzing " ~ relation_to_vacuum) }}
           {% do run_query("ANALYZE " ~ relation_to_vacuum) %}
           {% set end=modules.datetime.datetime.now() %}
           {% set total_seconds = (end - start).total_seconds() | round(2)  %}
           {{ dbt_utils.log_info(message_prefix ~ " Finished " ~ relation_to_vacuum ~ " in " ~ total_seconds ~ "s") }}
       {% else %}
           {{ dbt_utils.log_info(message_prefix ~ ' Skipping relation "' ~ row.values() | join ('"."') ~ '" as it does not exist') }}
       {% endif %}
 
   {% endfor %}
 
{% endmacro %}

DBT Awan

Kasebut nyaéta dimungkinkeun pikeun ngagunakeun DBT salaku jasa (Jurusan Service). Kaasup:

  • IDE wéb pikeun ngembangkeun proyék sareng modél
  • Konfigurasi pakasaban sarta scheduling
  • aksés basajan tur merenah pikeun log
  • Situs wéb sareng dokuméntasi proyék anjeun
  • Nyambungkeun CI (Continuous Integration)

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie

kacindekan

Nyiapkeun sareng ngonsumsi DWH janten nikmat sareng mangpaat sapertos nginum smoothie. DBT diwangun ku Jinja, ekstensi pamaké (modul), kompiler, pelaksana, jeung manajer pakét. Ku ngahijikeun unsur-unsur ieu anjeun kéngingkeun lingkungan kerja anu lengkep pikeun Gudang Data anjeun. Henteu aya cara anu langkung saé pikeun ngatur transformasi dina DWH ayeuna.

Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie

Kapercayaan anu dituturkeun ku pamekar DBT dirumuskeun kieu:

  • Kode, sanes GUI, mangrupikeun abstraksi anu pangsaéna pikeun ngémutan logika analitik anu kompleks
  • Gawe sareng data kedah adaptasi prakték pangsaéna dina rékayasa parangkat lunak (Software Engineering)

  • Infrastruktur data kritis kudu dikawasa ku komunitas pamaké salaku software open source
  • Henteu ngan ukur alat analitik, tapi ogé kode bakal beuki janten milik komunitas Open Source

Kapercayaan inti ieu ngahasilkeun produk anu dianggo ku langkung ti 850 perusahaan ayeuna, sareng aranjeunna janten dasar seueur ekstensi anu pikaresepeun anu bakal didamel di hareup.

Pikeun anu kabetot, aya pidéo ngeunaan pelajaran terbuka anu kuring masihan sababaraha bulan kapengker salaku bagian tina pelajaran terbuka di OTUS - Data Bangun Alat pikeun Amazon Redshift Panyimpenan.

Salian DBT sareng Data Warehousing, salaku bagian tina kursus Data Insinyur dina platform OTUS, kuring sareng kolega kuring ngajar kelas dina sababaraha topik anu relevan sareng modern:

  • Konsep Arsitéktur pikeun Aplikasi Big Data
  • Latihan sareng Spark sareng Spark Streaming
  • Ngajalajah metode sareng alat pikeun ngamuat sumber data
  • Ngawangun showcases analitik di DWH
  • Konsep NoSQL: HBase, Cassandra, ElasticSearch
  • Prinsip ngawaskeun sareng orkestrasi 
  • Proyék Akhir: ngahijikeun sadaya kaahlian dina dukungan bimbingan

Rujukan:

  1. dokuméntasi DBT - Bubuka - Dokuméntasi resmi
  2. Naon, persisna, dbt? - Review artikel ku salah sahiji pangarang DBT 
  3. Data Bangun Alat pikeun Amazon Redshift Panyimpenan - YouTube, Ngarékam pelajaran terbuka OTUS
  4. Ngauningaan Greenplum — Palajaran kabuka salajengna nyaéta 15 Mei 2020
  5. Kursus Téknik Data —OTUS
  6. Ngawangun alur kerja Analytics Dewasa - A katingal dina masa depan data sarta analytics
  7. Geus waktuna pikeun analytics open source - Évolusi analytics sareng pangaruh Open Source
  8. Integrasi Kontinyu sareng Uji Bangun Otomatis sareng dbtCloud - Prinsip ngawangun CI ngagunakeun DBT
  9. Ngamimitian ku DBT tutorial - Prakték, Lengkah-demi-hambalan parentah pikeun digawé mandiri
  10. Jaffle warung - Github DBT Tutorial - Github, kode proyék atikan

Diajar langkung seueur ngeunaan kursus.

sumber: www.habr.com

Tambahkeun komentar