Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga
Millistel pĂ”himĂ”tetel on ideaalne Andmete SĂ€ilitamine ĂŒles ehitatud?

Fookus Ă€rivÀÀrtusele ja analĂŒĂŒtikale ilma boilerplate koodita. DWH haldamine nagu koodibaas: versioonimine, ĂŒlevaatus, automaatne testimine ja CI. Moodulsus, laienemisvĂ”ime, avatud lĂ€htekood ja kogukond. KasutajasĂ”bralik dokumentatsioon ja sĂ”ltuvuste visualiseerimine (Data Lineage).

KĂ”igest sellest pĂ”hjalikumalt ja DBT rollist Big Data & Analytics ökosĂŒsteemis — tere tulemast allapoole.

Tere kÔigile

Olge ĂŒhenduses, Artemy Kozyr. Juba rohkem kui 5 aastat olen töötanud andmesalvestites, tehes ETL/ELT ehitust, samuti andmeanalĂŒĂŒsi ja visualiseerimist. Praegu töötan ma Wheely, Ă”petan OTUS-es kursusel Andmeinsener, ja tĂ€na tahan teiega jagada artiklit, mille ma kirjutasin seoses uue kursuse vastuvĂ”tu algusega.

LĂŒhike ĂŒlevaade

DBT raamistik — see on kĂ”ik T kohta akronĂŒĂŒmis ELT (Extract — Transform — Load).

Kuna sellised vĂ”imsad ja skaleeritavad analĂŒĂŒsibaasid nagu BigQuery, Redshift ja Snowflake on tekkinud, pole enam mingit mĂ”tet teha transformatsioone vĂ€ljaspool Andmete SĂ€ilitamist. 

DBT ei salvesta andmeid allikatest, kuid pakub tohutuid vÔimalusi töötamiseks juba laaditud andmetega Hoiuses (Internal vÔi External Storage).

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga
DBT peamine eesmÀrk on vÔtta kood, kompileerida see SQL-iks ja tÀita kÀsud Ôiges jÀrjestuses Hoiuses.

DBT projekti struktuur

Projekt koosneb kahest tĂŒĂŒpi kataloogidest ja failidest:

  • Mudel (.sql) — transformatsiooni ĂŒksus, vĂ€ljendatud SELECT-pĂ€ringuna
  • Konfiguratsioonifail (.yml) — parameetrid, seaded, testid, dokumentatsioon

PÔhitasandil töö toimub jÀrgmiselt:

  • Kasutaja valmistab mudelite koodi ette igas mugavas IDE-s
  • CLI abil kutsutakse esile mudelite kĂ€ivitamine, DBT kompileerib mudelite koodi SQL-iks
  • Kompileeritud SQL-kood tĂ€idetakse Hoiuses antud jĂ€rjestuses (graaf)

Nii vÔib CLI kÀivitus vÀlja nÀha:

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga

Kohustuslik on SELECT

See on Data Build Tool raamistiku killer-feature. TeisisÔnu, DBT abstraktsioonib kogu koodi, mis on seotud teie pÀringute materialiseerimisega Hoiuses (variatsioonid kÀskudest CREATE, INSERT, UPDATE, DELETE ALTER, GRANT jne).

Igast mudelist eeldatakse ĂŒhe SELECT-pĂ€ringu kirjutamist, mis mÀÀratleb saadud andmestiku.

