概要
dbt はデータモデリングツールとして、データの変換を行うことができますが、同時にメタデータの管理も可能です。例えば、プロパティや設定を利用したビジネスメタデータ、モデルの生成に利用されるSQLなどのテクニカルメタデータ、あるいは dbtコマンドの実行に関するオペレーショナルメタデータなどがあります。
今回COMETAにdbtメタデータ連携機能が追加され、model、source、snapshot、seed リソースの一部メタデータをCOMETA上のアセット1に関連付けできるようになりましたので、その設定と機能について紹介します。
dbt プロジェクトの準備
今回は、dbt のサンプルプロジェクトである jaffle-shop を用いて COMETA でのメタデータ連携を試してみます。
環境セットアップ
jaffle-shop プロジェクトをクローンします。
git clone git@github.com:dbt-labs/jaffle-shop.git
dbt Cloud では profiles.yml
ファイルが含まれていないため、使用するアダプターに応じて適宜設定します。今回は BigQuery 環境用の設定を追加し、適切な接続情報を記述します。
default:
target: dev
outputs:
dev:
type: bigquery
method: service-account
project: {your_project}
dataset: test_jaffle_shop
keyfile: {path/to/key/file.json}
location: {your_location}
seed データの設定とプロジェクト調整
jaffle-data ディレクトリのデータを参照できるように、dbt_project.yml
に seed-paths の設定を追加します。
seed-paths: ["seeds", "jaffle-data"]
また、データセット名をカスタマイズするため、schema: raw
の部分を test_jaffle_shop_raw
に置き換えます。
sources:
- name: ecom
- schema: raw
+ schema: test_jaffle_shop_raw
description: E-commerce data for the Jaffle Shop
- {# seeds go in a global `raw` schema #}
+ {# seeds go in a global `test_jaffle_shop_raw` schema #}
次に、Python の仮想環境を作成し、dbt での依存関係をインストールします。
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
python3 -m pip install dbt-core dbt-bigquery
dbt コマンドの実行
以下のコマンドを使用して、依存パッケージをインストールし、BigQuery にテーブルを作成します。
dbt deps
dbt seed
dbt run
dbt build
は run
、test
、snapshot
、seed
の各コマンドをまとめて実行します。 次に、dbt のドキュメント生成コマンドを使用してメタデータを作成します。
dbt docs generate
これで、catalog.json
と manifest.json
が生成され、COMETA でメタデータとして利用する準備が整いました。
COMETA への dbt メタデータの連携設定
現状成果物の置き場所として S3 をサポートしています。生成された catalog.json
と manifest.json
を任意の S3 バケットに配置し、そのバケットに対するアクセス権限を持つ IAM ロールを用意します。COMETA での設定項目は以下の通りです。
- IAM ロール ARN
- 外部 ID
- バケット名
- パスプレフィックス
上記の情報を入力し、連携を保存することでメタデータの連携が完了します。
連携ジョブの実行
連携設定画面右上のジョブ実行ボタンを押すことで dbt のメタデータファイルの読み込みが行われます。
現状のジョブキック手段としては以下をサポートしています。
- 日時バッチのデータストア連携ジョブの後に実行
- UIからの手動実行
COMETA でのメタデータ管理
dbt で YAML ファイルを使用してテーブルやカラムに関するメタデータを設定している場合、その情報が COMETA のアセット詳細画面上で確認可能になります。COMETA は model、source、snapshot、seed といった dbtリソースに紐づくメタデータの可視化に対応しています。
モデル stg_products の確認
今回は stg_products を例にしてみます。stg_products はステージング層のデータとして定義され、生データから加工して扱いやすいようにしているモデルです。models/staging/stg_products.sql
に以下のようなモデルが定義されています。
with
source as (
select * from {{ source('ecom', 'raw_products') }}
),
renamed as (
select
sku as product_id,
name as product_name,
type as product_type,
description as product_description,
{{ cents_to_dollars('price') }} as product_price,
coalesce(type = 'jaffle', false) as is_food_item,
coalesce(type = 'beverage', false) as is_drink_item
from source
)
select * from renamed
また、モデルに対応する stg_products.yml
には以下のようなメタデータが記述されています。YAMLファイルを記述することでリソースにプロパティを定義することができます。詳しくはこちら
models:
- name: stg_products
description: Product (food and drink items that can be ordered) data with basic cleaning and transformation applied, one row per product.
columns:
- name: product_id
description: The unique key for each product.
data_tests:
- not_null
- unique
COMETA に連携することで以下のように stg_productsアセットにdbtのメタデータ情報が付与されます。
product_id カラムに関しても連携されていることを確認できます。
カラムリネージ機能
また、COMETA のカラムリネージ機能により、stg_productsアセットがどのように他のアセットで使用されているかを可視化できます。特に、アップストリームおよびダウンストリームのアセットを確認することで、各カラムの影響範囲を把握できます。実線で繋がれている場合はデータの参照のみをしており、点線で繋がれていれば参照と何かしらの加工が行われていることを示します。例えば、sku
や name
はリネームのみが行われている一方、product_price
や is_food_item
では何らかの変換処理が行われていることがわかります。
タグやメタ情報の連携
タグやメタ情報もCOMETA にインポートすることも可能です。デフォルトで用意されていたYAMLファイルを修正してタグやメタ情報を設定します。以下のように stg_supplies
モデルに deprecated タグと owner メタ情報を設定し再度メタデータ連携ジョブを実行します。
models:
- name: stg_supplies
config:
tags:
- deprecated
meta:
owner: dev-team
description: >
List of our supply expenses data with basic cleaning and transformation applied.
タグやメタの情報が取り込まれました。
まとめ
dbtで管理しているリソースの description, meta, tag, カラムリネージといったメタデータを COMETAのアセットに関連付けできるようになりました。
今後
今後もdbtを通して以下のような機能の拡充をしていきたいと思います。
- 連携対象となるプロパティや設定の拡充
- リレーションの自動生成
- リネージの拡大BIアセットなどのダウンストリームアセットやS3などのsourceとなるアップストリームアセットを表示する
- metaやタグをCOMETAの機能にバインドしてインポートする機能
-
COMETA上でカタログ管理する対象であるデータベース、スキーマ、テーブル、カラムなど https://documents.trocco.io/cometa/docs/table-information-v2 ↩