Aivenのメタデータ・パーサーを使用して、データの流れを理解しましょう。

<font color="Grey">*[Use Aiven's metadata parser to understand how your data flows](https://aiven.io/blog/metadata-parser)の翻訳です。*</font>

2022年8月4日

# データの流れを理解するためにAivenのメタデータ・パーサーを使おう

データ資産や関連技術の数が増えるにつれ、それらの関連性を把握することが難しくなっています。有用な洞察を与えてくれる新しいツールについて調べてみよう。

## Aivenのメタデータ・パーサーでデータ資産を管理しよう


現代企業におけるデータの旅は、通常、異なるテクノロジーにまたがるいくつかのステップを経て長く続きます。バックエンドのデータベースに格納されたソース・アプリケーションから、バッチまたはストリーミング・テクノロジーによる変換と配信を経て、データ資産はターゲット・システムに到着し、そこで意思決定プロセスで使用されたり、逆ETL（Extract Transform and Load）シナリオでアプリケーションにフィードバックされたりします。


この断片化されたシナリオの各ステップを追跡することは、面倒なプロセスであり、通常は文書化作業の一環として手作業で行われる。しかし、動きの速い部分が多いため、グローバルな視点が失われやすい。このような事態が発生した場合、企業にとっては、重複した取り組み、GDPR違反、セキュリティ問題などが発生する可能性がある。


誰がこのカラム／テーブル／オブジェクトを見ることができるのか」といった質問に対する回答は、人間が200ページ以上のドキュメントを閲覧するよりも、数秒／数分でクエリから得られるべきである。そのため、データ資産のジャーニーを共通のクエリ可能なフォーマットで収集することを可能な限り自動化する必要がある。


### メタデータの隠れた財産


データに関する情報を自動的に抽出するにはどうすればいいのか？この情報の多くは、実はメタデータの中にある！


PostgreSQL®を例にとると、`information_schema`のテーブルをスキャンすることでかなりのことができます。columns`、`pg_tables`、`pg_user`、`role_table_grants` をクエリすると、どのユーザがどのテーブルのどのカラムを見ることができるかの概要がわかります。pg_views`の `description` フィールドのスマートな解析を追加することで、さらに一歩進んで、データベース内で起こっているデータ変換を追跡することができます。


トピック記述、ACL、スキーマ定義、コネクタ設定に格納されたメタデータによって、データがどこから来てどこへ行くかのマップを作成することができる。また、Apache Flink®では、各データパイプラインのソースとターゲットを理解することができます。


#### 異なるテクノロジー、異なる言語


すべてのデータ・ジャーニーが単一のテクノロジーに留まるなら、問題は解決する！単一のカタログ・ビュー／テーブル上でメタデータを少し解析すれば、エンド・ツー・エンドのマップが完成する。しかし、上述したように、通常はそうではない。PostgreSQLの場合はテーブルとカラム、Apache Kafkaの場合はトピック、スキーマ、コネクター、OpenSearch®の場合は名前空間とインデックスです。


### 共通の抽象化：グラフ理論


したがって、異なる形状を持つメタデータを収集、結合、利用可能にするには、一歩下がってデータ資産の定義を抽象化する必要がある。そこで便利なのがグラフ理論で、各オブジェクトをノード、オブジェクト間のつながりをエッジとして定義することができる。


* データベース？ノードです。
* テーブル？ノード＋所属データベースへのエッジです。
* カラム？ノード＋所属するテーブルへのエッジです。
* ユーザー？ノード + そのノードが属するデータベースへのエッジ + そのノードがクエリー/ビュー/編集できるすべてのノードへのエッジです。
* Apache Kafkaソースコネクター？ノード＋すべてのデータソースに対するエッジ＋すべての宛先トピックに対するエッジである。


アセットをノード/エッジとして格納することで、トピックの保持時間やデータベース・ビューの SQL 定義のようなオブジェクト・プロパティーを使用して、各エンティティーにカスタム属性を追加できます。さらに、異なるテクノロジー間の点をつなぐことができます！例えば、Apache Flink®のジョブがデータを取得するPostgreSQLのテーブルと、変換されたアセットを格納するApache Kafkaのトピックをリンクすることができます。もしAvroと[Karapace schema registry](https://developer.aiven.io/docs/products/kafka/howto/enable-karapace.html)を使って真面目に作業すれば、完全なデータ系統のためにソースとターゲットのカラムをつなげることもできるだろう。


![PostgreSQLデータベースのテーブルとカラム、Kafka Connectコネクタ、Apache Kafka、Flinkに関する情報を格納するグラフの例](https://cdn.sanity.io/images/sczeoy4w/production/a70f2e672397cc99a1c21eae64ce039b6c0868ab-1129x568.jpg?q=80&fit=min&auto=format&dpr=1.5)


### 難しそう、どうやるの？メタデータパーサーへようこそ


RESTAPIのエンドポイントを呼び出したり、データベースのテーブルをクエリしたり、HTTPリクエストを送信して出力をマージしたりするために、たくさんのコードを書く必要があります。[Aivenのクライアント](https://github.com/aiven/aiven-client)上に構築されたオープンソースプロジェクトである[メタデータパーサー](https://github.com/aiven/metadata-parser)を使えば、Aivenプロジェクトに属するサービスを解析し、データ資産のネットワークマップを作成することができます。


#### メタデータ・パーサーを動作させる


メタデータ・パーサーをプロジェクト上で動作させるには、以下の前提条件が必要です：


* Python 3.7
* 有効なAivenアカウント
* 解析したいプロジェクトの名前


上記を集めたら、以下のステップを踏んでください：


1.メタデータパーサーリポジトリをクローンし、`metadata-parser`フォルダに移動する。



```
git clone https://github.com/aiven/metadata-parser.git
cd metadata-parser`クリップボードにコピーする
```
2.必要なライブラリをインストールします。



```
`pip install -r requirements.txt`クリップボードにコピーする。
```
3.conf` フォルダ内の `conf.env.sample` ファイルを `conf.env` にコピーする。[有効な認証トークン](https://developer.aiven.io/docs/platform/howto/create_authentication_token.html) と解析するプロジェクト名を `TOKEN` と `PROJECT` パラメータに追加する。
4.プロジェクトに実行中のサービスがない場合は、`scripts/create_services.sh <PROJECT_NAME>` スクリプトを使用して、テスト用の一時的なサービスを作成することができる（データ資産を正しく作成するには、`ksql`、`psql`、`mysql` などの追加ツールが必要）。


プロジェクトからメタデータを収集するために `main.py` ファイルを実行します。



```
`python main.py`クリップボードにコピーする
```

上のコマンドはプロジェクトを解析して作成します：


* インタラクティブ・グラフを含むファイル `nx.html`.


![Graph in action](https://cdn.sanity.io/images/sczeoy4w/production/10a1b01648e47cda0d90883379ce131f954d1954-794x749.jpg?q=80&fit=min&auto=format&dpr=1.5)
* [DOTフォーマット](https://graphviz.org/doc/info/lang.html)の情報を含む `graph_data.dot` ファイル。
* [GMLフォーマット](https://en.wikipedia.org/wiki/Geography_Markup_Language)の情報を含む `graph_data.gml` ファイル。


もし、一つのノードをフィルタリングし、全ての依存関係をチェックすることができるインタラクティブなビューを持ちたい場合は、以下を実行することができる：



```
`python app.py`クリップボードにコピーする
```

app.py` は前のステップで生成された `graph_data.gml` ファイルを読み込み、[Plotly](https://plot.ly/python/) と[Dash](https://plot.ly/dash/) を使って Reactive Web Application を作成し、グラフを分析したり、特定のノードの種類や名前をフィルタリングすることができます。フィルタをかけると、そのノードに接続されているサブグラフが表示される。Dash アプリは `http://127.0.0.1:8050/` からアクセスできる。


![ノードのカスタム・フィルタリングを可能にするDashアプリの動作](https://cdn.sanity.io/images/sczeoy4w/production/e56bf61f3f94a9aa54794f47bb026a8847b49b7b-1566x880.gif?q=80&fit=min&auto=format&dpr=1.5)


おめでとう！これで、さまざまなテクノロジーにまたがるデータ資産の完全なマップを、クエリ可能なグラフとして手に入れることができました！


ステップ4で作成したテストサービスを削除したい場合は、`scripts/delete_services.sh <PROJECT_NAME>` を実行してください。


### わぁ、使えるかな？


さて、質問について考えてみよう：


* この列はどこから来たのか？
* GDPRの評価 - 誰がこのデータを見ることができますか？データはどのように操作されるのか？
* セキュリティ監査 - どのユーザーがこのデータセットを編集できますか？
* 影響評価 - Xを削除したらどうなるか？


メタデータの解析といくつかのネットワーク・クエリによって生成されたグラフを使って、これらの質問に答えることができる。


メタデータ・パーサーは完全なオープンソース・プロジェクトであるため、コントリビューションを歓迎する！プロジェクトはまだ初期段階なので、より多くのツールをカバーしたり、既存のものをより深く掘り下げたり、解析や結果表示の別の方法を生み出したりすることができるだろう。


参考になると思われるリンク


* [グラフ理論](https://en.wikipedia.org/wiki/Graph_theory)：異なるエンティティがノード、属性、エッジとしてどのようにマッピングされるかを理解する。
* [Aiven Command Line Interface](https://github.com/aiven/aiven-client): Pythonで書かれたAiven CLIは、サービスを探索し、メタデータを取得するために使用されます。
* [Aiven API documentation](https://api.aiven.io/doc/): Aiven Command Line Interfaceで使用されるAPIのリストを確認します。
* [メタデータ・パーサー貢献ガイドライン](https://github.com/aiven/metadata-parser/blob/main/CONTRIBUTING.md): プロジェクトへの貢献方法を理解します。