2
0

dbtを試してみた

Last updated at Posted at 2023-07-17

背景・目的

クラウドデータ基盤のELTツールのdbtについて、特徴の整理と簡単な動作を確認してみます。

まとめ

  • dbtは、SQLファーストのELTをツールです。
  • dbtのアカウントは、下記の3種類あります。
    • Developer
    • Team
    • Enterprise

概要

The analytics engineering workflow

dbt を使用すると、データ チームはウェアハウス内で直接作業して、レポート、ML モデリング、運用ワークフロー用の信頼できるデータセットを生成します。

What is dbt?

dbt は、モジュール性、移植性、CI/CD、ドキュメントなどのソフトウェア エンジニアリングのベスト プラクティスに従って、チームが分析コードを迅速かつ共同で展開できるようにする SQL ファーストの変換ワークフローです。

How dbt works

Version Control and CI/CD

開発環境を使用して安全にデプロイする。
Git 対応のバージョン管理により、コラボレーションと以前の状態への復帰が可能。

Test and Document

運用前にすべてのモデルをテストし、動的に生成されたドキュメントをすべてのデータ関係者と共有する。

Develop

モジュール形式のデータ変換を .sql または .py ファイルに書き込む。
依存関係管理の面倒な作業は dbt が処理する。

The new standard for data transformation

Develop faster

定型的な DDL/DML を、依存関係を推論し、テーブルとビューを構築し、モデルを順番に実行する単純な SQL SELECT ステートメントに置き換える。
Cloud IDE でマクロ、ref ステートメント、オートコンプリート コマンドを使用してコード自体を記述するコードを開発する。
Python パッケージを利用して、複雑な分析を高速化する。

Work from the same assumptions

自動生成された依存関係グラフと動的データ ディクショナリは、データ利用者の信頼と透明性を促進する。

Deploy with confidence

アプリ内スケジュール、ログ記録、アラート機能を使用して、変換ワークフローに可観測性を組み込む。ブランチ上の保護ポリシーにより、CI の実行ごとに生成される開発、ステージ、本番環境などの管理されたプロセスを通じてデータが確実に移動される。

Eliminate silos

データ サイエンス チームは、分析チームが構築したモデルと接続するモデルを、それぞれが好みの言語を使用して構築できるようになった。dbt は SQL または Python でのモデリングをサポートしており、分析コードを扱う全員が共有ワークスペースを利用できるようする。

Security

SOC-2 準拠、CI/CD 導入、RBAC、ELT アーキテクチャによりリスクを管理する。

Governance

バージョン管理、テスト、ロギング、アラートによりデータの疑いを排除する。スナップショットは時間の経過とともに変化し、ホストされているドキュメントへのオープン アクセスを提供する。

実践

Quickstart for dbt Cloud and Redshiftを参考に試します。

【dbt】 dbtアカウントの作成

まずは、dbtアカウントを作成します。

  1. Start using dbt nowのページから、FreeのDeveloperでSign upします。
    image.png

  2. 下記を入力し、「Create my account」をクリックします。

    • Email
    • First nameとLast name
    • Company
    • Password
    • How did you hear about dbt?
    • I agree to the Terms of Useをチェック
      image.png
  3. メールが送られてくるので、「Verify email address」をクリックします。
    image.png

  4. 画面が表示されます。ここでは、「I don't have a data warehouse」を選択します。
    image.png

  5. 画面が表示されました。
    image.png

Developer Planを選択

DeveloperでSign upしてもデフォルトでは、TeamのPlanになるようです。

  1. 画面右上の歯車→Account Settingsをクリックします。
    image.png

  2. ナビゲーションペインで「Billing」をクリックします。
    image.png

  3. なんと、Teamで登録されています。このままでは、課金されるので、「Developer」に切り替えます。(Developerを選択します。)
    image.png

  4. 「Developer」で「Select Plan」をクリックします。
    image.png

  5. ポップアップが表示されるので、「Switch to Developer」をクリックします。
    image.png

  6. Developerで「Currently Enrolled」になり、Teamが「Select Plan」になりました。
    image.png

【AWS】Redshift環境を作成する。

こちらのCloudFormationを実行して環境を作成します。

CloudFormationを実行

  1. dbtのCloundFormationには、RedshiftのCredentialがベタ書きされているので、変更したものをアップロードします。
    image.png

  2. 何も変更せずに、「次へ」をクリックします。
    image.png

  3. 最後に、「送信」をクリックします。
    image.png

  4. 5分程度で作成完了しました。
    image.png

【dbt】 dbtクラウドからRedshiftに接続

