ProHoster > blog > Utawala > 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).
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:
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:
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:
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
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.
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:
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)
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.
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.
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