Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie
Ghala bora la Data hujengwa kwa kanuni zipi?

Zingatia thamani ya biashara na uchanganuzi kwa kutokuwepo kwa nambari ya boilerplate. Kusimamia DWH kama msingi wa msimbo: uchapishaji, hakiki, majaribio ya kiotomatiki na CI. Msimu, kupanuliwa, chanzo wazi na jumuiya. Nyaraka zinazofaa mtumiaji na taswira ya utegemezi (Ukoo wa Data).

Zaidi kuhusu haya yote na kuhusu jukumu la DBT katika Mfumo wa Data Kubwa na Uchanganuzi - karibu kwenye paka.

Salaam wote

Artemy Kozyr anawasiliana. Kwa zaidi ya miaka 5 nimekuwa nikifanya kazi na maghala ya data, kujenga ETL/ELT, pamoja na uchanganuzi wa data na taswira. Kwa sasa ninafanya kazi katika magurudumu, Ninafundisha katika OTUS kwenye kozi Mhandisi wa Data, na leo nataka kushiriki nawe makala ambayo niliandika kwa kutarajia kuanza uandikishaji wapya kwa kozi hiyo.

Maoni mafupi

Mfumo wa DBT unahusu T katika kifupi cha ELT (Dondoo - Badilisha - Mzigo).

Pamoja na ujio wa hifadhidata za uchanganuzi zenye tija na hatari kama BigQuery, Redshift, Snowflake, hakukuwa na maana ya kufanya mabadiliko nje ya Ghala la Data. 

DBT haipakui data kutoka kwa vyanzo, lakini hutoa fursa nzuri za kufanya kazi na data ambayo tayari imepakiwa kwenye Hifadhi (katika Hifadhi ya Ndani au Nje).

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie
Kusudi kuu la DBT ni kuchukua nambari, kuikusanya katika SQL, kutekeleza amri katika mlolongo sahihi kwenye Hifadhi.

Muundo wa Mradi wa DBT

Mradi huo una saraka na faili za aina 2 tu:

  • Mfano (.sql) - kitengo cha mabadiliko kilichoonyeshwa na swali la CHAGUA
  • Faili ya usanidi (.yml) - vigezo, mipangilio, vipimo, nyaraka

Katika kiwango cha msingi, kazi imeundwa kama ifuatavyo:

  • Mtumiaji huandaa msimbo wa mfano katika IDE yoyote inayofaa
  • Kwa kutumia CLI, miundo inazinduliwa, DBT inakusanya msimbo wa kielelezo kuwa SQL
  • Nambari iliyokusanywa ya SQL inatekelezwa kwenye Hifadhi katika mlolongo fulani (grafu)

Hivi ndivyo kukimbia kutoka kwa CLI kunaweza kuonekana kama:

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie

Kila kitu ni CHAGUA

Hiki ni kipengele muuaji cha mfumo wa Zana ya Kujenga Data. Kwa maneno mengine, DBT huchota msimbo wote unaohusishwa na kuwasilisha hoja zako kwenye Duka (tofauti kutoka kwa amri CREATE, WEKA, SASISHA, FUTA ALTER, GRANT, ...).

Muundo wowote unajumuisha kuandika swali moja CHAGUA ambalo linafafanua seti ya data inayotokana.

