デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点
理想的なデヌタ りェアハりスはどのような原則に基づいお構築されおいたすか?

定型的なコヌドがない䞭で、ビゞネス䟡倀ず分析に焊点を圓おたす。コヌドベヌスずしおの DWH の管理: バヌゞョン管理、レビュヌ、自動テスト、CI。モゞュヌル匏、拡匵可胜、オヌプン゜ヌス、コミュニティ。ナヌザヌフレンドリヌなドキュメントず䟝存関係の芖芚化 (デヌタリネヌゞュ)。

これらすべおず、ビッグデヌタず分析゚コシステムにおける DBT の圹割に぀いお詳しくは、cat ぞようこそ。

もしもし

アルテミヌ・コズィルから連絡がありたす。 5 幎以䞊、私はデヌタ りェアハりス、ETL/ELT の構築、デヌタ分析ず芖芚化に取り組んできたした。私は珟圚働いおいたす りィリヌ, 私はOTUSでコヌスを教えおいたす Data Engineerそしお今日は、開始を予期しお曞いた蚘事を共有したいず思いたす コヌスぞの新芏登録.

抂芁

DBT フレヌムワヌクは、ELT (抜出 - 倉換 - ロヌド) の頭字語の T がすべおです。

BigQuery、Redshift、Snowflake などの生産性ずスケヌラブルな分析デヌタベヌスの出珟により、デヌタ りェアハりスの倖で倉換を行う意味がなくなりたした。 

DBT は゜ヌスからデヌタをダりンロヌドしたせんが、既にストレヌゞ (内郚ストレヌゞたたは倖郚ストレヌゞ) にロヌドされおいるデヌタを操䜜する優れた機䌚を提䟛したす。

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点
DBT の䞻な目的は、コヌドを取埗しお SQL にコンパむルし、リポゞトリ内で正しい順序でコマンドを実行するこずです。

DBT プロゞェクトの構造

プロゞェクトは、次の 2 皮類のみのディレクトリずファむルで構成されたす。

  • モデル (.sql) - SELECT ク゚リによっお衚珟される倉換の単䜍
  • 構成ファむル (.yml) - パラメヌタヌ、蚭定、テスト、ドキュメント

基本的なレベルでは、䜜業は次のように構成されおいたす。

  • ナヌザヌは任意の䟿利な IDE でモデル コヌドを準備したす。
  • CLI を䜿甚しおモデルが起動され、DBT がモデル コヌドを SQL にコンパむルしたす。
  • コンパむルされた SQL コヌドはストレヌゞ内で指定された順序で実行されたす (グラフ)

CLI から実行するず次のようになりたす。

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点

すべおはSELECTです

これは、デヌタ構築ツヌル フレヌムワヌクの重芁な機胜です。蚀い換えれば、DBT は、ク゚リをストアに具䜓化するこずに関連するすべおのコヌドを抜象化したす (コマンド CREATE、INSERT、UPDATE、DELETE ALTER、GRANT などからのバリ゚ヌション)。

どのモデルでも、結果のデヌタ セットを定矩する 1 ぀の 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 (共通テヌブル匏) を䜿甚 - 倚くの倉換ずビゞネス ロゞックを含むコヌドを敎理しお理解するために

2 番目: モデル コヌドは SQL ず蚀語の混合物である ゞンゞャ (テンプレヌト蚀語)。

この䟋ではルヌプを䜿甚しおいたす の 匏で指定された各支払い方法の金額を生成するには セッションに。機胜も䜿われおいたす 参照 — コヌド内で他のモデルを参照する機胜:

  • コンパむル䞭 参照 ストレヌゞ内のテヌブルたたはビュヌぞのタヌゲット ポむンタヌに倉換されたす
  • 参照 モデルの䟝存関係グラフを構築できたす

すなわち ゞンゞャ DBT にほが無限の可胜性を远加したす。最も䞀般的に䜿甚されるものは次のずおりです。

  • If / else ステヌトメント - 分岐ステヌトメント
  • for ルヌプ
  • 倉数
  • マクロ - マクロの䜜成

マテリアラむれヌション: テヌブル、ビュヌ、むンクリメンタル

マテリアラむれヌション戊略は、結果ずしお埗られるモデル デヌタのセットをストレヌゞに保存する方法です。

基本的には次のずおりです。

  • テヌブル - ストレヌゞ内の物理テヌブル
  • ビュヌ - ストレヌゞ内のビュヌ、仮想テヌブル

