OpenMetadataにPostgreSQL・PGSpiderのメタデータを取り込んでみた

[OpenMetadata](https://docs.open-metadata.org/)というデータベースなどのメタデータを管理するデータカタログツールを使ってみました。  
OpenMetadataの起動から、データソース（PostgreSQL&reg;あるいはPGSpider&trade;）のメタデータを取り込むまでの手順を紹介します。

今回、OpenMetadataとデータソースは同一ホストマシン上にあり、ホストマシンを経由したネットワークでOpenMetadataとデータソースを接続する（[host-gateway](https://docs.docker.com/build/release-notes/#bug-fixes-and-enhancements-1)を使いホストマシンのlocalhostに接続する）ための設定も説明します。  
PostgreSQL/PGSpiderの準備手順は省略します（[こちら](https://www.postgresql.jp/document/15/html/installation.html)が参考になります。PGSpiderの手順はPostgreSQLと同様です）。

![architecture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/ba6ae760-68e7-c09f-a5e8-42affbb35193.png)

なお、[PGSpider](https://github.com/pgspider/pgspider)とはPostgreSQL互換のインターフェースを持つデータ仮想化エンジンです。  

# バージョン情報
今回使用したツールのバージョンは以下のとおりです。

* OpenMetadata v1.3.1
* Docker 25.0.4
* PostgreSQL 16.2
* PGSpider 4.0.0

# OpenMetadataの起動
今回、DockerコンテナでOpenMetadataを立ち上げます。

立ち上げ方は簡単です。ymlファイルをダウンロードして、起動コマンドを実行するだけです。

## ymlファイルの入手
OpenMetadataが管理するメタデータを保存するシステムとして、MySQLかPostgreSQLを選べます。  
MySQLの場合は```docker-compose.yml```を、PostgreSQLの場合は```docker-compose-postgres.yml```を公式サイトからダウンロードします。

MySQLの場合：
```sh
wget https://github.com/open-metadata/OpenMetadata/releases/download/1.2.5-release/docker-compose.yml
```
PostgreSQLの場合：
```sh
wget https://github.com/open-metadata/OpenMetadata/releases/download/1.2.5-release/docker-compose-postgres.yml
```

## OpenMetadataから同一ホストマシンのネットワークに接続するための設定
以下の内容を docker-compose-openmetadata-override.yml としてymlファイルを新たに作成しておきます。  
OpenMetadataからホストマシンのネットワークを介してデータソースに接続するための設定です。  
OpenMetadataのサービスを提供するために複数のコンテナが立ち上がりますが、データソースにアクセスするのはingestionコンテナです。この設定を行うことで、OpenMetadataのingestionコンテナはhost.docker.internalという名前でホストマシンのlocalhostを使用できるようになります。  
なお、"host.docker.internal"の部分は任意の名前を指定できます。  

データソースのIPアドレスを指定して接続する場合は本ファイルは不要です。

```yml
version: "3.9"
services:
  ingestion:
    extra_hosts:
      - "host.docker.internal:host-gateway"
```

もし、メタデータを管理するデータベース（MySQLあるいはPostgreSQL）のポートを変更したい場合、以下を本ファイルに記載します。  
MySQLの場合：
```yml
services:
  mysql:
    ports:
    - "ポート番号:3306"
```
PostgreSQLの場合：
```yml
services:
  postgresql:
    ports:
    - "ポート番号:5432"
```

## 起動
次のコマンドを実行するだけで、OpenMetadataが立ち上がります。  
-fオプションで、オリジナルのymlファイルと追加設定用のymlファイルを指定します。

MySQLの場合：
```sh
docker compose -f docker-compose.yml -f docker-compose-openmetadata-override.yml up --detach
```
PostgreSQLの場合
```sh
docker compose -f docker-compose-postgres.yml -f docker-compose-openmetadata-override.yml up --detach
```

## 起動の確認
以下のように、4つのコンテナ（openmetadata_ingestion、openmetadata_server、openmetadata_postgresqlおよびopenmetadata_elasticsearch）が動いていればOKです。

```sh
$ docker ps -a
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED              STATUS                             PORTS                                                                                  NAMES
b4d9afa0d0c1   docker.getcollate.io/openmetadata/ingestion:1.3.1      "/bin/bash /opt/airf…"   45 seconds ago       Up 9 seconds                       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                              openmetadata_ingestion
3b545ded6987   docker.getcollate.io/openmetadata/server:1.3.1         "/bin/bash /openmeta…"   45 seconds ago       Up 10 seconds (health: starting)   0.0.0.0:8585-8586->8585-8586/tcp, :::8585-8586->8585-8586/tcp                          openmetadata_server
0ef6ed3d8c30   docker.getcollate.io/openmetadata/postgresql:1.3.1     "docker-entrypoint.s…"   About a minute ago   Up 45 seconds (healthy)            0.0.0.0:5432->5432/tcp, :::5432->5432/tcp                                              openmetadata_postgresql
184eb2fba67d   docker.elastic.co/elasticsearch/elasticsearch:8.10.2   "/bin/tini -- /usr/l…"   About a minute ago   Up 45 seconds (healthy)            0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   openmetadata_elasticsearch
...
```

# OpenMetadataとデータソースの連携
ブラウザで http://<ホストマシンのIP>:8585/ にアクセスします。  
すると、以下の画面が出るので、adminユーザ（初期パスワードはadmin）でログインします。

![login](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/96895ff3-9a57-c10e-1a0e-3520f4434226.png)


## サービスとしてデータソースを登録
1. サイドメニューの「設定」をクリック  
    ![settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/6d494501-7d58-4487-b839-9a1f86d07fcc.png)
1. 「サービス」→「データベース」→「PostgreSQL」の順にクリックし、「次へ」
    ![add_database](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/bd3344fd-248c-2023-5809-88570962d444.png)
1. サービス名に任意の名前を入力して「次へ」
1. データソースの情報を入力し、「Save」
    * Host And Portには、```host.docker.internal:データソースポート番号```を入力すればよいです。以下の図はPostgreSQLの場合の例です（PGSpiderの場合デフォルトのポートは4813です）。
    * OpenMetadataのメタダータ管理用にPostgreSQLが5432ポートで立ち上がっているため、今回はデータソースとしてのPostgreSQLは5433ポートを使用しました。

    ![service_settings2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/bdbe8938-ff5e-7bb2-75ea-c31f5430d625.png)

    * さらに、PGSpiderに接続する場合、「PostgresConnection Advanced Config」をクリックし、```pgspider+psycopg2```を選択する。
    ![pgspider](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/a577ddb4-5c32-4f43-8bcf-0bfe8cc2d1a2.png)

    * 「テスト 接続」をクリックすると、現在の設定情報で接続できるか確認が行えます。
    ![test_connection](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/dfae1e1a-8b1d-06c5-c536-2b904c7e51a8.png)


## メタデータの取り込み設定（インジェスチョン）
1. データソース登録後に出てきた画面の「インジェスチョンを追加」をクリック
    * あるいは「設定」→「サービス」→「データベース」→「先ほど登録したデータソース」→「インジェスチョン」タブ→「メタデータインジェスチョンを追加」をクリック
1. 「Name」に任意の名前を入力して「次へ」
    * ここで、取り込むメタデータの対象を設定することが可能。今回はデフォルト設定のまま進む。
1. 取り込みの周期を設定し、「追加＆デプロイ」 
    * 今回はデフォルトの毎時00分を設定しました。

## メタデータの閲覧
インジェスチョン処理がバックグラウンドで動作し、完了するとメタデータが閲覧できるようになります。
サイドバーの「探索」をクリックすると、以下の図のようにメタデータが取り込まれていることが分かると思います。
![metadata](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/d1554e11-9faa-beda-be07-b912e7ede689.png)

PGSpiderのメタデータを見てみると、仮想テーブルや外部テーブルのメタデータが取り込まれていることがわかります。

![pgspider_meta](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/7a61a3bf-d25b-e9f7-3fb5-86c9c8f724b2.png)

# おわりに
OpenMetadataの起動方法とメタデータを取り込むための設定手順を説明しました。  
PGSpiderからメタデータを取り込むには、デフォルトの設定から1箇所変更する必要があるため注意です（「PostgresConnection Advanced Config」という項目）。


# 参考文献
* OpenMetadata: https://docs.open-metadata.org/v1.3.x/quick-start/local-docker-deployment  
* PGSpider: https://github.com/pgspider/pgspider
 
---  
PGSpiderは(株)東芝の登録商標です。  
社名・商品名・サービス名などは、それぞれ各社が商標として使用している場合があります。​