Katika kesi hii, mantiki ya mabadiliko inaweza kuwa ya ngazi nyingi na kuunganisha data kutoka kwa mifano mingine kadhaa. Mfano wa mfano ambao utaunda onyesho la agizo (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

Ni mambo gani ya kuvutia tunaweza kuona hapa?

Kwanza: Imetumika CTE (Maelezo ya Jedwali la Kawaida) - kupanga na kuelewa msimbo ambao una mabadiliko mengi na mantiki ya biashara.

Pili: Msimbo wa mfano ni mchanganyiko wa SQL na lugha Jinja (lugha ya kuiga).

Mfano hutumia kitanzi kwa ili kutoa kiasi kwa kila njia ya malipo iliyobainishwa kwenye usemi kuweka. Kazi pia hutumiwa ref - uwezo wa kurejelea mifano mingine ndani ya nambari:

  • Wakati wa mkusanyiko ref itabadilishwa kuwa kielekezi lengwa hadi kwenye jedwali au kutazamwa kwenye Hifadhi
  • ref hukuruhusu kuunda grafu ya utegemezi wa mfano

Hasa Jinja inaongeza uwezekano usio na kikomo kwa DBT. Yanayotumika zaidi ni:

  • Ikiwa / vinginevyo taarifa - taarifa za tawi
  • Kwa vitanzi
  • Vigezo
  • Macro - kuunda macros

Uboreshaji wa nyenzo: Jedwali, Mtazamo, Unaoongezeka

Mkakati wa uboreshaji ni mbinu kulingana na ambayo seti ya data ya mfano itahifadhiwa kwenye Hifadhi.

Kwa maneno ya msingi ni:

  • Jedwali - meza ya kimwili katika Hifadhi
  • Tazama - tazama, jedwali pepe kwenye Hifadhi

Kuna pia mikakati ngumu zaidi ya nyenzo:

  • Kuongezeka - upakiaji wa ziada (wa meza kubwa za ukweli); mistari mpya huongezwa, mistari iliyobadilishwa inasasishwa, mistari iliyofutwa inafutwa 
  • Ephemeral - mfano haufanyiki moja kwa moja, lakini hushiriki kama CTE katika mifano mingine
  • Mikakati mingine yoyote unaweza kujiongeza

Mbali na mikakati ya uboreshaji, kuna fursa za uboreshaji wa Hifadhi maalum, kwa mfano:

  • Snowflake: Majedwali ya muda mfupi, Unganisha tabia, Kukusanya meza, Ruzuku za kunakili, Mionekano salama
  • Kuondoka: Distkey, Sortkey (iliyoingiliana, mchanganyiko), Maoni ya Kuchelewa Kufunga
  • BigQuery: Ugawaji wa jedwali & nguzo, Unganisha tabia, Usimbaji fiche wa KMS, Lebo na Lebo
  • Cheche: Umbizo la faili (parquet, csv, json, orc, delta), partition_by, clustered_by, ndoo, incremental_strategy

Hifadhi zifuatazo zinatumika kwa sasa:

  • postgres
  • Kuondoka
  • BigQuery
  • Snowflake
  • Presto (sehemu)
  • Cheche (sehemu)
  • Seva ya Microsoft SQL (adapta ya jumuiya)

Wacha tuboreshe muundo wetu:

  • Wacha tufanye ujazo wake uwe wa kuongezeka (Kuongeza)
  • Wacha tuongeze funguo za sehemu na kupanga kwa 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

Grafu ya utegemezi wa mfano

Pia ni mti wa utegemezi. Pia inajulikana kama DAG (Directed Acyclic Graph).

DBT huunda grafu kulingana na usanidi wa miundo yote ya mradi, au tuseme, ref() viungo ndani ya miundo hadi miundo mingine. Kuwa na grafu hukuruhusu kufanya mambo yafuatayo:

  • Kuendesha mifano katika mlolongo sahihi
  • Uwiano wa uundaji wa mbele ya duka
  • Kuendesha kijitabu kiholela 

Mfano wa taswira ya grafu:

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie
Kila nodi ya grafu ni kielelezo; kingo za grafu zimebainishwa na rejeleo la usemi.

Ubora wa Data na Nyaraka

Mbali na kutengeneza modeli zenyewe, DBT hukuruhusu kujaribu mawazo kadhaa kuhusu seti ya data inayotokana, kama vile:

  • Sio Null
  • Kipekee
  • Uadilifu wa Marejeleo - uadilifu wa marejeleo (kwa mfano, kitambulisho cha mteja katika jedwali la maagizo kinalingana na kitambulisho kwenye jedwali la wateja)
  • Kulinganisha orodha ya maadili yanayokubalika

Inawezekana kuongeza majaribio yako mwenyewe (majaribio ya data maalum), kama, kwa mfano, kupotoka kwa % ya mapato na viashirio vya siku, wiki, mwezi uliopita. Dhana yoyote iliyoundwa kama hoja ya SQL inaweza kuwa mtihani.

Kwa njia hii, unaweza kupata kupotoka na makosa yasiyohitajika katika data kwenye madirisha ya Ghala.

Kwa upande wa uhifadhi, DBT hutoa mbinu za kuongeza, matoleo, na kusambaza metadata na maoni katika modeli na viwango vya sifa. 

Hivi ndivyo kuongeza majaribio na nyaraka kunaonekana katika kiwango cha faili ya usanidi:

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

Na hii ndio hati hii inavyoonekana kwenye wavuti iliyotengenezwa:

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie

Macros na Moduli

Madhumuni ya DBT sio sana kuwa seti ya hati za SQL, lakini kuwapa watumiaji njia zenye nguvu na zenye vipengele vingi kwa ajili ya kujenga mabadiliko yao wenyewe na kusambaza moduli hizi.

Macro ni seti za miundo na misemo ambayo inaweza kuitwa kama kazi ndani ya mifano. Macros hukuruhusu kutumia tena SQL kati ya miundo na miradi kwa mujibu wa kanuni ya uhandisi ya KAVU (Usijirudie).

Mfano mkubwa:

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

Na matumizi yake:

{% set column_name = 'product' %}
select
 product,
 {{ rename_category(column_name) }} -- Π²Ρ‹Π·ΠΎΠ² макроса
from my_table

DBT inakuja na kidhibiti kifurushi kinachoruhusu watumiaji kuchapisha na kutumia tena moduli na makro.

Hii inamaanisha kuwa na uwezo wa kupakia na kutumia maktaba kama vile:

  • dbt_vitumizi: kufanya kazi na Tarehe/Saa, Vifunguo vya Udhibiti, Vipimo vya Schema, Pivot/Unpivot na vingine
  • Violezo vya onyesho vilivyo tayari kwa huduma kama vile Theluji ya theluji ΠΈ Mstari 
  • Maktaba za Hifadhi mahususi za Data, k.m. Kuondoka 
  • Logging - Moduli ya ukataji wa uendeshaji wa DBT

Orodha kamili ya vifurushi inaweza kupatikana kitovu cha dbt.

Vipengele zaidi

Hapa nitaelezea vipengele vingine vichache vya kuvutia na utekelezaji ambavyo mimi na timu tunatumia kujenga Ghala la Data magurudumu.

Mgawanyo wa mazingira ya wakati wa utekelezaji DEV - TEST - PROD

Hata ndani ya nguzo moja ya DWH (ndani ya mipango tofauti). Kwa mfano, kwa kutumia usemi ufuatao:

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

Nambari hii inasema: kwa mazingira dev, mtihani, ci chukua data kwa siku 3 zilizopita pekee na si zaidi. Hiyo ni, kukimbia katika mazingira haya itakuwa haraka sana na kuhitaji rasilimali chache. Wakati wa kukimbia kwenye mazingira Prod hali ya chujio itapuuzwa.

Uboreshaji na usimbaji wa safu wima mbadala

Redshift ni safu ya DBMS inayokuruhusu kuweka kanuni za ukandamizaji wa data kwa kila safu mahususi. Kuchagua algorithms mojawapo inaweza kupunguza nafasi ya disk kwa 20-50%.

Macro redshift.compress_table itatekeleza amri ya ANALYZE COMPRESSION, kuunda jedwali jipya na algoriti za usimbaji safu wima zilizopendekezwa, funguo maalum za sehemu (dist_key) na vitufe vya kupanga (sort_key), kuhamisha data kwake, na, ikiwa ni lazima, futa nakala ya zamani.

Sahihi ya jumla:

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

Mfano wa ukataji miti unaendeshwa

Unaweza kushikamana na ndoano kwa kila utekelezaji wa mfano, ambao utatekelezwa kabla ya uzinduzi au mara baada ya uundaji wa mfano kukamilika:

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

Moduli ya ukataji miti itakuruhusu kurekodi metadata zote muhimu katika jedwali tofauti, ambalo linaweza kutumika baadaye kukagua na kuchambua vikwazo.

Hivi ndivyo dashibodi inavyoonekana kulingana na data ya ukataji miti katika Looker:

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie

Automation ya Matengenezo ya Hifadhi

Ukitumia baadhi ya viendelezi vya utendakazi wa Hifadhi iliyotumika, kama vile UDF (Kazi Zilizofafanuliwa za Mtumiaji), basi uchapishaji wa vipengele hivi, udhibiti wa ufikiaji, na utoaji wa kiotomatiki wa matoleo mapya ni rahisi sana kufanya katika DBT.

Tunatumia UDF katika Python kukokotoa heshi, vikoa vya barua pepe, na usimbaji wa bitmask.

Mfano wa jumla ambao huunda UDF kwenye mazingira yoyote ya utekelezaji (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 %}

Katika Wheely tunatumia Amazon Redshift, ambayo inategemea PostgreSQL. Kwa Redshift, ni muhimu kukusanya mara kwa mara takwimu kwenye meza na kufungua nafasi ya disk - amri za ANALYZE na VACUUM, kwa mtiririko huo.

Ili kufanya hivyo, amri kutoka kwa redshift_maintenance macro hutekelezwa kila usiku:

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

Wingu la DBT

Inawezekana kutumia DBT kama huduma (Huduma Inayosimamiwa). Imejumuishwa:

  • Mtandao IDE kwa ajili ya kuendeleza miradi na mifano
  • Mpangilio wa kazi na ratiba
  • Ufikiaji rahisi na rahisi wa kumbukumbu
  • Tovuti iliyo na hati za mradi wako
  • Kuunganisha CI (Ushirikiano Unaoendelea)

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie

Hitimisho

Kutayarisha na kutumia DWH inakuwa ya kufurahisha na yenye manufaa kama vile kunywa laini. DBT inajumuisha Jinja, viendelezi vya watumiaji (module), mkusanyaji, mtekelezaji, na msimamizi wa kifurushi. Kwa kuweka vipengele hivi pamoja unapata mazingira kamili ya kufanya kazi kwa Ghala lako la Data. Hakuna njia bora zaidi ya kudhibiti mabadiliko ndani ya DWH leo.

Zana ya Kuunda Data au kile kinachojulikana kati ya Ghala la Data na Smoothie

Imani zinazofuatwa na watengenezaji wa DBT zimeundwa kama ifuatavyo:

  • Msimbo, sio GUI, ndio uondoaji bora zaidi wa kuelezea mantiki changamano ya uchanganuzi
  • Kufanya kazi na data kunapaswa kurekebisha mazoea bora katika uhandisi wa programu (Uhandisi wa Programu)

  • Miundombinu muhimu ya data inapaswa kudhibitiwa na jumuiya ya watumiaji kama programu huria
  • Sio tu zana za uchanganuzi, lakini pia msimbo utazidi kuwa mali ya jumuiya ya Open Source

Imani hizi kuu zimezalisha bidhaa ambayo inatumiwa na zaidi ya makampuni 850 leo, na zinaunda msingi wa viendelezi vingi vya kusisimua ambavyo vitaundwa katika siku zijazo.

Kwa wale wanaopenda, kuna video ya somo wazi nililotoa miezi michache iliyopita kama sehemu ya somo la wazi katika OTUS - Zana ya Kuunda Data kwa Hifadhi ya Redshift ya Amazon.

Kando na DBT na Uhifadhi wa Data, kama sehemu ya kozi ya Mhandisi wa Data kwenye jukwaa la OTUS, mimi na wenzangu tunafundisha darasa juu ya idadi ya mada nyingine muhimu na za kisasa:

  • Dhana za Usanifu kwa Programu Kubwa za Data
  • Fanya mazoezi na Spark na Spark Streaming
  • Kuchunguza mbinu na zana za kupakia vyanzo vya data
  • Kujenga maonyesho ya uchanganuzi katika DWH
  • Dhana za NoSQL: HBase, Cassandra, ElasticSearch
  • Kanuni za ufuatiliaji na uratibu 
  • Mradi wa Mwisho: kuweka ujuzi wote pamoja chini ya usaidizi wa ushauri

Marejeo:

  1. Nyaraka za DBT - Utangulizi - Nyaraka rasmi
  2. dbt ni nini hasa? - Kagua nakala ya mmoja wa waandishi wa DBT 
  3. Zana ya Kuunda Data kwa Hifadhi ya Redshift ya Amazon β€” YouTube, Kurekodi somo la wazi la OTUS
  4. Kufahamiana na Greenplum - Somo linalofuata la wazi ni Mei 15, 2020
  5. Kozi ya Uhandisi wa Data - OTUS
  6. Kuunda Mtiririko wa Uchanganuzi wa Watu Wazima - Kuangalia mustakabali wa data na uchanganuzi
  7. Ni wakati wa uchanganuzi wa chanzo huria - Mageuzi ya uchanganuzi na ushawishi wa Open Source
  8. Ujumuishaji unaoendelea na Jaribio la Kujenga Kiotomatiki na dbtCloud - Kanuni za kujenga CI kwa kutumia DBT
  9. Kuanza na mafunzo ya DBT - Mazoezi, maagizo ya hatua kwa hatua ya kazi ya kujitegemea
  10. Duka la Jaffle - Mafunzo ya Github DBT - Github, msimbo wa mradi wa elimu

Jifunze zaidi kuhusu kozi.

Chanzo: mapenzi.com

Kuongeza maoni