Transformatsioonide loogika vÔib olla mitmeastmeline ja konsolideerida andmeid mitmest teisest mudelist. NÀide mudelist, mis loob tellimuste vitriini (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

Mida huvitavat me siin nÀha saame?

Esiteks: Kasutatakse CTE-d (Common Table Expressions) — koodi korraldamiseks ja mĂ”istmiseks, mis sisaldab palju transformatsioone ja Ă€riloogikat

Teiseks: Mudeli kood on SQL-i ja Jinja (mallimise keel) segu.

NĂ€ites kasutatakse tsĂŒklit for iga maksemeetodi summa kujundamiseks, nagu on vĂ€ljendatud set. Kasutatakse ka funktsiooni ref — vĂ”imalust viidata koodis teistele mudelitele:

  • Kompileerimise ajal ref muutub see sihtmĂ€rgiks tabelile vĂ”i vaatele Andmehoidlas
  • ref lubab sĂ”ltuvuste graafiku koostamine mudelitest

Just Jinja lisab DBT-le peaaegu piiramatud vÔimalused. KÔige sagedamini kasutatavad neist on:

  • If/else laused — haruoperatorid
  • For tsĂŒklid — tsĂŒklid
  • Muudatused — muutujad
  • Makro — makrode loomine

Materjaliseerimine: Tabel, Vaade, Inkremetne

Materjaliseerimise strateegia — lĂ€henemine, mille kohaselt salvestatakse mudeli tulemusandmete kogum Ladustamisse.

PÔhilise kÀsitluse kohaselt see on:

  • Tabel — fĂŒĂŒsiline tabel Ladustamises
  • Vaade — esitus, virtuaalne tabel Ladustamises

On olemas ka keerukamaid materjaliseerimise strateegiaid:

  • Inkremetne — inkremetne laadimine (suured faktitabelid); uued read lisatakse, muudetud — uuendatakse, kustutatud — eemaldatakse 
  • Ephemeral — mudelit ei materjaliseerita otse, vaid see osaleb CTE-na teistes mudelites
  • KĂ€ideldavad muud strateegiad, mida saate ise lisada

Lisaks materjaliseerimise strateegiatele avanevad vÔimalused optimeerimiseks konkreetsete Ladustamiste jaoks, nÀiteks:

  • Snowflake: Ajutised tabelid, Ühinemise kĂ€itumine, Tabeli grupeerimine, Õiguste kopeerimine, Turvalised vaated
  • Redshift: Distkey, Sortkey (vahelduv, komposiit), Hiline sidumise vaated
  • BigQuery: Tabeli partitsioneerimine ja grupeerimine, Ühinemise kĂ€itumine, KMS-krĂŒpteerimine, Sildid ja MĂ€rgid
  • Spark: Failivorming (parquet, csv, json, orc, delta), partition_by, clustered_by, buckets, incremental_strategy

Hetkel toetatakse jÀrgmisi salvestusvorme:

  • Postgres
  • Redshift
  • BigQuery
  • Snowflake
  • Presto (osaliselt)
  • Spark (osaliselt)
  • Microsoft SQL Server (kogukonna adapter)

Parandame meie mudelit:

  • Teeme selle tĂ€iendamise inkrementaalseks (Incremental)
  • Lisame segmentimise ja sortimise vĂ”tmed Redshiftile

-- Mudeli konfiguratsioon: 
-- Inkrementaalne tÀitmine, unikaalne vÔti rekordite uuendamiseks (unique_key)
-- Segmentimise vÔti (dist), sorteerimise vÔti (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() -%}
       -- See filter rakendatakse ainult inkrementaalse kÀivitamise jaoks
       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

Mudelite sÔltuvuste graafik

See on ka sĂ”ltuvuste puu. Samuti DAG (Suunatud AkeetsĂŒkkel Graaf).

DBT ehitab graafi projekti kÔigi mudelite konfiguratsiooni pÔhjal, tÀpsemalt mudelites olevate ref() viidete kaudu teistele mudelitele. Graafi olemasolu vÔimaldab teha jÀrgmist:

  • Mudelite kĂ€itamine Ă”iges jĂ€rjekorras
  • Data warehouse'ide loomise paralleelne tĂ€itmine
  • Mitte mingisuguse alagraafi kĂ€itamine 

Graafi visualiseerimise nÀide:

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga
Iga graafi sÔlm on mudel, graafi servad mÀÀratakse ref vÀljendiga.

Andmete kvaliteet ja dokumentatsioon

Lisaks mudelite loomisele vĂ”imaldab DBT testida rida hĂŒpoteese (assertions) andmestiku tulemuste kohta, nagu nĂ€iteks:

  • Not Null
  • Unikaalne
  • Viidete terviklikkus (nĂ€iteks customer_id tabelis orders peab vastama id-le tabelis customers)
  • Sobivuse kontroll lubatud vÀÀrtuste loendiga

VĂ”imalik on lisada oma teste (kohandatud andmete testid), nĂ€iteks % mĂŒĂŒgitulu kĂ”rvalekalded eelmise pĂ€eva, nĂ€dala vĂ”i kuu kohta. Iga hĂŒpotees, mis on sĂ”nastatud SQL-pĂ€ringuna, vĂ”ib muutuda testiks.

Nii saab Reservoiri vitriinides tuvastada soovimatud kÔrvalekalded ja andmete vead.

Mis puutub dokumenteerimisse, siis DBT pakub mehhanisme metateabe ja kommentaaride lisamiseks, versioonide haldamiseks ning levitamiseks mudelite ja isegi atribuutide tasandil. 

Nii nÀeb vÀlja testide ja dokumentatsiooni lisamine konfiguratsioonifaili tasandil:

 - name: fct_orders
   description: See tabel sisaldab pÔhiteavet tellimuste kohta, samuti mÔningaid maksete pÔhjal saadud faktilisi andmeid
   columns:
     - name: order_id
       tests:
         - unique # vÀÀrtuste unikaalsuse kontroll
         - not_null # null-i olemasolu kontroll
       description: See on unikaalne identifikaator tellimuse jaoks
     - name: customer_id
       description: VÀlisvÔti klientide tabelisse
       tests:
         - not_null
         - relationships: # viidete terviklikkuse kontroll
             to: ref('dim_customers')
             field: customer_id
     - name: order_date
       description: KuupÀev (UTC), millal tellimus tehti
     - name: status
       description: '{{ doc("orders_status") }}'
       tests:
         - accepted_values: # lubatud vÀÀrtuste kontroll
             values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']

Nii nÀeb see dokumentatsioon vÀlja juba genereeritud veebilehel:

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga

Makrode ja moodulite

DBT eesmÀrk ei ole mitte lihtsalt SQL-skriptide kogum, vaid pakkuda kasutajatele vÔimsaid ja mitmekesiseid vahendeid oma transformatsioonide loomiseks ja nende moodulite jagamiseks.

Makrosid kasutatakse konstruktsioonide ja vĂ€ljendite kogumina, mida saab kutsuda funktsioonidena mudelites. Makrosid saab uuesti kasutada SQL-i mudelite ja projektide vahel vastavalt inseneriprinsipile DRY (Ära Korda Iseennast).

Makro nÀide:

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

Ja selle kasutamine:

{% set column_name = 'product' %}
select
 product,
 {{ rename_category(column_name) }} -- makro kutsumine
from my_table

DBT tuleb koos pakettide halduriga (packages), mis vÔimaldab kasutajatel avaldada ja uuesti kasutada eraldi mooduleid ja makrosid.

See tÀhendab, et on vÔimalik laadida ja kasutada selliseid teeke nagu:

  • dbt_utils: Date/Time töötlemine, asendusbitaendid, skeemi testid, Pivot/Unpivot ja muud
  • Valmis mallid selliste teenuste jaoks nagu Snowplow ja Stripe 
  • Teegid konkreetsete andmehoidlate jaoks, nĂ€iteks Redshift 
  • Logging — DBT töö logimise moodul

Kogu paketide loetelu on saadaval dbt hub.

Veel rohkem vÔimalusi

Siin kirjeldan mÔningaid teisi huvitavaid omadusi ja rakendusi, mida mina ja minu meeskond kasutame Andmete Lao loomisel Wheely.

KĂ€itusvĂ€ljade jagamine DEV — TEST — PROD

Isegi ĂŒhe DWH klastri sees (erinevate skeemide raames). NĂ€iteks jĂ€rgmise lause abil:

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

See kood ĂŒtleb sĂ”na-sĂ”nalt: keskkondadele dev, test, ci vĂ”ta andmed ainult viimase 3 pĂ€eva jooksul ja mitte rohkem. See tĂ€hendab, et need keskkonnad pÀÀsevad palju kiiremini ja vajavad vĂ€hem ressursse. KĂ€ivitamisel keskkonnas prod filtreerimise tingimus jĂ€etakse tĂ€helepanuta.

Alternatiivse veergude kodeerimise materialiseerimine

Redshift on veergudega andmebaas, mis vÔimaldab mÀÀrata iga veeru jaoks andmete tihendamise algoritme. Optimaalsete algoritmide valik vÔib vÀhendada kettaruumi kasutust 20-50%.

Makro redshift.compress_table tÀidab ANALYZE COMPRESSION kÀsku, loob uue tabeli soovitatud veergude kodeerimisalgoritmidega, kasutades mÀÀratud segmentimise (dist_key) ja sortimise (sort_key) vÔtmeid, edastab andmed sinna ja vajadusel kustutab vana koopia.

Makro allkiri:

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

Mudelite kÀivitamise logimine

Iga mudeli tÀitmise juurde saab lisada hook'e, mis kÀivitatakse enne mudeli kÀivitamist vÔi kohe pÀrast mudeli loomise lÔppu:

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

Logimismoodul vĂ”imaldab salvestada kĂ”ik vajalikud metaandmed eraldi tabelisse, mille pĂ”hjal on hiljem vĂ”imalik teostada auditeid ja analĂŒĂŒsida probleemikohti.

Nii nÀeb vÀlja Lookeris logimise andmetel pÔhinev juhtpaneel:

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga

Laokogumiku hoolduse automatiseerimine

Kui kasutate mÔningaid laohalduse funktsionaalsuse laiendusi, nagu UDF (kasutaja mÀÀratud funktsioonid), on nende funktsioonide versiooniuuendamine, ligipÀÀsu haldamine ja uute versioonide automaatne rakendamine DBT-s vÀga mugav.

Kasutame UDF-e Pythonis, et arvutada rÀsivÀÀrtusi, meiliaadresside domeene ja dekodeerida bitmask-e.

Mikro nÀide, mis loob UDF-i igas tÀitevkeskkonnas (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 %}

Wheelys kasutame Amazon Redshifti, mis pĂ”hineb PostgreSQL-il. Redshifti jaoks on oluline regulaarselt koguda statistikat tabelite kohta ja vabastada ketas — vastavad kĂ€sud ANALYZE ja VACUUM.

Selleks kÀivitatakse iga öö redshift_maintenance makro sisalduvad kÀsud:

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

DBT teenusena (Halletud teenus) kasutamise vÔimalus. Komplekti kuuluvad:

  • Web IDE projektide ja mudelite arendamiseks
  • Tööde konfigureerimine ja ajastamine
  • Lihtne ja mugav juurdepÀÀs logidele
  • Teie projekti dokumentatsiooni veebisait
  • CI (Continuous Integration) ĂŒhendamine

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga

KokkuvÔte

Andmete ladustamise (DWH) valmistamine ja kasutamine on sama meeldiv ja kasulik kui smuuti joomine. DBT koosneb Jinjast, kohandatud laiendustest (moodulitest), kompilaatorist, tĂ€itmisajamust (executor) ja pakihaldurist. Kogudes need elemendid ĂŒhte, saate tĂ€iusliku töökorralduse oma andmete ladustamiseks. TĂ€napĂ€eval on raske leida paremat viisi DWH-s transformatsioonide haldamiseks.

Data Build Tool vÔi mis seondub Andmehoidla ja Smuutiga

DBT arendajate jÀrgitud veendumused on jÀrgmised:

  • Kood, mitte GUI, on parim abstraktsioon keerulise analĂŒĂŒtilise loogika vĂ€ljendamiseks
  • Andmetega töötamine peaks kohandama parimaid tarkvaraarenduse (Software Engineering) praktikaid

  • KĂ”ige olulisem andmete töötlemise infrastruktuur peaks olema kontrollitud kasutajate kogukonna poolt avatud lĂ€htekoodiga tarkvarana
  • Mitte ainult analĂŒĂŒsitööriistad, vaid ka kood muutub jĂ€rjest enam avatud lĂ€htekoodiga kogukonna varaks

Needus uskumused on loonud toote, mida tĂ€na kasutavad ĂŒle 850 ettevĂ”tte ja need on aluseks paljudele huvitavatele laiendustele, mis tulevikus luuakse.

Neile, kes on huvitatud, on olemas video salvestus avatud loengust, mille ma viisid lĂ€bi mĂ”ned kuud tagasi OTUSi avatud loengute raames — Data Build Tool Amazon Redshifti ladustamiseks.

Lisaks DBT-le ja Andmete Ladustamisele viib OTUSi Data Engineer kursuse raames mina ja mu kolleegid lÀbi loenguid mitmetes muudest aktuaalsetest ja kaasaegsetest teemadest:

  • Suuri Andmeid rakenduste arhitektuuri kontseptsioonid
  • Praktika Sparkiga ja Spark Streaminguga
  • Andmeallikate laadimise meetodite ja vahendite uurimine
  • AnalĂŒĂŒtiliste vitriinide ehitamine DWH-s
  • NoSQL kontseptsioonid: HBase, Cassandra, ElasticSearch
  • JĂ€lgimise ja orkestreerimise korraldamise pĂ”himĂ”tted 
  • LĂ”ppprojekt: kogume kĂ”ik oskused kokku mentorite toetusel

Lingid:

  1. DBT dokumentatsioon — Sissejuhatus — Ametlik dokumentatsioon
  2. Mis on dbt? — DBT ĂŒhe autori ĂŒlevaate artikkel 
  3. Data Build Tool Amazon Redshifti ladustamiseks — YouTube, OTUSi avatud loengu salvestus
  4. Tutvumine Greenplumiga — JĂ€rgmine avatud loeng 15. mai 2020
  5. Andmete inseneri kursus — OTUS
  6. KĂŒpsete analĂŒĂŒtikate töövoogude loomine — Pilk tulevikku andmete ja analĂŒĂŒsi töötamises
  7. On aeg avatud lĂ€htekoodiga analĂŒĂŒtika jaoks — AnalĂŒĂŒsi evolutsioon ja avatud lĂ€htekoodi mĂ”ju
  8. JĂ€tkuv Integreerimine ja Automaatne Ehituskatsetamine dbtCloudiga — CI pĂ”himĂ”tted DBT kasutamisel
  9. Alustamine DBT Ă”petusega — Praktika, Samm-sammult juhised iseseisvaks tööks
  10. Jaffle pood — Github DBT Ă”petus — Github, Ă”ppeprojekti kood

Lisainfot kursuse kohta.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster