Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie
Fuq liema prinċipji hija mibnija Data Warehouse ideali?

Iffoka fuq il-valur tan-negozju u l-analiżi fin-nuqqas ta 'kodiċi boilerplate. Ġestjoni ta' DWH bħala bażi ta' kodiċi: verżjoni, reviżjoni, ittestjar awtomatizzat u CI. Modulari, estensibbli, sors miftuħ u komunità. Dokumentazzjoni faċli għall-utent u viżwalizzazzjoni tad-dipendenza (Data Lineage).

Aktar dwar dan kollu u dwar ir-rwol tad-DBT fl-ekosistema tal-Big Data & Analytics - welcome to cat.

Hello lil kulħadd

Artemy Kozyr hija f'kuntatt. Għal aktar minn 5 snin ilni naħdem ma’ mħażen tad-dejta, nibni ETL/ELT, kif ukoll analitika u viżwalizzazzjoni tad-dejta. Bħalissa qed naħdem fiha Fil-mod, ngħallem fl-OTUS fuq kors Inġinier tad-Dejta, u llum irrid naqsam magħkom artiklu li ktibt b'antiċipazzjoni tal-bidu reġistrazzjoni ġdida għall-kors.

Reviżjoni qasira

Il-qafas DBT huwa kollu dwar it-T fl-akronimu ELT (Extract - Transform - Load).

Bil-miġja ta 'databases analitiċi produttivi u skalabbli bħal BigQuery, Redshift, Snowflake, ma kien hemm l-ebda skop li jsiru trasformazzjonijiet barra d-Data Warehouse. 

DBT ma jniżżilx dejta minn sorsi, iżda jipprovdi opportunitajiet kbar biex taħdem b'dejta li diġà tgħabba fil-Ħażna (f'Ħażna Interna jew Esterna).

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie
L-għan ewlieni tad-DBT huwa li tieħu l-kodiċi, tikkumpilah f'SQL, tesegwixxi l-kmandi fis-sekwenza korretta fir-Repożitorju.

Struttura tal-Proġett DBT

Il-proġett jikkonsisti f'direttorji u fajls ta' 2 tipi biss:

  • Mudell (.sql) - unità ta 'trasformazzjoni espressa minn mistoqsija SELECT
  • Fajl ta 'konfigurazzjoni (.yml) - parametri, settings, testijiet, dokumentazzjoni

Fuq livell bażiku, ix-xogħol huwa strutturat kif ġej:

  • L-utent jipprepara kodiċi tal-mudell fi kwalunkwe IDE konvenjenti
  • Bl-użu tas-CLI, jitnedew mudelli, DBT jikkompila l-kodiċi tal-mudell f'SQL
  • Il-kodiċi SQL ikkumpilat jiġi esegwit fil-Ħażna f'sekwenza partikolari (graff)

Hawn kif tista' tidher li taħdem mill-CLI:

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie

Kollox huwa SELECT

Din hija karatteristika qattiel tal-qafas tal-Għodda tal-Bini tad-Data. Fi kliem ieħor, DBT jastraxxi l-kodiċi kollu assoċjat mal-materjalizzazzjoni tal-mistoqsijiet tiegħek fil-Aħżen (varjazzjonijiet mill-kmandi CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, ...).

Kwalunkwe mudell jinvolvi l-kitba ta' mistoqsija waħda SELECT li tiddefinixxi s-sett tad-dejta li jirriżulta.

