OSS版OpenMetadataでSnowflakeのメタデータ管理とデータ品質テストをしてみた

2024/05/10に公開

こんにちは。Acompany新卒のハルカです。
CEOに同姓の高橋さんがいるので、私はハルカさんと呼ばれています。

先日、OSS版のデータカタログであるOpenMetadataを使ってBigQueryのメタデータ管理を試してみました。今回は、BigQueryと同じくクラウドデータウェアハウスの1つとして有名なSnowflakeのメタデータをOpenmMetadataで管理してみます。

準備

OpenMetadataは、以前の記事を参考に準備してみてください。
https://zenn.dev/haruka0000/articles/240417_openmetadata-getstart

こちらの記事では、Dockerを使ってローカル環境でOpenMetadataを立ち上げており、今回も同様にDocker版を使います。

データソースの登録: Snowflake

OpenMetadataの準備が完了しましたら、次にSnowflakeのデータソースの登録に進みます。

Snowflake側の準備

まず、Snowflakeでの準備が必要です。Snowflakeのアカウントを持っていない場合は、公式サイトから無料トライアルを申し込んでください。

Snowflakeのアカウントを取得したら、以下の情報をメモしておきます。

  • Username
  • Account URL
    Account URL
    Acount URLの取得

また、アクセスに使用するアカウントロールをACCOUNTADMINIMPORTED PRIVILEGESにする必要があります。この権限がない場合はエラーが発生し、メタデータの取得ができません。

Sampleデータの準備

Snowflakeではサンプルデータが用意されているので、それを使います。
「プロジェクト」→「ワークシート」を選択し、以下のクエリを実行してサンプルデータを作成します。

-- Create a database from the share.
CREATE DATABASE SNOWFLAKE_SAMPLE_DATA FROM SHARE SFC_SAMPLES.SAMPLE_DATA;

-- Grant the PUBLIC role access to the database.
-- Optionally change the role name to restrict access to a subset of users.
GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE_SAMPLE_DATA TO ROLE PUBLIC;

https://docs.snowflake.com/ja/user-guide/sample-data-using

以下のように、データベースにサンプルデータが作成されていることを確認します。
Sample Data

OpenMetadata側の設定

ここから、OpenMetadata側での操作になります。
OpenMetadataのホーム画面から「Settings」→「Services」→「Databases」→「Add New Service」を選択します。

データベースの追加は次の3つのステップで行います。

  1. Serviceの選択
    Database ServicesからSnowflakeを選択して次へ進みます。
    Add New Service
    データソースの選択

  2. サービス情報の設定
    Configure Serviceで、「Service Name」と「Description」を入力して次へ進みます。

  3. 認証情報を入力
    メモして置いた情報を使って、Connection detailsの対応する項目を入力します。
    Snowflake Connection Details
    Connection details

各設定項目の詳細は以下から確認できます。

設定項目 内容
Username Snowflakeに接続するユーザー名。Snowflakeの全メタデータ読み取り権限が必要。
Password Snowflakeに接続するパスワード。
Account Snowflakeアカウント識別子。組織内外のSnowflakeアカウントを一意に識別。URLがhttps://xyz1234.us-east-1.gcp.snowflakecomputing.comの場合、アカウントはxyz1234.us-east-1.gcp
Role 取り込み対象のユーザーロールを指定可能。指定なしの場合、ユーザーのデフォルトロールが選択。
Database データソースのデータベース。メタデータ読み取りを単一DBに制限する場合に使用。空白の場合、全DBをスキャン。
Warehouse メタデータ取得クエリ実行用のSnowflakeウェアハウス名。
Query Tag Snowflake使用状況監視用のセッションクエリタグ。使用にはユーザーにセッション変更権限が必要。
Private Key キーペア認証設定時、ユーザー関連の秘密鍵が必要。キーペア認証の詳細はドキュメント参照。
Snowflake Passphrase Key 暗号化キーペア認証設定時、秘密鍵関連のパスフレーズが必要。キーペア認証の詳細はドキュメント参照。
Include Transient Tables Snowflakeの一時テーブル(TRANSIENTテーブル)は、デフォルトで取り込み対象外。フラグでTRANSIENTテーブルのみ抽出。テンポラリテーブル非対応。取り込むにはこの設定を有効化。
Client Session Keep Alive 長時間の取り込みジョブ実行時のセッションキープアライブオプション。
Connection Options 接続時のURL構築用の追加接続オプション。
Connection Arguments 接続時のセキュリティ/プロトコル設定などの追加接続引数。

注意すべきは、Account URLの設定です。
URLがhttps://xyz1234.us-east-1.gcp.snowflakecomputing.comの場合、
アカウントはxyz1234.us-east-1.gcpの部分となります。

設定が完了したら、Saveをクリックして設定を保存します。

データの取得

データベースの追加が完了したら、Snowflakeのメタデータを取得します。
前回同様、Ingestionsという機能を使います。

作成したDatabase Serviceを選択し、「Ingestions」タブから、
「Add New Ingestion」→ 「Add Metadata Ingestion」
を選択します。

次に、取り込むデータを設定します。
Add Metadata Ingestion
Ingestionの設定

上の例だと、

  • データベースSNOWFLAKE_SAMPLE_DATAを指定(それ以外は無視)
  • スキーマTPCDS_SF10TCLを指定(それ以外は無視)
  • テーブル空(指定無し)なので、全テーブルを取り込む

という風に、取り込むデータを指定できます。
このあたりの設定は、前回記事のフィルタリングで説明しているので、参考にしてください。

Nextをクリックして、Ingestions一覧の画面に遷移します。

メタデータ取り込み

TYPEが「metadata」の先ほど作成したIngestionを選択して、右の「Run」ボタンをクリックします。
RECENT RUNSが「Running」から「Success」に変われば、メタデータの取り込みが完了です。
Ingestions List
Ingestions一覧

エラーが発生した場合

OpenMetadataのIngestionのエラーメッセージや、Snowflakeのログを確認してください。以下のようなエラーの場合は、Snowflakeの権限が不足している可能性があります。
Snowflake Error Log
Snowflakeのエラーログ

SQLコンパイルエラー: Schema 「SNOWFLAKE.ACCOUNT_USAGE」は存在しないか、許可されていません。

Docには以下のように書かれているので、SnowflakeのユーザーにはACCOUNTADMINロールか、SNOWFLAKEデータベースに対してIMPORTED PRIVILEGESが付与されている必要があります。

For this the snowflake user should be granted the ACCOUNTADMIN role or a role granted IMPORTED PRIVILEGES on the database SNOWFLAKE

メタデータの確認

Exploreタブから、取り込んだテーブルのメタデータを確認できます。
OpenMetadata
OpenMetadataのExplore

リネージ

リネージタブから、テーブルのリレーションシップを確認できます。
OpenMetadata Lineage
OpenMetadataのLineage

データ品質のテスト

Profiler & Data Qualityタブから、データの品質テストを行うことができます。

以下のように、テストを追加します。今回はSNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.ITEMテーブルのI_CURRENT_PRICEカラムに対してテストを追加します。
Test Add
テストの追加

「Pipeline」タブからRunを押して実行することで即時テストが実行されます。
テストが完了すると、テスト結果が表示されます。
Test Result
テスト結果

今回、以下の2つのテストを追加して検証しました。

  1. I_CURRENT_PRICEが0以上か
  2. I_CURRENT_PRICEにnullがないか

結果は、Successが50%となり、I_CURRENT_PRICEは0以上ではあるものの、nullが含まれていることがわかりました。

実際に、SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.ITEMテーブルの中を確認すると、I_CURRENT_PRICEにnullが含まれていることがわかります。
Snowflake Table

このように、テスト項目を追加してデータの品質を監視することで、データの異常をいち早く検知することができます。
また、データの品質を一定に保つことで、アナリストやデータサイエンティストが信頼できるデータを使って分析を行うことができます。

まとめ

今回は、OSSのデータカタログであるOpenMetadataを使って、Snowflakeのメタデータ管理を行いました。OpenMetadataを使うことで、データエンジニアリングの効率化やデータの品質管理を行うことができます。

おわりに

Acompanyでは、我々と一緒にプライバシーテックの領域で世界を目指してくれるメンバーを募集しています。まずは、カジュアル面談でAcompanyという会社のことを知ってもらいたいです。
https://recruit.acompany.tech/#84ba9c895d464495a63fd437bac75431

また、弊社の他のブログは以下エンジニアブログハブから見られます!
https://engineering.acompany.tech/

Discussion