ProHoster > Blog > Administrasi > Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie
Alat Ngawangun Data atanapi naon anu umum antara Gudang Data sareng Smoothie
Dina prinsip naon anu idéal Data Warehouse diwangun?
Fokus kana nilai bisnis sareng analitik dina henteuna kode boilerplate. Ngatur DWH salaku codebase a: versioning, review, nguji otomatis tur CI. Modular, extensible, open source sareng komunitas. Dokuméntasi anu ramah-pamaké sareng visualisasi kagumantungan (Data Lineage).
Langkung seueur ngeunaan sadayana ieu sareng ngeunaan peran DBT dina ékosistem Big Data & Analytics - wilujeng sumping ka ucing.
Sampurasun sadayana
Artemy Kozyr ngahubungi. Pikeun leuwih ti 5 taun kuring geus gawé bareng gudang data, ngawangun ETL / ELT, kitu ogé analytics data jeung visualisasi. Abdi ayeuna damel di kabayang, Kuring ngajar di OTUS dina kursus Insinyur Data, sarta dinten abdi hoyong babagi sareng anjeun hiji artikel nu kuring wrote di antisipasi mimiti enrollment anyar pikeun kursus.
Ulasan pondok
Kerangka DBT sadayana ngeunaan T dina akronim ELT (Extract - Transform - Load).
Kalayan munculna basis data analitik anu produktif sareng skalabel sapertos BigQuery, Redshift, Snowflake, teu aya gunana pikeun ngalakukeun transformasi di luar Gudang Data.
DBT teu ngundeur data tina sumber, tapi nyadiakeun kasempetan gede pikeun gawé bareng data nu geus dimuat kana Panyimpenan (dina Panyimpenan internal atanapi éksternal).
Tujuan utama DBT nyaéta nyandak kode, nyusun kana SQL, ngalaksanakeun paréntah dina urutan anu leres dina Repository.
Struktur Proyék DBT
Proyék diwangun ku diréktori sareng file ngan ukur 2 jinis:
Modél (.sql) - unit transformasi dinyatakeun ku query SELECT
Pamaké prepares kode modél dina sagala IDE merenah
Ngagunakeun CLI, model dibuka, DBT compiles kodeu modél kana SQL
Kodeu SQL anu disusun dieksekusi dina Panyimpenan dina sekuen anu dipasihkeun (grafik)
Ieu naon anu ngajalankeun tina CLI sigana sapertos:
Sagalana geus PILIH
Ieu mangrupikeun fitur pembunuh kerangka Data Build Tool. Dina basa sejen, DBT abstrak sakabeh kode pakait sareng materializing queries anjeun ka Toko (variasi tina paréntah CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, ...).
Sakur modél ngalibatkeun nulis hiji pamundut PILIH anu nangtukeun set data anu dihasilkeun.
Dina hal ieu, logika transformasi tiasa multi-level sareng ngahijikeun data tina sababaraha model anu sanés. Conto modél anu bakal ngawangun showcase pesenan (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
Naon hal metot bisa urang tingali di dieu?
Kahiji: CTE (Ekspresi Méja Umum) - pikeun ngatur sareng ngartos kode anu ngandung seueur transformasi sareng logika bisnis
Kadua: Kode modél mangrupikeun campuran SQL sareng basa Jinja (basa citakan).
Contona ngagunakeun loop a keur pikeun ngahasilkeun jumlah pikeun tiap padika pembayaran dieusian dina ekspresi ngatur. Fungsina ogé dianggo ref - kamampuan pikeun ngarujuk modél sanés dina kode:
Salila kompilasi ref bakal dirobah jadi target pointer kana tabel atawa view dina Panyimpenan
ref ngidinan Anjeun pikeun ngawangun grafik kagumantungan model
nyaéta Jinja nambihan kamungkinan ampir taya ka DBT. Anu paling sering dianggo nyaéta:
Lamun / sejenna pernyataan - pernyataan cabang
Pikeun loop
Variabel
Makro - nyiptakeun makro
Materialization: Méja, Témbongkeun, Incremental
Strategi materialisasi mangrupikeun pendekatan anu dumasar kana set data modél anu hasilna bakal disimpen dina Panyimpenan.
Dina istilah dasar nyaéta:
Méja - tabel fisik dina Panyimpenan
Témbongkeun - view, tabel maya di Panyimpenan
Aya ogé strategi materialisasi anu langkung kompleks:
Incremental - incremental loading (tina tabel kanyataan badag); garis anyar ditambahkeun, garis robah diropéa, garis dihapus diberesihan
Ephemeral - model teu materialize langsung, tapi ilubiung salaku CTE dina model sejen
Sakur strategi séjén anjeun tiasa nambihan diri
Salian strategi materialisasi, aya kasempetan pikeun optimasi pikeun Panyimpenan khusus, contona:
Hayu urang tambahkeun segmentasi sareng asihan konci pikeun 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
Grafik kagumantungan modél
Éta ogé tangkal kagumantungan. Éta ogé katelah DAG (Directed Acyclic Graph).
DBT ngawangun grafik dumasar kana konfigurasi sadaya model proyék, atawa rada, ref () Tumbu dina model ka model sejen. Gaduh grafik ngamungkinkeun anjeun pikeun ngalakukeun hal-hal ieu:
Ngajalankeun model dina runtuyan bener
Parallelization formasi storefront
Ngajalankeun subgraph wenang
Conto visualisasi grafik:
Unggal titik tina grafik mangrupa modél; edges of grafik dieusian ku ref ekspresi.
Kualitas Data sareng Dokuméntasi
Salian ngahasilkeun modél sorangan, DBT ngamungkinkeun anjeun pikeun nguji sababaraha asumsi ngeunaan set data anu dihasilkeun, sapertos:
Henteu Null
Unik
Integritas Rujukan - integritas rujukan (contona, customer_id dina tabel pesenan pakait sareng id dina tabel konsumén)
Cocog jeung daptar nilai ditarima
Kasebut nyaéta dimungkinkeun pikeun nambahkeun tés sorangan (tés data custom), kayaning, contona, % simpangan panghasilan jeung indikator ti sapoé, saminggu, sabulan katukang. Sakur asumsi anu dirumuskeun salaku pamundut SQL tiasa janten tés.
Ku cara kieu, anjeun tiasa nyekel panyimpangan sareng kasalahan anu teu dihoyongkeun dina data dina jandela Gudang.
Dina hal dokuméntasi, DBT nyadiakeun mékanisme pikeun nambahkeun, versioning, sarta ngadistribusikaeun metadata sarta komentar di model na malah tingkat atribut.
Ieu kumaha nambihan tés sareng dokuméntasi sapertos dina tingkat file konfigurasi:
- 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']
Sareng ieu mangrupikeun dokuméntasi ieu dina halaman wéb anu dihasilkeun:
Macro jeung modul
Tujuan DBT teu jadi loba pikeun jadi susunan Aksara SQL, tapi nyadiakeun pamaké kalawan hartosna kuat sarta fitur-euyeub pikeun ngawangun transformasi sorangan jeung ngadistribusikaeun modul ieu.
Macros mangrupikeun set konstruk sareng ekspresi anu tiasa disebat salaku fungsi dina modél. Macros ngamungkinkeun anjeun ngagunakeun deui SQL antara modél sareng proyék saluyu sareng prinsip rékayasa DRY (Ulah Ulang Diri).
conto makro:
{% 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 %}
Jeung pamakéanana:
{% set column_name = 'product' %}
select
product,
{{ rename_category(column_name) }} -- вызов макроса
from my_table
DBT hadir sareng manajer pakét anu ngamungkinkeun para pangguna nyebarkeun sareng nganggo deui modul sareng makro individu.
Ieu hartosna tiasa ngamuat sareng nganggo perpustakaan sapertos:
dbt_utils: damel sareng Tanggal / Waktos, Kunci Ganti, tés Skéma, Pivot / Unpivot sareng anu sanésna
Daptar lengkep bungkusan tiasa dipendakan di dbt hub.
Malah leuwih fitur
Di dieu kuring bakal ngajelaskeun sababaraha fitur anu pikaresepeun sareng palaksanaan anu kuring sareng tim dianggo pikeun ngawangun Gudang Data kabayang.
Pamisahan lingkungan runtime DEV - TEST - PROD
Malah dina klaster DWH sarua (dina schemes béda). Contona, ngagunakeun éksprési handap:
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 -%}
)
Kode ieu sacara harfiah nyebutkeun: pikeun lingkungan dev, uji, ci nyandak data ngan pikeun 3 poé panungtungan sarta euweuh deui. Hartina, ngajalankeun di lingkungan ieu bakal leuwih gancang sarta merlukeun leuwih saeutik sumberdaya. Nalika ngajalankeun on lingkungan produksi kaayaan filter bakal dipaliré.
Materialization kalawan encoding kolom alternatif
Redshift mangrupakeun DBMS columnar nu ngidinan Anjeun pikeun nyetel algoritma komprési data pikeun tiap kolom individu. Milih algoritma optimal bisa ngurangan spasi disk ku 20-50%.
Makro redshift.compress_table bakal ngaéksekusi paréntah ANALYZE COMPRESSION, jieun tabel anyar sareng algoritma panyandian kolom anu disarankeun, konci segmentasi anu ditangtukeun (dist_key) sareng konci asihan (sort_key), mindahkeun data ka dinya, sareng, upami perlu, ngahapus salinan anu lami.
Anjeun tiasa ngagantelkeun kait ka unggal palaksanaan modél, anu bakal dieksekusi sateuacan diluncurkeun atanapi langsung saatos nyiptakeun modél réngsé:
Modul logging bakal ngidinan Anjeun pikeun ngarekam sakabeh metadata diperlukeun dina tabel misah, nu salajengna bisa dipaké pikeun Inok jeung nganalisis bottlenecks.
Ieu mangrupikeun dasbor dumasar kana data logging di Looker:
Automation of Pangropéa Panyimpenan
Upami anjeun nganggo sababaraha ekstensi tina fungsionalitas Repository anu dianggo, sapertos UDF (Fungsi Ditetepkeun Pamaké), maka vérsi pungsi ieu, kontrol aksés, sareng gulung otomatis kaluar tina sékrési énggal pisan gampang dilakukeun dina DBT.
Kami nganggo UDF dina Python pikeun ngitung hashes, domain email, sareng decoding bitmask.
Conto makro anu nyiptakeun UDF dina lingkungan palaksanaan naon waé (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 %}
Di Wheely kami nganggo Amazon Redshift, anu dumasar kana PostgreSQL. Pikeun Redshift, penting pikeun rutin ngumpulkeun statistik dina tabel sareng ngosongkeun rohangan disk - masing-masing paréntah ANALYZE sareng VACUUM.
Jang ngalampahkeun ieu, paréntah ti makro redshift_maintenance dieksekusi unggal wengi:
{% 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 Awan
Kasebut nyaéta dimungkinkeun pikeun ngagunakeun DBT salaku jasa (Jurusan Service). Kaasup:
IDE wéb pikeun ngembangkeun proyék sareng modél
Konfigurasi pakasaban sarta scheduling
aksés basajan tur merenah pikeun log
Situs wéb sareng dokuméntasi proyék anjeun
Nyambungkeun CI (Continuous Integration)
kacindekan
Nyiapkeun sareng ngonsumsi DWH janten nikmat sareng mangpaat sapertos nginum smoothie. DBT diwangun ku Jinja, ekstensi pamaké (modul), kompiler, pelaksana, jeung manajer pakét. Ku ngahijikeun unsur-unsur ieu anjeun kéngingkeun lingkungan kerja anu lengkep pikeun Gudang Data anjeun. Henteu aya cara anu langkung saé pikeun ngatur transformasi dina DWH ayeuna.
Kapercayaan anu dituturkeun ku pamekar DBT dirumuskeun kieu:
Kode, sanes GUI, mangrupikeun abstraksi anu pangsaéna pikeun ngémutan logika analitik anu kompleks
Gawe sareng data kedah adaptasi prakték pangsaéna dina rékayasa parangkat lunak (Software Engineering)
Infrastruktur data kritis kudu dikawasa ku komunitas pamaké salaku software open source
Henteu ngan ukur alat analitik, tapi ogé kode bakal beuki janten milik komunitas Open Source
Kapercayaan inti ieu ngahasilkeun produk anu dianggo ku langkung ti 850 perusahaan ayeuna, sareng aranjeunna janten dasar seueur ekstensi anu pikaresepeun anu bakal didamel di hareup.
Salian DBT sareng Data Warehousing, salaku bagian tina kursus Data Insinyur dina platform OTUS, kuring sareng kolega kuring ngajar kelas dina sababaraha topik anu relevan sareng modern:
Konsep Arsitéktur pikeun Aplikasi Big Data
Latihan sareng Spark sareng Spark Streaming
Ngajalajah metode sareng alat pikeun ngamuat sumber data
Ngawangun showcases analitik di DWH
Konsep NoSQL: HBase, Cassandra, ElasticSearch
Prinsip ngawaskeun sareng orkestrasi
Proyék Akhir: ngahijikeun sadaya kaahlian dina dukungan bimbingan