F'dan il-każ, il-loġika tat-trasformazzjoni tista 'tkun f'diversi livelli u tikkonsolida data minn diversi mudelli oħra. Eżempju ta' mudell li se jibni vetrina tal-ordnijiet (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

X'affarijiet interessanti nistgħu naraw hawn?

L-ewwel: Użat CTE (Common Table Expressions) - biex torganizza u tifhem kodiċi li fih ħafna trasformazzjonijiet u loġika tan-negozju

It-tieni: Il-kodiċi tal-mudell huwa taħlita ta 'SQL u lingwa Jinja (lingwa tal-mudelli).

L-eżempju juża linja għall biex tiġġenera l-ammont għal kull metodu ta 'ħlas speċifikat fl-espressjoni stabbiliti. Il-funzjoni tintuża wkoll ref — il-kapaċità li ssir referenza għal mudelli oħra fil-kodiċi:

  • Waqt il-kumpilazzjoni ref se jiġi kkonvertit għal punter fil-mira għal tabella jew viżjoni fil-Ħażna
  • ref jippermettilek tibni graff tad-dipendenza mudell

Eżattament Jinja iżid possibiltajiet kważi illimitati għad-DBT. L-aktar komunement użati huma:

  • Jekk / inkella dikjarazzjonijiet - dikjarazzjonijiet tal-fergħa
  • Għal linji
  • Varjabbli
  • Makro - ħolqien ta 'makro

Materjalizzazzjoni: Tabella, View, Inkrementali

L-istrateġija ta 'materjalizzazzjoni hija approċċ li skontu s-sett ta' data tal-mudell li jirriżulta se jinħażen fil-Ħażna.

F'termini bażiċi huwa:

  • Tabella - tabella fiżika fil-Ħażna
  • View - ħsieb, tabella virtwali fil-Ħażna

Hemm ukoll strateġiji ta 'materjalizzazzjoni aktar kumplessi:

  • Inkrementali - tagħbija inkrementali (ta' tabelli ta' fatti kbar); linji ġodda huma miżjuda, linji mibdula huma aġġornati, linji mħassra jitneħħew 
  • Effimeru - il-mudell ma jimmaterjalizzax direttament, iżda jipparteċipa bħala CTE f'mudelli oħra
  • Kwalunkwe strateġiji oħra li tista 'żżid lilek innifsek

Minbarra l-istrateġiji ta 'materjalizzazzjoni, hemm opportunitajiet għall-ottimizzazzjoni għal Ħażniet speċifiċi, pereżempju:

  • Snowflake: Tabelli transitorji, Imġieba ta' Merge, Raggruppament ta' tabella, Għotjiet għall-ikkupjar, Fehmiet Sikur
  • Redshift: Distkey, Sortkey (interleaved, kompost), Fehmiet tal-Irbit tard
  • BigQuery: Diviżorju tal-mejda u raggruppament, Imġieba ta' Merge, Encryption KMS, Tikketti u Tikketti
  • Spark: Format tal-fajl (parquet, csv, json, orc, delta), partition_by, clustered_by, bramel, incremental_strategy

Il-Ħażniet li ġejjin bħalissa huma appoġġjati:

  • postgres
  • Redshift
  • BigQuery
  • Snowflake
  • Presto (parzjalment)
  • Spark (parzjalment)
  • Microsoft SQL Server (adapter tal-komunità)

Ejja ntejbu l-mudell tagħna:

  • Ejja nagħmlu l-mili tiegħu inkrementali (Inkrementali)
  • Ejja nżidu ċwievet tas-segmentazzjoni u l-issortjar għal 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

Mudell graff tad-dipendenza

Hija wkoll siġra tad-dipendenza. Huwa magħruf ukoll bħala DAG (Grafika Aċiklika Diretta).

DBT jibni graff ibbażat fuq il-konfigurazzjoni tal-mudelli kollha tal-proġett, jew aħjar, ref() links fi ħdan mudelli għal mudelli oħra. Li jkollok graff jippermettilek tagħmel l-affarijiet li ġejjin:

  • Mudelli tat-tmexxija fis-sekwenza korretta
  • Parallelizzazzjoni tal-formazzjoni ta' storefront
  • Tmexxija ta' subgrafu arbitrarju 

Eżempju ta' viżwalizzazzjoni tal-grafika:

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie
Kull nodu tal-graff huwa mudell; it-truf tal-graff huma speċifikati mill-espressjoni ref.

Kwalità tad-Data u Dokumentazzjoni

Minbarra li tiġġenera l-mudelli nfushom, id-DBT jippermettilek tittestja għadd ta’ suppożizzjonijiet dwar is-sett tad-dejta li jirriżulta, bħal:

  • Mhux Null
  • Uniku
  • Integrità ta' Referenza - integrità referenzjali (per eżempju, customer_id fit-tabella tal-ordnijiet jikkorrispondi għal id fit-tabella tal-klijenti)
  • Tqabbil mal-lista ta' valuri aċċettabbli

Huwa possibbli li żżid it-testijiet tiegħek stess (testijiet tad-dejta apposta), bħal, pereżempju, % devjazzjoni tad-dħul b'indikaturi minn ġurnata, ġimgħa, xahar ilu. Kwalunkwe suppożizzjoni fformulata bħala mistoqsija SQL tista' ssir test.

B'dan il-mod, tista 'taqbad devjazzjonijiet u żbalji mhux mixtieqa fid-dejta fit-twieqi tal-Maħżen.

F'termini ta' dokumentazzjoni, DBT jipprovdi mekkaniżmi għaż-żieda, il-verżjoni u d-distribuzzjoni tal-metadejta u l-kummenti fil-livelli tal-mudell u anke tal-attributi. 

Hawn kif tidher iż-żieda ta' testijiet u dokumentazzjoni fil-livell tal-fajl tal-konfigurazzjoni:

 - 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']

U hawn kif tidher din id-dokumentazzjoni fuq il-websajt iġġenerata:

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie

Makros u Moduli

L-iskop tad-DBT mhuwiex tant li jsir sett ta 'skripts SQL, iżda li jipprovdi lill-utenti b'mezzi b'saħħithom u b'ħafna karatteristiċi biex jibnu t-trasformazzjonijiet tagħhom stess u jqassmu dawn il-moduli.

Il-makros huma settijiet ta' kostruzzjonijiet u espressjonijiet li jistgħu jissejħu bħala funzjonijiet fi ħdan mudelli. Il-makros jippermettulek tuża mill-ġdid l-SQL bejn mudelli u proġetti skont il-prinċipju tal-inġinerija DRY (M'għandekx Irrepeti lilek innifsek).

