Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie
Sou ki prensip yo bati yon depo done ideyal?

Konsantre sou valè biznis ak analytics nan absans kòd boilerplate. Jere DWH kòm yon baz kòd: vèsyon, revizyon, tès otomatik ak CI. Modilè, extensible, sous louvri ak kominote. Dokimantasyon zanmitay ak vizyalizasyon depandans (Done Lineage).

Plis sou tout bagay sa yo ak sou wòl DBT nan ekosistèm Big Data & Analytics - Byenveni nan chat.

Bonjou tout moun

Artemy Kozyr an kontak. Pou plis pase 5 ane mwen te travay ak depo done, bati ETL / ELT, osi byen ke analiz done ak vizyalizasyon. Kounye a mwen ap travay nan woule, Mwen anseye nan OTUS sou yon kou Done Enjenyè, e jodi a mwen vle pataje avèk ou yon atik ke mwen te ekri nan patisipe nan kòmansman an nouvo enskripsyon pou kou a.

Rezime

Fondasyon DBT a se tout sou T nan akwonim ELT (Extract - Transform - Load).

Avèk aparisyon baz done analyse pwodiktif ak évolutif tankou BigQuery, Redshift, Snowflake, pa t gen okenn pwen pou fè transfòmasyon andeyò Data Warehouse. 

DBT pa telechaje done ki soti nan sous, men li bay gwo opòtinite pou travay ak done ki deja chaje nan Depo a (nan Depo Entèn oswa Ekstèn).

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie
Objektif prensipal DBT se pran kòd la, konpile li nan SQL, egzekite kòmandman yo nan sekans kòrèk la nan Repository la.

Estrikti Pwojè DBT

Pwojè a konsiste de anyè ak fichye sèlman 2 kalite:

  • Modèl (.sql) - yon inite transfòmasyon eksprime pa yon rechèch SELECT
  • Fichye konfigirasyon (.yml) - paramèt, paramèt, tès, dokimantasyon

Nan yon nivo debaz, travay la estriktire jan sa a:

  • Itilizatè a prepare kòd modèl nan nenpòt IDE pratik
  • Sèvi ak CLI a, modèl yo te lanse, DBT konpile kòd modèl la nan SQL
  • Kòd SQL konpile a egzekite nan Depo a nan yon sekans bay (graf)

Men ki jan kouri soti nan CLI a ta ka sanble:

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie

Tout se SELECT

Sa a se yon karakteristik asasen nan kad Zouti Konstwi Done. Nan lòt mo, DBT abstrè tout kòd ki asosye ak materyalize demann ou yo nan magazen an (varyasyon soti nan kòmandman yo CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, ...).

Nenpòt modèl enplike ekri yon sèl rechèch SELECT ki defini seri done ki kapab lakòz.

Nan ka sa a, lojik transfòmasyon an ka milti-nivo ak konsolide done ki soti nan plizyè lòt modèl. Yon egzanp yon modèl ki pral bati yon vitrin lòd (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

Ki bagay enteresan nou ka wè isit la?

Premye: Itilize CTE (Ekspresyon Tablo Komen) - pou òganize ak konprann kòd ki gen anpil transfòmasyon ak lojik biznis.

Dezyèm: Kòd modèl se yon melanj de SQL ak lang Jenja (langaj modèl).

Egzanp lan sèvi ak yon bouk pou jenere kantite lajan pou chak metòd peman espesifye nan ekspresyon an mete. Se fonksyon an tou itilize ref - kapasite pou fè referans ak lòt modèl nan kòd la:

  • Pandan konpilasyon ref pral konvèti nan yon konsèy sib nan yon tab oswa gade nan Depo
  • ref pèmèt ou bati yon graf depandans modèl

Egzakteman Jenja ajoute posiblite prèske san limit nan DBT. Sa ki pi souvan itilize yo se:

  • Si / lòt bagay deklarasyon - deklarasyon branch
  • Pou bouk
  • Varyab
  • Macro - kreye makro

Materyalizasyon: Tablo, View, Incremental

Estrateji materyalizasyon se yon apwòch selon ki seri done modèl ki kapab lakòz yo pral estoke nan Depo a.

An tèm debaz li se:

  • Tablo - tab fizik nan Depo a
  • View - wè, tab vityèl nan Depo

Genyen tou estrateji materyalizasyon ki pi konplèks:

  • Incremental - loading incrémentielle (nan gwo tablo reyalite); Nouvo liy yo ajoute, liy ki chanje yo mete ajou, liy efase yo efase 
  • Efemèr - modèl la pa konkretize dirèkteman, men patisipe kòm yon CTE nan lòt modèl
  • Nenpòt lòt estrateji ou ka ajoute tèt ou

Anplis estrateji materyalizasyon, gen opòtinite pou optimize pou Depo espesifik, pou egzanp:

  • Snowflake: Tablo pasajè, Konpòtman Fizyon, Gwoupman Tablo, Sibvansyon pou kopye, opinyon an sekirite
  • Redshift: Distkey, Sortkey (interleaved, konpoze), Late Binding Views
  • bigquery: Tablo partitioning & clustering, Konpòtman Fizyon, KMS chifreman, Labels & Tags
  • Fè lafimen oupbyen etensèl: Fòma fichye (parquet, csv, json, orc, delta), partition_by, clustered_by, bokit, incremental_strategy

Depo sa yo sipòte kounye a:

  • postgres
  • Redshift
  • bigquery
  • Snowflake
  • Presto (pasyèlman)
  • Spark (pasyèlman)
  • Microsoft SQL sèvè (adaptè kominote)

Ann amelyore modèl nou an:

  • Ann fè ranpli li yo ogmante (Enkremantal)
  • Ann ajoute segmantasyon ak klasman kle pou 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

Modèl graf depandans

Li se tou yon pye bwa depandans. Li rele tou DAG (Directed Acyclic Graph).

DBT bati yon graf ki baze sou konfigirasyon tout modèl pwojè yo, oswa pito, ref() lyen nan modèl yo ak lòt modèl. Gen yon graf pèmèt ou fè bagay sa yo:

  • Kouri modèl nan sekans ki kòrèk la
  • Paralelizasyon fòmasyon devan magazen
  • Kouri yon subgraf abitrè 

Egzanp vizyalizasyon graf:

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie
Chak ne nan graf la se yon modèl; bor yo nan graf la espesifye pa ekspresyon ref.

Kalite Done ak Dokimantasyon

Anplis de jenere modèl yo tèt yo, DBT pèmèt ou teste yon kantite sipozisyon sou seri done ki kapab lakòz yo, tankou:

  • Pa nil
  • Inik
  • Entegrite referans - entegrite referans (pa egzanp, customer_id nan tablo lòd yo koresponn ak id nan tablo kliyan an)
  • Matche lis valè akseptab yo

Li posib pou ajoute tès pwòp ou yo (tès done koutim), tankou, pou egzanp, % devyasyon nan revni ak endikatè soti nan yon jou, yon semèn, yon mwa de sa. Nenpòt sipozisyon fòmile kòm yon rechèch SQL ka vin yon tès.

Nan fason sa a, ou ka trape devyasyon vle ak erè nan done nan fenèt Depo yo.

An tèm de dokiman, DBT bay mekanis pou ajoute, vèsyon, ak distribye metadata ak kòmantè nan nivo modèl la e menm atribi. 

Men ki jan ajoute tès ak dokiman yo sanble nan nivo fichye konfigirasyon an:

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

Men kisa dokiman sa a sanble sou sit entènèt ki te pwodwi a:

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie

Makro ak modil

Objektif DBT se pa tèlman pou vin yon seri script SQL, men pou bay itilizatè yo yon mwayen pwisan ak anpil karakteristik pou konstwi pwòp transfòmasyon yo epi distribye modil sa yo.

Makro yo se ansanm konstriksyon ak ekspresyon ke yo ka rele kòm fonksyon nan modèl yo. Makro pèmèt ou reitilize SQL ant modèl ak pwojè an akò ak prensip jeni DRY (pa repete tèt ou).

Macro egzanp:

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

Ak itilizasyon li yo:

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

DBT vini ak yon manadjè pake ki pèmèt itilizatè yo pibliye ak reitilize modil endividyèl ak makro.

Sa vle di ke ou kapab chaje ak itilize bibliyotèk tankou:

  • dbt_utils: travay ak Dat/Lè, Kle Ranplasan, Tès Schema, Pivot/Unpivot ak lòt moun
  • Modèl vitrin ki pare pou sèvis tankou Sous nèj и reye 
  • Bibliyotèk pou magazen done espesifik, pa egzanp. Redshift 
  • Antre — Modil pou antre operasyon DBT

Ou ka jwenn yon lis konplè pakè nan dbt mwaye.

Menm plis karakteristik

Isit la mwen pral dekri kèk lòt karakteristik enteresan ak aplikasyon ke ekip la ak mwen itilize yo bati yon Depo Done nan woule.

Separasyon nan anviwònman ègzekutabl DEV - TÈS - PROD

Menm nan menm gwoup DWH la (nan diferan plan). Pou egzanp, lè l sèvi avèk ekspresyon sa a:

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

Kòd sa a literalman di: pou anviwònman dev, tès, ci pran done sèlman pou 3 dènye jou yo e pa plis. Sa vle di, kouri nan anviwònman sa yo pral pi vit epi mande pou mwens resous. Lè w ap kouri sou anviwònman an Prod kondisyon filtre a pral inyore.

Materyalizasyon ak kodaj kolòn altène

Redshift se yon DBMS kolòn ki pèmèt ou mete algoritm konpresyon done pou chak kolòn endividyèl. Chwazi algoritm optimal ka diminye espas ki gen kapasite pa 20-50%.

Makro redshift.compress_table pral egzekite kòmand ANALYZE COMPRESSION la, kreye yon nouvo tab ak algorithm kodaj kolòn yo rekòmande, kle segmantasyon espesifye (dist_key) ak kle klasman (sort_key), transfere done yo sou li, epi, si sa nesesè, efase ansyen kopi a.

Makro siyati:

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

Logging modèl kouri

Ou ka tache kwòk nan chak ekzekisyon nan modèl la, ki pral egzekite anvan lansman oswa imedyatman apre kreyasyon an nan modèl la fini:

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

Modil anrejistreman an pral pèmèt ou anrejistre tout metadata ki nesesè yo nan yon tablo separe, ki ka imedyatman itilize pou fè odit ak analize bouche.

Men sa tablodbò a sanble ki baze sou done antre nan Looker:

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie

Otomatik nan antretyen depo

Si w itilize kèk ekstansyon nan fonksyonalite Repository yo itilize a, tankou UDF (Fonksyon Itilizatè Defini), Lè sa a, vèsyon fonksyon sa yo, kontwòl aksè, ak otomatik woule soti nan nouvo degaje se trè pratik fè nan DBT.

Nou itilize UDF nan Python pou kalkile hash, domèn imèl, ak dekodaj bitmask.

Yon egzanp yon makro ki kreye yon UDF sou nenpòt anviwònman ekzekisyon (dev, tès, 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 %}

Nan Wheely nou itilize Amazon Redshift, ki baze sou PostgreSQL. Pou Redshift, li enpòtan pou kolekte estatistik regilyèman sou tab epi libere espas ki gen kapasite - kòmand ANALYZE ak VACUUM, respektivman.

Pou fè sa, kòmandman ki soti nan macro redshift_maintenance yo egzekite chak swa:

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

Li posib pou itilize DBT kòm yon sèvis (Managed Service). Enkli:

  • Web IDE pou devlope pwojè ak modèl
  • Konfigirasyon travay ak orè
  • Aksè senp ak pratik nan mòso bwa
  • Sit entènèt ki gen dokiman sou pwojè w la
  • Konekte CI (Entegrasyon kontinyèl)

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie

Konklizyon

Prepare ak konsome DWH vin pi agreyab ak benefisye menm jan ak bwè yon smoothie. DBT konsiste de Jinja, ekstansyon itilizatè (modil), yon du, yon ekzekitè, ak yon manadjè pake. Lè w mete eleman sa yo ansanm ou jwenn yon anviwònman travay konplè pou Data Warehouse ou. Pa gen yon pi bon fason pou jere transfòmasyon nan DWH jodi a.

Zouti Konstwi Done oswa sa ki komen ant Data Warehouse ak Smoothie

Kwayans yo swiv pa devlopè DBT yo fòmile jan sa a:

  • Kòd, pa entèfas, se pi bon abstraksyon pou eksprime lojik analyse konplèks
  • Travay ak done yo ta dwe adapte pi bon pratik nan jeni lojisyèl (Enjenieri lojisyèl)

  • Enfrastrikti done kritik yo ta dwe kontwole pa kominote itilizatè a kòm lojisyèl sous louvri
  • Non sèlman zouti analytics, men tou, kòd pral de pli zan pli vin pwopriyete kominote Open Source la

Kwayans debaz sa yo te anjandre yon pwodwi ke plis pase 850 konpayi yo itilize jodi a, epi yo fòme baz anpil ekstansyon enteresan ki pral kreye alavni.

Pou moun ki enterese, gen yon videyo sou yon leson ouvè mwen te bay kèk mwa de sa kòm yon pati nan yon leson ouvè nan OTUS - Zouti Konstwi done pou Amazon Redshift Depo.

Anplis DBT ak Data Warehousing, nan kad kou Data Engineer sou platfòm OTUS la, mwen menm ak kòlèg mwen yo anseye kou sou yon kantite lòt sijè ki enpòtan ak modèn:

  • Konsèp achitekti pou aplikasyon pou gwo done
  • Pratike ak Spark ak Spark Streaming
  • Eksplore metòd ak zouti pou chaje sous done yo
  • Bati vitrin analyse nan DWH
  • Konsèp NoSQL: HBase, Cassandra, ElasticSearch
  • Prensip siveyans ak òkestrasyon 
  • Pwojè final la: mete tout konpetans yo ansanm anba sipò mentoring

Lyen:

  1. Dokiman DBT - Entwodiksyon — Dokiman ofisyèl
  2. Ki sa ki, egzakteman, dbt? — Revize atik pa youn nan otè yo nan DBT 
  3. Zouti Konstwi done pou Amazon Redshift Depo — YouTube, Anrejistreman yon leson ouvè OTUS
  4. Lè w konnen Greenplum — Pwochen leson ouvè a se 15 me 2020
  5. Kou Jeni Done —OTUS
  6. Bati yon Workflow Analytics ki gen matirite — Yon gade nan tan kap vini done ak analytics
  7. Li lè pou analytics sous louvri — Evolisyon analytics ak enfliyans Open Source
  8. Entegrasyon kontinyèl ak tès konstriksyon otomatik ak dbtCloud — Prensip pou konstwi CI lè l sèvi avèk DBT
  9. Kòmanse ak leson patikilye DBT — Pratike, Enstriksyon etap pa etap pou travay endepandan
  10. Boutik Jaffle — Github DBT Tutorial — Github, kòd pwojè edikasyon

Aprann plis sou kou a.

Sous: www.habr.com

Add nouvo kòmantè