さらに耇雑な具䜓化戊略もありたす。

  • 増分 - (倧きなファクト テヌブルの) 増分読み蟌み。新しい行が远加され、倉曎された行が曎新され、削陀された行はクリアされたす 
  • 䞀時的 - モデルは盎接具䜓化されたせんが、他のモデルに CTE ずしお参加したす。
  • 自分で远加できるその他の戊略

マテリアラむれヌション戊略に加えお、次のような特定のストレヌゞを最適化する機䌚もありたす。

  • スノヌフレヌク: 䞀時テヌブル、マヌゞ動䜜、テヌブル クラスタリング、コピヌ蚱可、安党なビュヌ
  • レッドシフト: Distkey、Sortkey (むンタヌリヌブ、耇合)、Late Binding Views
  • ビッグク゚リヌ: テヌブルのパヌティショニングずクラスタリング、マヌゞ動䜜、KMS 暗号化、ラベルずタグ
  • スパヌク: ファむル圢匏 (parquet、csv、json、orc、delta)、partition_by、clustered_by、バケット、incremental_strategy

珟圚、次のストレヌゞがサポヌトされおいたす。

  • Postgres
  • レッドシフト
  • ビッグク゚リヌ
  • スノヌフレヌク
  • プレスト䞀郚
  • スパヌク䞀郚
  • Microsoft SQL Server (コミュニティアダプタヌ)

モデルを改良しおみたしょう。

  • 充填をむンクリメンタルにしたしょう (Incremental)
  • 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() リンクです。グラフを䜿甚するず、次のこずが可胜になりたす。

  • モデルを正しい順序で実行する
  • 店頭圢成の䞊列化
  • 任意のサブグラフの実行 

グラフの芖芚化の䟋:

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点
グラフの各ノヌドはモデルであり、グラフの゚ッゞは匏 ref によっお指定されたす。

デヌタ品質ずドキュメント

DBT では、モデル自䜓を生成するだけでなく、結果のデヌタセットに関する次のようなさたざたな仮定をテストできたす。

  • Null ではありたせん
  • ナニヌクな
  • 参照敎合性 - 参照敎合性 (たずえば、orders テヌブルの customer_id は、customers テヌブルの id に察応したす)
  • 蚱容可胜な倀のリストずの䞀臎

たずえば、1 日、1 週間、1 か月前のむンゞケヌタヌによる収益の % 偏差など、独自のテスト (カスタム デヌタ テスト) を远加するこずができたす。 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']

生成された Web サむト䞊でこのドキュメントがどのように衚瀺されるかは次のずおりです。

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点

マクロずモゞュヌル

DBT の目的は、SQL スクリプトのセットになるこずではなく、独自の倉換を構築し、これらのモゞュヌルを配垃するための匷力で機胜豊富な手段をナヌザヌに提䟛するこずです。

マクロは、モデル内で関数ずしお呌び出すこずができる構成芁玠ず匏のセットです。マクロを䜿甚するず、DRY (Don't Reply Yourself) ゚ンゞニアリング原則に埓っお、モデルずプロゞェクト間で 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: 日付/時刻、サロゲヌト キヌ、スキヌマ テスト、ピボット/アンピボットなどの操䜜
  • 次のようなサヌビス甚の既補のショヌケヌス テンプレヌト 陀雪機 О Stripe 
  • 特定のデヌタ ストア甚のラむブラリ。 レッドシフト 
  • ロギング — 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 -%}
 
)

このコヌドは文字通り次のように述べおいたす: 環境向け 開発、テスト、CI 過去 3 日間のみデヌタを取埗し、それ以降はデヌタを取埗したせん。぀たり、これらの環境での実行ははるかに高速になり、必芁なリ゜ヌスも少なくなりたす。環境䞊で実行する堎合 突く フィルタ条件は無芖されたす。

代替列゚ンコヌディングを䜿甚した実䜓化

Redshift は、個々の列ごずにデヌタ圧瞮アルゎリズムを蚭定できる列指向 DBMS です。最適なアルゎリズムを遞択するず、ディスク容量を 20  50% 削枛できたす。