Eżempju 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 %}

U l-użu tiegħu:

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

DBT jiġi ma 'maniġer tal-pakketti li jippermetti lill-utenti jippubblikaw u jerġgħu jużaw moduli u macros individwali.

Dan ifisser li tkun tista' tagħbija u tuża libreriji bħal:

  • dbt_utils: taħdem mad-Data/Ħin, Ċwievet Surrogati, testijiet tal-Iskema, Pivot/Unpivot u oħrajn
  • Mudelli ta’ vetrina lesti għal servizzi bħal Snowplow и Stripe 
  • Libreriji għal Data Stores speċifiċi, eż. Redshift 
  • Logging — Modulu għall-illoggjar tal-operat DBT

Lista sħiħa ta' pakketti tista' tinstab fuq hub dbt.

Saħansitra aktar possibbiltajiet

Hawnhekk ser niddeskrivi ftit karatteristiċi u implimentazzjonijiet interessanti oħra li jien u t-tim nużaw biex nibnu Data Warehouse fih Fil-mod.

Separazzjoni ta' ambjenti runtime DEV - TEST - PROD

Anke fi ħdan l-istess cluster DWH (fi skemi differenti). Per eżempju, billi tuża l-espressjoni li ġejja:

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 -%}
 
)

Dan il-kodiċi litteralment jgħid: għall-ambjenti dev, test, ci tieħu data biss għall-aħħar 3 ijiem u mhux aktar. Jiġifieri, it-tħaddim f'dawn l-ambjenti se jkun ħafna aktar mgħaġġel u jeħtieġ inqas riżorsi. Meta taħdem fuq l-ambjent produzzjoni il-kundizzjoni tal-filtru tkun injorata.

Materjalizzazzjoni b'kodifikazzjoni tal-kolonna alternattiva

Redshift huwa DBMS kolonni li jippermettilek li tissettja algoritmi ta 'kompressjoni tad-dejta għal kull kolonna individwali. L-għażla ta 'algoritmi ottimali tista' tnaqqas l-ispazju tad-diska b'20-50%.

Makro redshift.compress_table se jesegwixxi l-kmand ANALYZE COMPRESSION, toħloq tabella ġdida bl-algoritmi ta 'kodifikazzjoni tal-kolonna rakkomandati, ċwievet ta' segmentazzjoni speċifikati (dist_key) u ċwievet ta 'ssortjar (sort_key), jittrasferixxi d-data lilha, u, jekk meħtieġ, ħassar il-kopja l-antika.

Firma 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) }}

Il-mudell tal-illoggjar jibda

Tista 'tehmeż ganċijiet ma' kull eżekuzzjoni tal-mudell, li se tiġi esegwita qabel it-tnedija jew immedjatament wara li titlesta l-ħolqien tal-mudell:

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

Il-modulu tal-illoggjar jippermettilek tirreġistra l-metadejta kollha meħtieġa f'tabella separata, li sussegwentement tista 'tintuża biex tivverifika u tanalizza l-konġestjonijiet.

Dan huwa kif jidher id-dashboard ibbażat fuq id-dejta tal-illoggjar f'Looker:

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie

Awtomazzjoni tal-Manutenzjoni tal-Ħażna

Jekk tuża xi estensjonijiet tal-funzjonalità tar-Repożitorju użat, bħal UDF (Funzjonijiet Iddefiniti mill-Utent), allura l-verżjoni ta 'dawn il-funzjonijiet, il-kontroll tal-aċċess, u t-tnedija awtomatizzata ta' ħarġiet ġodda hija konvenjenti ħafna biex tagħmel f'DBT.

Aħna nużaw UDF f'Python biex nikkalkulaw il-hashes, id-dominji tal-email, u d-dekodifikazzjoni tal-bitmask.

Eżempju ta' makro li joħloq UDF fuq kwalunkwe ambjent ta' eżekuzzjoni (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 %}

Fuq Wheely nużaw Amazon Redshift, li hija bbażata fuq PostgreSQL. Għal Redshift, huwa importanti li tiġbor regolarment statistika fuq it-tabelli u tillibera spazju fuq id-diska - il-kmandi ANALYZE u VACUUM, rispettivament.

