Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе
Идеалдуу маалымат кампасы кандай принциптерге негизделет?

Коду жок болгон учурда бизнестин маанисине жана аналитикага көңүл буруңуз. DWH коддук база катары башкаруу: версиялоо, карап чыгуу, автоматташтырылган тестирлөө жана CI. Модулдук, кеңейтилүүчү, ачык булак жана коомчулук. Колдонуучуга ыңгайлуу документтер жана көз карандылыктын визуализациясы (Data Lineage).

Мунун баары жана DBTтин Big Data & Analytics экосистемасындагы ролу жөнүндө кененирээк - кош келиңиз.

Всем привет

Артемий Козыр байланышта. 5 жылдан ашык убакыттан бери мен маалымат кампалары, ETL/ELT куруу, ошондой эле маалыматтарды аналитика жана визуализация менен иштеп келем. Учурда иштеп жатам дөңгөлөктүү, Мен OTUS курсунда сабак берем маалыматтар боюнча инженер, жана бүгүн башталышын утурлай жазган макаламды сиздер менен бөлүшкүм келет курска жаңы катталуу.

кинорежиссерлордун

DBT алкагы ELT (Extract - Transform - Load) аббревиатурасындагы T жөнүндө.

BigQuery, Redshift, Snowflake сыяктуу жемиштүү жана масштабдуу аналитикалык маалымат базаларынын пайда болушу менен, Маалыматтар кампасына тышкаркы трансформацияларды жасоонун мааниси жок болчу. 

DBT булактан маалыматтарды жүктөбөйт, бирок сактагычка (Ички же Тышкы сактагычта) жүктөлгөн маалыматтар менен иштөө үчүн чоң мүмкүнчүлүктөрдү берет.

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе
DBTтин негизги максаты - кодду алуу, аны SQLге компиляциялоо, репозиторийде туура ырааттуулукта буйруктарды аткаруу.

DBT Долбоорунун структурасы

Долбоор эки гана түрдөгү каталогдордон жана файлдардан турат:

  • Модел (.sql) - SELECT суроосу менен туюнтулган трансформация бирдиги
  • Конфигурация файлы (.yml) - параметрлер, орнотуулар, тесттер, документтер

Негизги деңгээлде иш төмөнкүчө түзүлөт:

  • Колдонуучу каалаган ыңгайлуу IDEде моделдин кодун даярдайт
  • CLI колдонуп, моделдер ишке киргизилет, DBT моделдин кодун SQLге түзөт
  • Түзүлгөн SQL коду Сактагычта берилген ырааттуулукта аткарылат (график)

Бул жерде CLIден иштөө кандай болушу мүмкүн:

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе

Баары ТАНДОО

Бул Data Build Tool рамкасынын өлтүргүч өзгөчөлүгү. Башка сөз менен айтканда, DBT сиздин суроо-талаптарыңызды Дүкөндө ишке ашырууга байланышкан бардык кодду абстракциялайт (CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, ... буйруктарынын вариациялары).

Ар кандай модель натыйжадагы маалыматтар топтомун аныктаган бир SELECT суроосун жазууну камтыйт.