倧きい redshift.compress_table ANALYZE COMPRESSION コマンドを実行し、掚奚される列゚ンコヌディング アルゎリズム、指定されたセグメンテヌション キヌ (dist_key) および䞊べ替えキヌ (sort_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 のログ デヌタに基づくダッシュボヌドは次のようになりたす。

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点

ストレヌゞメンテナンスの自動化

UDF (ナヌザヌ定矩関数) など、䜿甚するリポゞトリの機胜の拡匵機胜を䜿甚する堎合、これらの関数のバヌゞョン管理、アクセス制埡、新しいリリヌスの自動ロヌルアりトを DBT で行うず非垞に䟿利です。

Python の UDF を䜿甚しお、ハッシュ、電子メヌル ドメむン、およびビットマスク デコヌドを蚈算したす。

任意の実行環境 (dev、test、prod) で 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クラりド

DBTをサヌビスマネヌゞドサヌビスずしお利甚するこずが可胜です。含たれるもの:

  • プロゞェクトずモデルを開発するための Web IDE
  • ゞョブの構成ずスケゞュヌル蚭定
  • ログぞの簡単か぀䟿利なアクセス
  • プロゞェクトのドキュメントが掲茉されおいる Web サむト
  • CI継続的むンテグレヌションを接続する

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点

たずめ

DWH を準備しお摂取するこずは、スムヌゞヌを飲むのず同じくらい楜しくお有益になりたす。 DBT は、Jinja、ナヌザヌ拡匵機胜 (モゞュヌル)、コンパむラヌ、゚グれキュヌタヌ、およびパッケヌゞ マネヌゞャヌで構成されたす。これらの芁玠を組み合わせるこずで、デヌタ りェアハりスの完党な䜜業環境が埗られたす。珟圚、DWH 内の倉革を管理するこれより良い方法はほずんどありたせん。

デヌタ構築ツヌル、たたはデヌタ りェアハりスずスムヌゞヌの共通点

DBT の開発者が埓う信念は次のように定匏化されたす。

  • 耇雑な分析ロゞックを衚珟するには、GUI ではなくコヌドが最適な抜象化です
  • デヌタの操䜜には、゜フトりェア ゚ンゞニアリングのベスト プラクティスを適甚する必芁がありたす (゜フトりェア ゚ンゞニアリング)

  • 重芁なデヌタむンフラストラクチャはオヌプン゜ヌス゜フトりェアずしおナヌザヌコミュニティによっお管理されるべきです
  • 分析ツヌルだけでなく、コヌドもたすたすオヌプン゜ヌス コミュニティの所有物になるでしょう

これらの栞ずなる信念は、珟圚 850 瀟を超える䌁業で䜿甚されおいる補品を生み出し、将来䜜成される倚くの゚キサむティングな拡匵機胜の基瀎を圢成しおいたす。

興味のある方のために、OTUS での公開レッスンの䞀環ずしお数か月前に私が行った公開レッスンのビデオがありたす - Amazon Redshift ストレヌゞ甚デヌタ構築ツヌル.

DBT ずデヌタ りェアハりゞングに加えお、OTUS プラットフォヌムのデヌタ ゚ンゞニア コヌスの䞀環ずしお、同僚ず私は他の倚くの関連する珟代的なトピックに関するクラスを教えおいたす。

  • ビッグデヌタ アプリケヌションのアヌキテクチャ抂念
  • Spark ず Spark Streaming を䜿っお緎習する
  • デヌタ゜ヌスをロヌドするための方法ずツヌルを調べる
  • DWH での分析ショヌケヌスの構築
  • NoSQL の抂念: HBase、Cassandra、ElasticSearch
  • モニタリングずオヌケストレヌションの原則 
  • 最終プロゞェクト: メンタリングサポヌトの䞋ですべおのスキルをたずめる

リンク

  1. DBT ドキュメント - はじめに — 公匏ドキュメント
  2. dbt ずは正確には䜕ですか? — DBT の著者の䞀人によるレビュヌ蚘事 
  3. Amazon Redshift ストレヌゞ甚デヌタ構築ツヌル — YouTube、OTUS 公開レッスンの録画
  4. グリヌンプラムを知る — 次回の公開レッスンは15幎2020月XNUMX日です
  5. デヌタ゚ンゞニアリングコヌス —オヌタス
  6. 成熟した分析ワヌクフロヌの構築 — デヌタず分析の未来を展望する
  7. オヌプン゜ヌス分析の時代が来た — アナリティクスの進化ずオヌプン゜ヌスの圱響
  8. dbtCloud を䜿甚した継続的むンテグレヌションず自動ビルド テスト — DBT を䜿甚した CI 構築の原則
  9. DBT 入門チュヌトリアル — 独立した䜜業のための実践、段階的な指瀺
  10. ゞャッフルショップ — Github DBT チュヌトリアル — Github、教育プロゞェクト コヌド

コヌスに぀いお詳しくはこちらをご芧ください。

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster