👏

datahubとSnowflakeのコラボレーション

2023/08/08に公開

Snowflakeとの接続設定を行う

datahubにログインし、以下図の画面右上部の赤枠の「Ingestion」をクリックします。

画面が遷移するので、下図赤枠の「Create new source」をクリックします。

ソースのタイプ選択で「snowflake」と入力し、検索結果に表示されたSnowflakeサービスをクリックします。

Snowflakeとの接続情報を入力する。
入力できたら画面右下の赤枠「Test Connection」をクリックし、Snowflakeとの接続確認を行う。

Snowflakeとの接続テスト結果、「Connection Succeeded」となればOK。

最後、画面右下の「Next」をクリックする。

Snowflakeからデータを取り込むスケジュールを設定するが、今回はスケジュール設定無しとします。なので、このまま「Next」をクリックします。

取り込みジョブ名を設定します。
仮で「My Snowflake source」とし、「Save & Run」をクリックし、保存と実行を行います。

おっと、失敗してしまいました。。。

エラーログを確認してみます
~~~~ Execution Summary - RUN_INGEST ~~~~
Execution finished with errors.
{'exec_id': 'd831bda8-a2db-46df-8e24-21411e587a3e',
 'infos': ['2023-08-07 12:03:23.817467 INFO: Starting execution for task with name=RUN_INGEST',
           "2023-08-07 12:03:34.009546 INFO: Failed to execute 'datahub ingest'",
           '2023-08-07 12:03:34.014150 INFO: Caught exception EXECUTING task_id=d831bda8-a2db-46df-8e24-21411e587a3e, name=RUN_INGEST, '
           'stacktrace=Traceback (most recent call last):\n'
           '  File "/usr/local/lib/python3.10/site-packages/acryl/executor/execution/default_executor.py", line 122, in execute_task\n'
           '    task_event_loop.run_until_complete(task_future)\n'
           '  File "/usr/local/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete\n'
           '    return future.result()\n'
           '  File "/usr/local/lib/python3.10/site-packages/acryl/executor/execution/sub_process_ingestion_task.py", line 231, in execute\n'
           '    raise TaskError("Failed to execute \'datahub ingest\'")\n'
           "acryl.executor.execution.task.TaskError: Failed to execute 'datahub ingest'\n"],
 'errors': []}

~~~~ Ingestion Logs ~~~~
Obtaining venv creation lock...
Acquired venv creation lock
venv doesn't exist.. minting..
Requirement already satisfied: pip in /tmp/datahub/ingest/venv-snowflake-@cliMajorVersion@/lib/python3.10/site-packages (23.0.1)
Collecting pip
  Using cached pip-23.2.1-py3-none-any.whl (2.1 MB)
Collecting wheel
  Using cached wheel-0.41.1-py3-none-any.whl (64 kB)
Requirement already satisfied: setuptools in /tmp/datahub/ingest/venv-snowflake-@cliMajorVersion@/lib/python3.10/site-packages (65.5.0)
Collecting setuptools
  Using cached setuptools-68.0.0-py3-none-any.whl (804 kB)
Installing collected packages: wheel, setuptools, pip
  Attempting uninstall: setuptools
    Found existing installation: setuptools 65.5.0
    Uninstalling setuptools-65.5.0:
      Successfully uninstalled setuptools-65.5.0
  Attempting uninstall: pip
    Found existing installation: pip 23.0.1
    Uninstalling pip-23.0.1:
      Successfully uninstalled pip-23.0.1
