データカタログエンジンのAmundsen使ってみた


この記事は[freeeデータに関わる人たち アドベントカレンダー](https://adventar.org/calendars/5461)の7日目です。

データカタログを探索・発見できるOSS 「Amundsen」を使ってみたので紹介したいと思います。

# データカタログとは
データカタログは広い意味がありますが、今回は、いわゆるビジネスデータカタログと呼ばれるものとして使います。簡単に言ってしまえば、ビジネス利用を目的とした企業内で保有するデータの辞書のようなものです。テーブルの定義だったりカラムの定義の説明などがまとまっています。


# Amundsenとは

https://github.com/amundsen-io/amundsen

> Amundsen is a data discovery and metadata engine for improving the productivity of data analysts, data scientists and engineers when interacting with data. 

Amundsenはデータに関わるデータアナリスト、データサイエンティスト、エンジニアの生産性を上げるデータ探索ができるメタデータエンジンです。Amundsenは[次の図](https://raw.githubusercontent.com/amundsen-io/amundsen/master/docs/img/Amundsen_Architecture.png)のようにマイクロサービス化されています。

<img width="400" alt="amundsen_architecture.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248757/3ab2b8d7-35d7-0c00-c8f8-be4f708e35fb.png">

Metadata Sources(データベースなど)からメタデータ（テーブルやスキーマ情報）を取得し、Neo4jとElasticsearchに入れます。その情報をもとにAmudsenの検索エンジンUI(Frontend Service)から情報を確認できます。


# ローカルでAmundsen 立ち上げる
dockerが用意されているので簡単にローカルで立ち上げることができます。
amundsenのgithubに[インストールのやり方](https://github.com/amundsen-io/amundsen/blob/master/docs/installation.md#installation)が丁寧に書いてあるのでそちらで確認してみてください

```
$ git clone --recursive git@github.com:amundsen-io/amundsen.git
$ cd (cloneしたamundsenのディレクトリ)
$ docker-compose -f docker-amundsen.yml up
```

# dataを抽出して、Amundsenに反映
データのスキーマ情報を取ってきてAmundsenに反映させるFramework(amundsenbuilder)が用意されているので、これを使ってデータベースから簡単にデータを取ってこれます。
builderに必要なパッケージをインストールします。

```
$ cd (amundsenbuilderのディレクトリ)
$ python3 -m venv venv
$ source venv/bin/activate  
$ pip3 install -r requirements.txt
$ python3 setup.py install
```

exampleのスクリプトが用意されているのでこれを実行します。
[sample_data_loader](https://github.com/amundsen-io/amundsendatabuilder/blob/master/example/scripts/sample_data_loader.py)ではサンプルのcsvファイルからデータをamundsenにロードします。

```
$ python3 example/scripts/sample_data_loader.py
```

glueからカタログを取ってくるスクリプトもあります（sample_glue_loader.py）。何も変更なしに実行するとglueにあるものを全部取ってきてしまうのでfilterで取ってくるglue data catalogのNameでfilterできるように変更します。
https://github.com/amundsen-io/amundsendatabuilder/blob/master/example/scripts/sample_glue_loader.py#L33

```python
def create_glue_extractor_job(filter_key: []):
   # ~~省略~~
   'extractor.glue.{}'.format(GlueExtractor.FILTER_KEY): filter_key,
   # ~~省略~~

if __name__ == "__main__":
    filter = [{
        'Key': 'Name',
        'Value': 'accounts',
    }] # glueのaccountsでfilter
    glue_job = create_glue_extractor_job(filter)
    glue_job.launch()

    es_job = create_es_publisher_job()
    es_job.launch()

```
filterの形式はKey, Valueのdict keyを持つobjectのリストを渡します。boto3の[search_tables](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue.html#Glue.Client.search_tables)を使っているので'Key'と'Value'は必須です。
実行する際にawsのglueにアクセスできるcredential(aws_access_key_id, aws_secret_access_key, tokenなど)を発行しておく必要があります。

```
$ python3 example/scripts/sample_glue_loader.py
```

処理が終わったらlocalhost:5000でamundsenにアクセスし、データカタログが入っていることを確認します。
（下の図は実際に取ってきたデータではなくAmundsenのgithubのものです。）

![search-page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248757/4c43a378-99a4-cd62-e589-912c724df8fa.png)



## 使ってみて良い点
- UIがシンプルで見やすい
- UI上でdescriptionの編集ができる
- データのextractがdatabuilder使うと便利
    - Athena, Bigquery, Glueなどの様々なデータソースから簡単に連携できる

## 残念な点・今後への期待
- tagが日本語対応してない
- descriptionの検索はできない
- 誰でもdescriptionの編集ができてしまう
    - Userごとに編集権限を変えるといったことができない
    - テーブル指定で編集できないように設定できる機能はあるがconfigにテーブルを一つずつ定義する必要がある

AmundsenはOSSで、見た感じ割と活発にcommitされているのでどんどん便利な機能が追加されていくと思います。

以上Amundsenについて紹介しました。