Бул учурда трансформациялоо логикасы көп деңгээлдүү болушу мүмкүн жана бир нече башка моделдердин маалыматтарын бириктирет. Заказ витринасын кура турган моделдин мисалы (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

Бул жерден кандай кызыктуу нерселерди көрө алабыз?

Биринчиси: Колдонулган CTE (Common Table Expressions) - көптөгөн трансформацияларды жана бизнес логикасын камтыган кодду уюштуруу жана түшүнүү үчүн

Экинчи: Модель коду SQL менен тилдин аралашмасы Jinja (шаблондоо тили).

Мисал циклди колдонот үчүн туюнтулган ар бир төлөм ыкмасы үчүн сумманы түзүү коюлган. функциясы да колдонулат булак - коддун ичиндеги башка моделдерге шилтеме жасоо мүмкүнчүлүгү:

  • Компиляция учурунда булак Сактагычтагы таблицага же көрүнүшкө максаттуу көрсөткүчкө айландырылат
  • булак моделдик көз карандылык графигин түзүүгө мүмкүндүк берет

атап айтканда, Jinja DBT дээрлик чексиз мүмкүнчүлүктөрдү кошот. Эң көп колдонулгандары төмөнкүлөр:

  • If / else операторлору - тармактык билдирүүлөр
  • Циклдер үчүн
  • Өзгөрмөлөр
  • Макро - макросторду түзүү

Материализация: Таблица, Көрүү, Инкременттүү

Материалдаштыруу стратегиясы - бул моделдин маалыматтарынын топтому Сактагычта сактала турган ыкма.

Негизги мааниде бул:

  • Таблица - сактагычтагы физикалык таблица
  • Көрүү - көрүү, Сактагычта виртуалдык таблица

Ошондой эле татаалыраак материалдаштыруу стратегиялары бар:

  • Кошумча - кошумча жүктөө (чоң факты таблицаларынын); жаңы саптар кошулат, өзгөртүлгөн саптар жаңыртылып, өчүрүлгөн саптар тазаланат 
  • Эфемердик - модель түздөн-түз ишке ашпайт, бирок башка моделдерде CTE катары катышат
  • Башка стратегияларды өзүңүз кошо аласыз

Материалдаштыруу стратегияларынан тышкары, белгилүү бир сактагычтар үчүн оптималдаштыруу мүмкүнчүлүктөрү бар, мисалы:

  • кар: Убактылуу таблицалар, Бириктирүү жүрүм-туруму, Таблицаны кластерлөө, Гранттарды көчүрүү, Коопсуз көрүнүштөр
  • Redshift: Diskkey, Sortkey (аралашкан, татаал), Late Binding Views
  • чоң суроо: Таблицаны бөлүү жана кластерлөө, Бириктирүү жүрүм-туруму, KMS шифрлөө, Энбелгилер жана тегдер
  • учкун: Файл форматы (паркет, csv, json, orc, дельта), бөлүм_көчүрүүчүсү, кластердик_би, чакалар, кошумча_стратегиясы

Учурда төмөнкү Сактагычтар колдоого алынат:

  • postgres
  • Redshift
  • чоң суроо
  • кар
  • Presto (жарым-жартылай)
  • Учкун (жарым-жартылай)
  • Microsoft SQL Server (коомдук адаптер)

Келгиле, моделибизди жакшырталы:

  • Келгиле, аны толтурууну кошумча кылалы (кошумча)
  • 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

Моделдик көз карандылык графиги

Бул ошондой эле көз карандылык дарагы. Ал ошондой эле DAG (багытталган циклдик график) катары белгилүү.

DBT бардык долбоордук моделдердин конфигурациясынын негизинде графикти курат, тагыраак айтканда, башка моделдерге моделдердин ичиндеги ref() шилтемелери. Графикке ээ болуу төмөнкү нерселерди кылууга мүмкүндүк берет:

  • Туура ырааттуулукта иштеп жаткан моделдер
  • Дүкөндү түзүүнүн параллелизациясы
  • ыктыярдуу субграфты иштетүү 

График визуализациясынын мисалы:

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе
Графиктин ар бир түйүнү модель болуп саналат; графиктин четтери ref туюнтмасы менен аныкталат.

Маалыматтын сапаты жана документация

Моделдердин өздөрүн жаратуудан тышкары, DBT сиз алынган маалыматтар топтому жөнүндө бир катар божомолдорду сынап көрүүгө мүмкүндүк берет, мисалы:

  • Null эмес
  • жалгыз
  • Шилтеме бүтүндүгү - маалымдама бүтүндүгү (мисалы, заказдар таблицасындагы customer_id кардарлардын таблицасындагы id менен туура келет)
  • Алгылыктуу баалуулуктардын тизмесине дал келүү

Бул, мисалы, бир күн, бир жума, бир ай мурунку көрсөткүчтөр менен кирешенин% четтөө сыяктуу, өз тесттер (баасы маалымат тесттер) кошууга болот. SQL суроосу катары формулировкаланган ар кандай божомол сыноо болуп калышы мүмкүн.

Ушундай жол менен сиз кампа терезелериндеги маалыматтардагы керексиз четтөөлөрдү жана каталарды байкай аласыз.

Документтөө жагынан DBT моделдин жана атрибуттун деңгээлинде метаберилиштерди жана комментарийлерди кошуу, версиялоо жана жайылтуу механизмдерин камсыз кылат. 

Конфигурация файлынын деңгээлинде тесттерди жана документтерди кошуу төмөнкүдөй көрүнөт:

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

Жана бул документация түзүлгөн веб-сайтта кандай көрүнөт:

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе

Макростар жана модулдар

DBTтин максаты SQL скрипттеринин жыйындысы болуу эмес, колдонуучуларга өздөрүнүн трансформацияларын куруу жана бул модулдарды жайылтуу үчүн күчтүү жана өзгөчөлүктөргө бай каражаттар менен камсыз кылуу.

Макрос - бул моделдердин ичиндеги функциялар деп атоого боло турган конструкциялардын жана туюнтмалардын жыйындысы. Макростор DRY (Өзүңүздү кайталабаңыз) инженердик принцибине ылайык моделдер менен долбоорлордун ортосунда SQLди кайра колдонууга мүмкүндүк берет.

Макромисалы:

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

Жана анын колдонулушу:

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

DBT колдонуучуларга жеке модулдарды жана макросторду жарыялоого жана кайра колдонууга мүмкүндүк берген пакет менеджери менен келет.

Бул төмөнкү сыяктуу китепканаларды жүктөө жана колдонуу мүмкүнчүлүгүн билдирет:

  • dbt_utils: Дата/Убакыт, Сурогат ачкычтары, Схема тесттери, Pivot/Unpivot жана башкалар менен иштөө
  • сыяктуу кызматтар үчүн даяр витрина шаблондору Кар тазалагыч и тилке 
  • Белгилүү маалымат дүкөндөрү үчүн китепканалар, мис. Redshift 
  • Logging — DBT операциясын жазуу үчүн модул

Пакеттердин толук тизмесин даректен тапса болот dbt хабы.

Андан да көп өзгөчөлүктөр

Бул жерде мен команда жана мен маалымат кампасын куруу үчүн колдонгон бир нече башка кызыктуу функцияларды жана ишке ашырууларды сүрөттөп берем дөңгөлөктүү.

Иштөө чөйрөлөрүнүн бөлүнүшү DEV - TEST - PROD

Ал тургай, ошол эле DWH кластеринин ичинде (ар кандай схемалардын ичинде). Мисалы, төмөнкү сөз айкашын колдонуу:

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

Бул код түзмө-түз мындай дейт: чөйрөлөр үчүн dev, test, ci акыркы 3 күндүн ичинде гана маалымат алыңыз жана андан ашык эмес. Башкача айтканда, бул чөйрөдө чуркоо бир топ ылдамыраак жана азыраак ресурстарды талап кылат. Айлана-чөйрөдө иштеп жатканда продукт чыпка абалы этибарга алынбайт.

Кошумча тилке коддоо менен материалдаштыруу

Redshift - бул ар бир тилке үчүн маалыматтарды кысуу алгоритмдерин коюуга мүмкүндүк берген мамычалык DBMS. Оптималдуу алгоритмдерди тандоо диск мейкиндигин 20-50% кыскарта алат.

Макро redshift.compress_table ANALYZE COMPRESSION буйругун аткарат, сунушталган тилкени коддоо алгоритмдери, көрсөтүлгөн сегментация ачкычтары (dist_key) жана сорттоо ачкычтары (сорттоо_ачкычы) менен жаңы таблицаны түзөт, ага маалыматтарды өткөрүп берет жана зарыл болсо, эски көчүрмөнү жок кылат.

Макроколтамга:

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

Каттоо модели иштейт

Моделдин ар бир аткарылышына илгичтерди тиркөөгө болот, алар ишке киргизилгенге чейин же моделди түзүү аяктагандан кийин аткарылат:

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

Каттоо модулу бардык керектүү метаберилиштерди өзүнчө таблицага жазууга мүмкүндүк берет, аны кийинчерээк тоскоолдуктарды текшерүү жана талдоо үчүн колдонсо болот.

Бул Lookerдеги журналга маалыматтардын негизинде башкаруу тактасы кандай көрүнөт:

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе

Сактоочу жайды тейлөөнү автоматташтыруу

Эгер сиз колдонулган репозиторийдин функцияларынын кээ бир кеңейтүүлөрүн, мисалы, UDF (Колдонуучу тарабынан аныкталган функциялар) колдонсоңуз, анда бул функцияларды версиялоо, кирүү мүмкүнчүлүгүн көзөмөлдөө жана жаңы релиздерди автоматташтыруу DBTте аткаруу үчүн абдан ыңгайлуу.

Биз хэштерди, электрондук почта домендерин жана бит маскаларын чечмелөө үчүн Pythonдо UDF колдонобуз.

Ар кандай аткаруу чөйрөсүндө UDF түзүүчү макростун мисалы (иштеп чыгуучу, тест, прод):

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

Wheelyде биз PostgreSQLге негизделген Amazon Redshiftти колдонобуз. Redshift үчүн таблицалар боюнча статистиканы үзгүлтүксүз чогултуу жана дискте орун бошотуу маанилүү - тиешелүүлүгүнө жараша ANALYZE жана VACUUM командалары.

Бул үчүн, redshift_maintenance макросундагы буйруктар ар түнү аткарылат:

{% 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ти кызмат катары колдонсо болот (Managed Service). Топтомдо:

  • Долбоорлорду жана моделдерди иштеп чыгуу үчүн Web IDE
  • Жумуштун конфигурациясы жана пландаштыруу
  • Журналдарга жөнөкөй жана ыңгайлуу кирүү
  • Долбооруңуздун документтери менен веб-сайт
  • CI туташтыруу (үзгүлтүксүз интеграция)

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе

жыйынтыктоо

DWH даярдоо жана керектөө смузи ичкендей жагымдуу жана пайдалуу болот. DBT Jinjaдан, колдонуучу кеңейтүүлөрүнөн (модульдерден), компилятордон, аткаруучудан жана пакет менеджеринен турат. Бул элементтерди бириктирүү менен сиз маалымат кампасы үчүн толук иштөө чөйрөсүн аласыз. Бүгүнкү күндө DWH ичиндеги трансформацияны башкаруунун жакшы жолу жок.

Data Build Tool же Data Warehouse менен Smoothie ортосунда жалпы нерсе

DBT иштеп чыгуучулардын ишенимдери төмөнкүчө чагылдырылган:

  • GUI эмес, код татаал аналитикалык логиканы туюнтуу үчүн эң жакшы абстракция болуп саналат
  • Берилиштер менен иштөө программалык камсыздоо инженериясындагы эң мыкты тажрыйбаларды ылайыкташууга тийиш (Программалык камсыздоо инженериясы)

  • Критикалык маалыматтар инфраструктурасы ачык булактуу программа катары колдонуучу коомчулугу тарабынан көзөмөлдөнүшү керек
  • Аналитика куралдары гана эмес, код дагы барган сайын Open Source коомчулугунун менчигине айланат

Бул негизги ишенимдер бүгүнкү күндө 850дөн ашык компаниялар тарабынан колдонулган продуктту жаратты жана алар келечекте түзүлө турган көптөгөн кызыктуу кеңейтүүлөрдүн негизин түзөт.

Кызыккандар үчүн OTUSдагы ачык сабактын алкагында бир нече ай мурун өткөргөн ачык сабактын видеосу бар - Amazon Redshift сактагычы үчүн маалымат куруу куралы.

DBT жана маалыматтар кампасынан тышкары, OTUS платформасындагы Data Engineer курсунун бир бөлүгү катары, мен жана менин кесиптештерим бир катар башка актуалдуу жана заманбап темалар боюнча сабактарды өткөрөбүз:

  • Big Data колдонмолору үчүн архитектуралык түшүнүктөр
  • Spark жана Spark Streaming менен машыгыңыз
  • Маалымат булактарын жүктөө ыкмаларын жана куралдарын изилдөө
  • DWHде аналитикалык витриналарды куруу
  • NoSQL түшүнүктөрү: HBase, Cassandra, ElasticSearch
  • Мониторингдин жана оркестрдин принциптери 
  • Жыйынтыктоочу долбоор: насаатчылыктын астында бардык көндүмдөрдү бириктирүү

шилтеме:

  1. DBT документтери - Киришүү - Расмий документтер
  2. dbt деген эмне? — DBT авторлорунун биринин макаласы 
  3. Amazon Redshift сактагычы үчүн маалымат куруу куралы — YouTube, OTUS ачык сабактан жаздыруу
  4. Greenplum менен таанышуу — Кийинки ачык сабак 15-жылдын 2020-майында
  5. Маалымат инженериясы курсу —OTUS
  6. Жетилген аналитиканын иштөө процессин түзүү — Маалыматтын жана аналитиканын келечегине көз салуу
  7. Ачык булак аналитикасына убакыт келди — Аналитиканын эволюциясы жана Open Source таасири
  8. dbtCloud менен үзгүлтүксүз интеграция жана автоматташтырылган куруу тести — DBT колдонуу менен CI куруунун принциптери
  9. DBT окуу куралы менен баштоо — Практика, Өз алдынча иштөө үчүн кадам-кадам көрсөтмөлөрү
  10. Jaffle дүкөнү — Github DBT окуу куралы — Github, билим берүү долбоорунун коду

Курс жөнүндө көбүрөөк билүү.

Source: www.habr.com

Комментарий кошуу