Successfully installed pip-23.2.1 setuptools-68.0.0 wheel-0.41.1
ERROR: Ignored the following versions that require a different python version: 0.8.24.1 Requires-Python >=3.6, <=3.9.9; 0.8.24.2 Requires-Python >=3.6, <=3.9.9; 0.8.24.3 Requires-Python >=3.6, <=3.9.9; 0.8.25 Requires-Python >=3.6, <=3.9.9; 0.8.25.0 Requires-Python >=3.6, <=3.9.9; 0.8.25.1 Requires-Python >=3.6, <=3.9.9; 0.8.25.2 Requires-Python >=3.6, <=3.9.9; 0.8.26.0 Requires-Python >=3.6, <=3.9.9; 0.8.26.1 Requires-Python >=3.6, <=3.9.9; 0.8.26.2 Requires-Python >=3.6, <=3.9.9; 0.8.26.3 Requires-Python >=3.6, <=3.9.9; 0.8.26.4 Requires-Python >=3.6, <=3.9.9; 0.8.26.5 Requires-Python >=3.6, <=3.9.9; 0.8.26.6 Requires-Python >=3.6, <=3.9.9; 0.8.26.7 Requires-Python >=3.6, <=3.9.9; 0.8.26.7rc1 Requires-Python >=3.6, <=3.9.9; 0.8.26.7rc2 Requires-Python >=3.6, <=3.9.9; 0.8.26.8 Requires-Python >=3.6, <=3.9.9; 0.8.26.8rc1 Requires-Python >=3.6, <=3.9.9; 0.8.27 Requires-Python >=3.6, <=3.9.9; 0.8.27.1 Requires-Python >=3.6, <=3.9.9; 0.8.27.1rc1 Requires-Python >=3.6, <=3.9.9; 0.8.27.2 Requires-Python >=3.6, <=3.9.9; 0.8.27.2rc1 Requires-Python >=3.6, <=3.9.9; 0.8.27.2rc2 Requires-Python >=3.6, <=3.9.9; 0.8.27.2rc3 Requires-Python >=3.6, <=3.9.9
ERROR: Could not find a version that satisfies the requirement acryl-datahub[datahub-kafka,datahub-rest,snowflake]==@cliMajorVersion@ (from versions: 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.2.0, 0.2.1, 0.2.2, 0.2.3, 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.3.4, 0.4.0, 0.8.1.0, 0.8.1.1, 0.8.1.2, 0.8.3.0, 0.8.3.1, 0.8.3.2, 0.8.3.3, 0.8.4.0, 0.8.5.0, 0.8.5.1, 0.8.5.2, 0.8.6.0, 0.8.6.1, 0.8.6.2, 0.8.6.3, 0.8.6.4, 0.8.6.5, 0.8.7.0, 0.8.8.0, 0.8.8.1, 0.8.8.2, 0.8.8.3, 0.8.8.4, 0.8.9.0, 0.8.10.0, 0.8.10.1, 0.8.10.2, 0.8.11.0, 0.8.11.1, 0.8.12.0, 0.8.13.0, 0.8.13.1, 0.8.14.0, 0.8.14.1, 0.8.14.2, 0.8.15.0, 0.8.15.1, 0.8.15.2, 0.8.15.3, 0.8.15.4, 0.8.15.5, 0.8.15.6, 0.8.15.7, 0.8.15.8, 0.8.15.9, 0.8.15.10, 0.8.16.0, 0.8.16.1, 0.8.16.2, 0.8.16.3, 0.8.16.4, 0.8.16.5, 0.8.16.6, 0.8.16.7, 0.8.16.8, 0.8.16.9, 0.8.16.11, 0.8.16.12, 0.8.17.0, 0.8.17.1, 0.8.17.2, 0.8.17.3, 0.8.17.4, 0.8.17.5, 0.8.17.6, 0.8.17.7, 0.8.18, 0.8.18.1, 0.8.19.0, 0.8.19.1, 0.8.20.0, 0.8.21.0, 0.8.22.1, 0.8.23.0, 0.8.23.1, 0.8.24.0, 0.8.28.0rc1, 0.8.28.0, 0.8.28.1, 0.8.29, 0.8.29.1, 0.8.29.2, 0.8.30.0, 0.8.31, 0.8.31.1rc1, 0.8.31.1, 0.8.31.2, 0.8.31.3rc1, 0.8.31.3, 0.8.31.4rc1, 0.8.31.4, 0.8.31.5rc1, 0.8.31.5, 0.8.31.6rc1, 0.8.31.6rc2, 0.8.31.6, 0.8.32rc1, 0.8.32rc2, 0.8.32rc3, 0.8.32rc4, 0.8.32, 0.8.32.1, 0.8.32.2rc1, 0.8.32.2, 0.8.32.3rc1, 0.8.32.3, 0.8.32.4rc1, 0.8.32.4rc2, 0.8.32.4, 0.8.32.5rc1, 0.8.32.5, 0.8.32.6rc2, 0.8.32.6rc3, 0.8.32.6, 0.8.32.7, 0.8.33rc1, 0.8.33, 0.8.33.1, 0.8.33.2rc1, 0.8.33.2rc2, 0.8.33.2, 0.8.33.3rc2, 0.8.33.3rc3, 0.8.33.3, 0.8.34, 0.8.34.1rc1, 0.8.34.1rc2, 0.8.34.1rc3, 0.8.34.1, 0.8.34.2rc1, 0.8.34.2rc2, 0.8.34.2rc3, 0.8.34.2rc4, 0.8.34.2, 0.8.34.3rc1, 0.8.35.0rc2, 0.8.35, 0.8.35.1rc1, 0.8.35.1, 0.8.35.2rc1, 0.8.35.2, 0.8.35.3rc1, 0.8.35.3, 0.8.35.4rc1, 0.8.35.4, 0.8.35.5rc1, 0.8.35.5, 0.8.35.6rc1, 0.8.35.6rc2, 0.8.35.6, 0.8.35.7rc1, 0.8.35.7, 0.8.35.8rc1, 0.8.35.8rc2, 0.8.35.8rc3, 0.8.36.0rc0, 0.8.36rc1, 0.8.36, 0.8.36.1rc1, 0.8.36.1rc2, 0.8.36.1rc6, 0.8.36.1rc7, 0.8.36.1rc8, 0.8.36.1rc9, 0.8.36.1rc10, 0.8.37rc0, 0.8.37, 0.8.38, 0.8.38.1rc0, 0.8.38.1rc1, 0.8.38.1, 0.8.38.2rc1, 0.8.38.2, 0.8.38.3rc1, 0.8.38.3, 0.8.38.4rc0, 0.8.38.4rc2, 0.8.38.4rc3, 0.8.38.4, 0.8.38.5rc0, 0.8.38.5, 0.8.39rc0, 0.8.39, 0.8.39.1rc1, 0.8.39.1rc2, 0.8.39.1rc3, 0.8.39.1rc4, 0.8.39.1rc5, 0.8.39.1rc6, 0.8.39.1rc7, 0.8.39.1rc8, 0.8.40rc1, 0.8.40, 0.8.40.1, 0.8.40.2rc0, 0.8.40.2, 0.8.40.3rc0, 0.8.40.3rc1, 0.8.40.3rc2, 0.8.40.3rc3, 0.8.40.3, 0.8.40.4rc1, 0.8.40.4rc2, 0.8.41rc2, 0.8.41, 0.8.41.1rc0, 0.8.41.1rc1, 0.8.41.1rc2, 0.8.41.1rc3, 0.8.41.1rc4, 0.8.41.1, 0.8.41.2rc0, 0.8.41.2rc1, 0.8.41.2, 0.8.41.3rc1, 0.8.41.3rc2, 0.8.41.3rc3, 0.8.42rc1, 0.8.42rc2, 0.8.42, 0.8.43rc2, 0.8.43rc3, 0.8.43rc4, 0.8.43, 0.8.43.1rc0, 0.8.43.1rc1, 0.8.43.1, 0.8.43.2rc0, 0.8.43.2rc1, 0.8.43.2, 0.8.43.3rc0, 0.8.43.3rc1, 0.8.43.3rc2, 0.8.43.3rc3, 0.8.43.3rc5, 0.8.43.3, 0.8.43.4rc1, 0.8.43.4rc2, 0.8.43.4, 0.8.43.5rc1, 0.8.43.5rc2, 0.8.43.5rc3, 0.8.43.5, 0.8.43.6rc0, 0.8.43.6rc1, 0.8.43.6, 0.8.44rc0, 0.8.44rc1, 0.8.44rc3, 0.8.44rc4, 0.8.44rc5, 0.8.44, 0.8.44.1rc0, 0.8.44.1rc1, 0.8.44.1rc2, 0.8.44.1rc3, 0.8.44.1rc4, 0.8.44.1, 0.8.44.2rc0, 0.8.44.2rc1, 0.8.44.2rc2, 0.8.44.2, 0.8.44.3rc0, 0.8.44.3rc1, 0.8.44.3rc2, 0.8.44.3rc3, 0.8.44.3rc4, 0.8.44.3, 0.8.44.4rc0, 0.8.44.4rc1, 0.8.44.4, 0.8.44.5rc0, 0.8.44.5rc1, 0.8.44.5rc2, 0.8.44.5rc3, 0.8.44.5, 0.8.44.6rc0, 0.8.45rc1, 0.8.45, 0.8.45.1rc0, 0.8.45.1rc2, 0.8.45.1rc3, 0.8.45.1rc4, 0.8.45.1rc5, 0.8.45.1, 0.8.45.2rc0, 0.8.45.2rc1, 0.8.45.2rc2, 0.8.45.2, 0.8.45.3rc0, 0.8.45.3rc1, 0.8.45.3rc2, 0.8.45.3rc3, 0.8.45.3rc4, 0.8.45.3rc5, 0.9.0rc4, 0.9.0rc5, 0.9.0rc6, 0.9.0, 0.9.0.1rc0, 0.9.0.1, 0.9.0.2rc0, 0.9.0.2rc1, 0.9.0.2rc2, 0.9.0.2rc3, 0.9.0.2rc4, 0.9.0.2, 0.9.0.3rc0, 0.9.0.3, 0.9.0.4rc0, 0.9.0.4, 0.9.0.5rc0, 0.9.0.5rc1, 0.9.0.5rc2, 0.9.0.5, 0.9.1rc0, 0.9.1, 0.9.1.1rc0, 0.9.1.1rc1, 0.9.1.1rc2, 0.9.2, 0.9.2.1rc0, 0.9.2.1rc1, 0.9.2.1rc2, 0.9.2.1, 0.9.2.2rc0, 0.9.2.2rc1, 0.9.2.2rc2, 0.9.2.2rc3, 0.9.2.2, 0.9.2.3rc1, 0.9.2.3rc2, 0.9.2.3rc3, 0.9.2.3rc4, 0.9.2.3, 0.9.2.4rc1, 0.9.2.4rc2, 0.9.2.4, 0.9.2.5rc1, 0.9.2.5rc3, 0.9.2.5rc4, 0.9.2.5rc5, 0. [...truncated]
ERROR: No matching distribution found for acryl-datahub[datahub-kafka,datahub-rest,snowflake]==@cliMajorVersion@

パッと見た感じ、パッケージの依存関係で怒られているっぽい。。。

依存関係の確認
pip3 check
acryl-datahub 0.10.5.5 has requirement avro<1.11,>=1.10.2, but you have avro 1.11.0.

とりあえずavroのバージョンを1.10.2にしてみます。

avroのアンインストール
pip3 uninstall avro
Found existing installation: avro 1.11.0
Uninstalling avro-1.11.0:
  Would remove:
    /Users/*******/Library/Python/3.9/bin/avro
    /Users/*******/Library/Python/3.9/lib/python/site-packages/avro-1.11.0.dist-info/*
    /Users/*******/Library/Python/3.9/lib/python/site-packages/avro/*
Proceed (Y/n)? Y
  Successfully uninstalled avro-1.11.0

バージョン指定でavroをインストールします。

pip3 install avro==1.10.2

再度、ジョブを実行します。
今度は無事成功しました。

さてさて、どのようなデータが取り込まれているのか??

ジョブを実行した結果どのようなデータを取得できたのか?

datahubのトップ画面に戻ってみます。
DatasetsやSnowflakeと表示されており、何かデータを見ることができそう??

とりあえず、検索バーでjaffle shopデータを持つ「demo_db」を検索してみます。

「CUSTOMERS」テーブルを見てみましょう。

参照できる項目としては、以下があります。

  • Schema
  • Documentation
  • Lineage
  • Properties
  • Queries
  • Stats
  • Validation(グレーアウト無効化状態)

それぞれ、どのような情報を参照できるのか見てみましょう。

Schema

SchemaタブのFieldカラムにはテーブルのカラム名があり、Description、Tags、Clossay Termsは設定がないため、空白です。

Documentation

Documentationタブには、設定が無いため、「No documentation yet」と表示されています。

試しに何かドキュメントを記載してみます。
「Add Documenttation」をクリックし、適当な文字を入力します。
その後、「Save」をクリックし保存します。

味気ないですが、ドキュメントを設定してみました。
マークダウンが使えそうなので、書き方の幅は広がりそうです。

Lineage

リネージタブをクリックし、「Visualize Lineage」をクリックします。

画面遷移し、CUSTOMERSだけ表示されました。
Show Full TitlesやShow Cloumnsを有効にすると、テーブルの正式名称やカラム情報が表示されます。
ここで気になるのが、downstreamが0なことです。
CUSTOMERSテーブルはRAW_CUSTOMERSテーブルが元になっているので、downstreamは表示されて欲しいのですが、されません。
ここは要確認です。
ちなみに、Lineageは手動で編集することもできます。

Properties

プロパティタブは何も表示されていません。何かを設定することもできなさそう?
これはどのような機能なのか?

公式ドキュメントを確認してみます。
https://datahubproject.io/docs/api/tutorials/custom-properties/

公式ドキュメントより抜粋
データセットのカスタムプロパティは、標準のメタデータフィールドではすぐに入手できないデータに関する追加情報を提供するのに役立ちます。
カスタムプロパティを使用すると、使用される測定単位、対象となる日付範囲、データが属する地理的地域など、データの特定の属性を記述することができます。
これは、大規模で複雑なデータセットを操作する場合に特に役立ちます。
追加のコンテキストは、データが正しく効果的に使用されていることを確認するのに役立ちます。

カスタムプロパティを設定することで、データの検索に役立つみたいですね。
設定方法はPython ,GraphQL,Python ,GraphQL,Java言語からスクリプトを書いて設定するようです。
今回は割愛します。

QueriesとStats

公式ドキュメントより抜粋
データセットの使用状況とクエリ履歴では、データセットを参照した上位のクエリに関するデータセットレベルの情報が得られます。

使用状況データは、データセットについて最もよく知っていると考えられる上位ユーザーと、このデータセットを参照する上位クエリを特定するのに役立ちます。
また、クエリと個別のユーザーの全体数の概要を取得することもできます。
一部のソースでは、列レベルの使用状況も計算され、頻繁に使用される列を特定するのに役立ちます。

使用状況統計をサポートするソースを使用すると、データセット、ダッシュボード、およびチャートの使用状況を収集できます。

このデータに対してクエリを実行した履歴がなさすぎて、表示されていないのか、取り込み権限がないのか、取り込み設定に問題があるのか、色々な原因は考えられそうですが、Queriesタブにデータが表示されませんでした。

ちなみにStatsタブは統計情報を表示してくれる機能でした。

まとめ

実際にSnowflakeとのデータ連携を試してみましたが、もう少し検証が必要と感じました。
その後にopenMetadataとの比較をしてみたいと思います。
あと、もう少し分かりやすいデータを用意しておきます。
datahubに連携しても見たいメタデータが無いと、意味がないので。。。

それからテスト機能について、datahubはクラウド版のみサポートしているようです。セルフホスト型は非サポートとのこと。。
https://datahubproject.io/docs/tests/metadata-tests

逆にリネージの影響分析機能はopenMetadataには無い?(もしかしたらあるかも。。。)ので、推しのポイントと感じました。
https://datahubproject.io/docs/act-on-metadata/impact-analysis

Discussion