Biex tagħmel dan, il-kmandi mill-makro redshift_maintenance jiġu esegwiti kull lejl:

{% 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 Cloud

Huwa possibbli li tuża DBT bħala servizz (Servizz Immexxi). Inklużi:

  • Web IDE għall-iżvilupp ta 'proġetti u mudelli
  • Konfigurazzjoni u skedar tax-xogħol
  • Aċċess sempliċi u konvenjenti għal zkuk
  • Websajt bid-dokumentazzjoni tal-proġett tiegħek
  • Konnessjoni ta' CI (Integrazzjoni Kontinwa)

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie

Konklużjoni

Il-preparazzjoni u l-konsum tad-DWH isiru pjaċevoli u ta 'benefiċċju daqs ix-xorb ta' smoothie. DBT jikkonsisti minn Jinja, estensjonijiet tal-utent (moduli), kompilatur, eżekutur, u maniġer tal-pakketti. Billi tgħaqqad dawn l-elementi flimkien ikollok ambjent tax-xogħol sħiħ għad-Data Warehouse tiegħek. Bilkemm hemm mod aħjar biex timmaniġġja t-trasformazzjoni fi ħdan id-DWH illum.

Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie

It-twemmin segwit mill-iżviluppaturi tad-DBT huwa fformulat kif ġej:

  • Il-kodiċi, mhux GUI, huwa l-aħjar astrazzjoni biex tesprimi loġika analitika kumplessa
  • Il-ħidma mad-dejta għandha tadatta l-aħjar prattiki fl-inġinerija tas-softwer (Inġinerija tas-Software)

  • L-infrastruttura kritika tad-dejta għandha tkun ikkontrollata mill-komunità tal-utenti bħala softwer ta' sors miftuħ
  • Mhux biss l-għodod analitiċi, iżda wkoll il-kodiċi se jsiru dejjem aktar proprjetà tal-komunità Open Source

Dawn it-twemmin ewlieni nissel prodott li jintuża minn aktar minn 850 kumpanija llum, u jiffurmaw il-bażi ta 'ħafna estensjonijiet eċċitanti li se jinħolqu fil-futur.

Għal dawk interessati, hemm filmat ta' lezzjoni miftuħa li tajt ftit xhur ilu bħala parti minn lezzjoni miftuħa fl-OTUS - Għodda tal-Bini tad-Data għall-Ħżin Amazon Redshift.

Minbarra d-DBT u l-Magazzinaġġ tad-Data, bħala parti mill-kors tal-Inġinier tad-Data fuq il-pjattaforma OTUS, jien u l-kollegi tiegħi ngħallmu klassijiet dwar għadd ta’ suġġetti oħra rilevanti u moderni:

  • Kunċetti Arkitettoniċi għal Applikazzjonijiet ta' Big Data
  • Prattika bi Spark u Spark Streaming
  • Jesploraw metodi u għodod għat-tagħbija tas-sorsi tad-dejta
  • Bini ta’ vetrini analitiċi fid-DWH
  • Kunċetti NoSQL: HBase, Cassandra, ElasticSearch
  • Prinċipji ta' monitoraġġ u orkestrazzjoni 
  • Proġett Finali: tpoġġi l-ħiliet kollha flimkien taħt appoġġ ta' mentoring

Referenzi:

  1. Dokumentazzjoni DBT - Introduzzjoni — Dokumentazzjoni uffiċjali
  2. X'inhu eżattament dbt? — Artiklu ta' reviżjoni minn wieħed mill-awturi ta' DBT 
  3. Għodda tal-Bini tad-Data għall-Ħżin Amazon Redshift — YouTube, Reġistrazzjoni ta' lezzjoni miftuħa OTUS
  4. Insiru nafu lil Greenplum — Il-lezzjoni miftuħa li jmiss hija l-15 ta’ Mejju, 2020
  5. Kors tal-Inġinerija tad-Data —OTUS
  6. Bini ta' Fluss tax-Xogħol Analitiku Maturi — Ħarsa lejn il-futur tad-dejta u l-analitika
  7. Wasal iż-żmien għall-analiżi tas-sors miftuħ — L-evoluzzjoni tal-analitika u l-influwenza tal-Open Source
  8. Integrazzjoni Kontinwa u Ittestjar Awtomatizzat tal-Bini b'dbtCloud — Prinċipji tal-bini ta' CI bl-użu tad-DBT
  9. Nibdew bit-tutorja tad-DBT — Prattika, Istruzzjonijiet pass pass għal xogħol indipendenti
  10. Jaffle shop — Github DBT Tutorial — Github, kodiċi tal-proġett edukattiv

Tgħallem aktar dwar il-kors.

Sors: www.habr.com

Żid kumment