dbtクラウドでからRedshiftに接続します。

  1. Choose a connectionで「Redshift」を選択し、「Next」をクリックします。
    image.png

  2. 下記を入力し、「Test Connection」をクリックします。

    • Settings
      • Hostname:Redshiftのエンドポイント
      • Port:Redshiftのポート
      • Database:Redshiftのデータベース
    • Development Credentials
      • Username:Redshiftで作成したUser名
      • Password:Redshiftで作成したパスワード
      • Schema:dbtで作成したデフォルト
      • Target Name: default
      • Thread: 4
        image.png
        image.png
  3. COMPLETEになりました。
    image.png

【AWS】データの準備

S3にデータをアップロード

Redshift で使用するファイルをアップロードします。CloudFormationで作成されたS3バケットにファイルアップロードをします。

  1. 下記のファイルをダウンロードします。(このファイルは、dbtチュートリアルページから取得できます。)

  2. S3バケットで「アップロードを」クリックします。
    image.png

  3. ファイルを指定して「アップロード」をクリックします。
    image.png

Redshift でオブジェクトを作成

  1. Redshiftクラスタで「クエリデータ>クエリエディタv2でクエリ」をクリックします。
    image.png

  2. 下記を入力し、「Create Connection」をクリックします。

    • Database user name and password
      • User name
      • Password
        image.png
  3. 下記のSQLを実行し、スキーマを作成します。

    create schema if not exists jaffle_shop;
    create schema if not exists stripe;
    
  4. 下記のSQLを実行し、テーブルを作成します。

    create table jaffle_shop.customers(
        id integer,
        first_name varchar(50),
        last_name varchar(50)
    );
    
    create table jaffle_shop.orders(
        id integer,
        user_id integer,
        order_date date,
        status varchar(50),
        _etl_loaded_at timestamp default current_timestamp
    );
    
    create table stripe.payment(
        id integer,
        orderid integer,
        paymentmethod varchar(50),
        status varchar(50),
        amount integer,
        created date,
        _batched_at timestamp default current_timestamp
    );
    
    

S3のデータをRedshiftにロード(コピー)

  1. 下記のSQLを実行し、Redshiftのテーブルにコピーします。

    copy jaffle_shop.customers( id, first_name, last_name)
    from 's3://dbt-data-lake-xxxx/jaffle_shop_customers.csv'
    iam_role 'arn:aws:iam::XXXXXXXXXX:role/RoleName'
    region 'ap-northeast-1'
    delimiter ','
    ignoreheader 1
    acceptinvchars;
       
    copy jaffle_shop.orders(id, user_id, order_date, status)
    from 's3://dbt-data-lake-xxxx/jaffle_shop_orders.csv'
    iam_role 'arn:aws:iam::XXXXXXXXXX:role/RoleName'
    region 'ap-northeast-1'
    delimiter ','
    ignoreheader 1
    acceptinvchars;
    
    copy stripe.payment(id, orderid, paymentmethod, status, amount, created)
    from 's3://dbt-data-lake-xxxx/stripe_payments.csv'
    iam_role 'arn:aws:iam::XXXXXXXXXX:role/RoleName'
    region 'ap-northeast-1'
    delimiter ','
    ignoreheader 1
    Acceptinvchars;
    
  2. 下記のSQLを実行し、データを確認します。登録されています。

    select * from jaffle_shop.customers;
    select * from jaffle_shop.orders;
    select * from stripe.payment;
    

    image.png
    image.png
    image.png

【dbt】セットアップと疎通

リポジトリをセットアップ

dbt cloudでは、リポジトリを利用してコードをバージョン管理できます。

  1. 「Managed」を選択し、「Create」をクリックします。
    image.png

  2. 作成されました。
    image.png

dbtプロジェクトの初期化

dbtリポジトリを初期化し、ファイルを追加します。

  1. 「Start developing in the IDE」をクリックします。
    image.png

  2. 「initialize dbt project」をクリックします。

  3. 作成されました。
    image.png

  4. 「Commit and sync」をクリックします。
    image.png

  5. メッセージを入力し、「Commit Changes」をクリックします。
    image.png

  6. 「Create File」をクリックします。
    image.png

  7. ファイル名を入力し、「Create」をクリックします。
    image.png

  8. 下記のコードを入力し、「Save As」をクリックします。

    select * from jaffle_shop.customers
    
  9. Enterで実行します。Redshiftに登録したデータが参照できました。
    image.png

考察

今回は、dbtでアカウントを作成し、dbtからRedshiftへの接続を試してみました。次回以降は、複数のELTを作成しワークフローを構成してみたいと思います。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0